source: proto/gml2svg/lib/C/gml2svg/util.cpp @ 1705

Last change on this file since 1705 was 1705, checked in by ksherdy, 8 years ago

Updated file permissions.

File size: 4.9 KB
Line 
1/*
2        gml2svg_util.c
3    Copyright (C) 2007, 2008 Ken Herdy
4    Version 0.9
5    Licensed to the general public under Academic Free License version 3.0
6*/
7#include "util.h"
8#include <string.h>
9#include <time.h>
10#include <stdlib.h>
11#include <stdio.h>
12#include <errno.h>
13#include <float.h>
14#include <linux/errno.h>
15#include <sys/types.h>
16#include <sys/stat.h>
17#include <iostream>
18
19extern int errno;
20
21char * layers_2_string(const char * layers [], int length)
22{
23        int total_length = 0;
24        int i;
25        for(i=0;i<length;i++)
26        {
27                total_length += strlen(layers[i]);
28        }
29
30        char * layers_string = new char[total_length + length + 1];
31
32        strcpy(layers_string,layers[0]);
33
34        for(i=1;i<length;i++)
35        {
36                strcat(layers_string,"\n");
37                strcat(layers_string,layers[i]);
38        }
39
40        strcat(layers_string,"\0");
41
42        return layers_string;
43}
44
45char * create_timestamp_filename()
46{
47        time_t now;
48        struct tm *local_date_time_ptr;
49
50        now = time(NULL);
51        local_date_time_ptr = localtime(&now);
52
53        int date_length = strlen("yyyy-mm-dd");
54        int time_length = strlen("hh-mm-ss");
55        int date_time_length = strlen("yyyy-mm-ddThh-mm-ss");
56
57        char * filename = new char [date_time_length + 1];
58        memset(filename,0,(date_time_length));
59
60    char * date = new char [date_length + 1];
61    memset(date,0,(date_length));
62
63        char * time = new char [time_length + 1];
64        memset(time,0,time_length);
65
66        strftime(date, (date_length+1), "%Y-%m-%d", local_date_time_ptr);
67    strftime(time, (time_length+1), "%H-%M-%S", local_date_time_ptr); // delim with '-' for FAT32 compatibility
68
69        strcpy(filename,date);
70    strcat(filename,"T");
71    strcat(filename,time);
72
73    delete [] date;
74    delete [] time;
75
76        return filename;
77}
78
79int scale_x_style_string_parameter(char * style_string, const char * css_parameter_name, const double scale_x, char ** scaled_style_string)
80{
81        int error_flag = 0;
82        int length = strlen(style_string) + DBL_DIG + 1 + DBL_MANT_DIG + 1;     //  + DBL_DIG + '.' + DBL_MANT_DIG
83                                                                                                                                                //  + 1 '\0'
84
85        *scaled_style_string = new char [length];
86        if(scaled_style_string == NULL)
87        {
88                fprintf(stderr, "function: scale_x_style_string_parameter, out of memory");
89                return ENOMEM;
90        }
91
92        memset(*scaled_style_string,'\0',length);
93
94        char * style_string_dup = strdup(style_string);
95
96        char * name;
97        char * value;
98
99        name = strtok(style_string, ";:");
100        value = strtok(NULL, ";:");
101
102        if(name == NULL || value == NULL)
103        {
104                strcpy(*scaled_style_string,style_string);
105                return 0;
106        }
107
108        if(name != NULL && value == NULL)
109        {
110                fprintf(stderr, "function: scale_x_style_string_parameter, invalid style string %s.",style_string_dup);
111                return EINVAL;
112        }
113
114        while(name != NULL && value != NULL)
115        {
116                strcat(*scaled_style_string,name);
117                strcat(*scaled_style_string,":");
118
119                if(strcmp(css_parameter_name,name)==0)
120                {
121                        // scale x
122                        double scaled_param_value;
123                        error_flag = strtod_wrapper(value, &scaled_param_value);
124                        scaled_param_value = scaled_param_value / scale_x;
125
126                        char * scaled_param_value_string = new char [DBL_DIG + 1 + DBL_MANT_DIG +1];
127                        sprintf(scaled_param_value_string,"%.15f", scaled_param_value);
128                        strcat(*scaled_style_string,scaled_param_value_string);
129                        strcat(*scaled_style_string,";");
130                        delete [] scaled_param_value_string;
131                }
132                else
133                {
134                        strcat(*scaled_style_string,value);
135                        strcat(*scaled_style_string,";");
136                }
137
138                name = strtok(NULL, ";:");
139                value = strtok(NULL, ";:");
140
141                if(name != NULL && value == NULL)
142                {
143                        fprintf(stderr, "function: scale_x_style_string_parameter, invalid style string %s.",style_string_dup);
144                        return EINVAL;
145                }
146        }
147
148        free(style_string_dup);
149
150        return error_flag;
151}
152
153int strtod_wrapper(char * in, double * out)
154{
155        errno = 0;
156
157        double result;
158        char * str_ptr;
159        char * end_ptr;
160
161        str_ptr = in;
162        result = strtod(str_ptr, &end_ptr);
163
164        if(str_ptr==end_ptr && 0 == result)     // no conversion
165        {
166                fprintf(stderr,"function: strtod_wrapper, err_code: %i, err_msg: %s, arg: %s\n", EINVAL, strerror(EINVAL), str_ptr);
167                return EINVAL;
168        }
169
170        if(0 != errno)                                              // underflow, overflow or invalid conversion
171        {
172                fprintf(stderr,"function: strtod_wrapper, err_code: %i, err_msg: %s, arg: %s\n", errno, strerror(errno), str_ptr);
173                return errno;
174        }
175
176        *out = result;
177
178        return 0;
179}
180
181int file_to_char_array(const char * file_name, char ** char_ary, unsigned long long * char_ary_size)
182{
183        struct stat file_struct;
184        FILE * file_handle = fopen(file_name, "rb");
185
186        if(file_handle == NULL) {
187                fprintf(stderr, "Cannot open '%s'. Terminating the process ...\n", file_name);
188                *char_ary = NULL;
189                *char_ary_size = 0ull;
190                return EINVAL;
191        }
192
193        if(fstat(fileno(file_handle), &file_struct)!=0) {
194                fprintf(stderr, "Cannot fstat '%s'. Terminating the process ...\n", file_name);
195                *char_ary = NULL;
196                *char_ary_size = 0ull;
197                return EINVAL;
198        }
199
200        size_t num_bytes = file_struct.st_size;
201
202        try {
203                *char_ary = new char[num_bytes];
204        } catch(std::bad_alloc) {
205                fprintf(stderr, "Out of Memory. Terminating the process ...\n"); exit(-1);
206        }
207
208        int bytes = fread(*char_ary, sizeof(char), num_bytes, file_handle);
209        *char_ary_size = bytes;
210
211        fclose(file_handle);
212}
213
214
Note: See TracBrowser for help on using the repository browser.