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

Last change on this file since 2475 was 2475, checked in by ksherdy, 7 years ago

Updated to SOA representation.

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