00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "cr-num.h"
00034 #include "string.h"
00035
00036
00037
00038
00039
00040
00041
00042
00043 CRNum *
00044 cr_num_new (void)
00045 {
00046 CRNum * result = NULL ;
00047
00048 result = g_try_malloc (sizeof (CRNum)) ;
00049
00050 if (result == NULL)
00051 {
00052 cr_utils_trace_info ("Out of memory") ;
00053 return NULL ;
00054 }
00055
00056 memset (result, 0, sizeof (CRNum)) ;
00057
00058 return result ;
00059 }
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074 CRNum *
00075 cr_num_new_with_val (gdouble a_val,
00076 enum CRNumType a_type)
00077 {
00078 CRNum * result = NULL ;
00079
00080 result = cr_num_new () ;
00081
00082 g_return_val_if_fail (result, NULL) ;
00083
00084 result->val = a_val ;
00085 result->type = a_type ;
00086
00087 return result ;
00088 }
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099 guchar *
00100 cr_num_to_string (CRNum *a_this)
00101 {
00102 gdouble test_val = 0.0 ;
00103
00104 guchar *tmp_char1 = NULL, * tmp_char2 = NULL, *result = NULL ;
00105
00106 g_return_val_if_fail (a_this, NULL) ;
00107
00108 test_val = a_this->val - (glong) a_this->val ;
00109
00110 if (!test_val)
00111 {
00112 tmp_char1 = g_strdup_printf ("%ld", (glong)a_this->val) ;
00113 }
00114 else
00115 {
00116 tmp_char1 = g_strdup_printf ("%.3f", a_this->val) ;
00117 }
00118
00119 g_return_val_if_fail (tmp_char1, NULL) ;
00120
00121 switch (a_this->type)
00122 {
00123 case NUM_LENGTH_EM:
00124 tmp_char2 = (guchar*) "em";
00125 break ;
00126
00127 case NUM_LENGTH_EX:
00128 tmp_char2 = (guchar*) "ex";
00129 break ;
00130
00131 case NUM_LENGTH_PX:
00132 tmp_char2 = (guchar*) "px";
00133 break ;
00134
00135 case NUM_LENGTH_IN:
00136 tmp_char2 = (guchar*) "in";
00137 break ;
00138
00139 case NUM_LENGTH_CM:
00140 tmp_char2 = (guchar*) "cm";
00141 break ;
00142
00143 case NUM_LENGTH_MM:
00144 tmp_char2 = (guchar*) "mm";
00145 break ;
00146
00147 case NUM_LENGTH_PT:
00148 tmp_char2 = (guchar*) "pt";
00149 break ;
00150
00151 case NUM_LENGTH_PC:
00152 tmp_char2 = (guchar*) "pc";
00153 break ;
00154
00155 case NUM_ANGLE_DEG:
00156 tmp_char2 = (guchar*) "deg";
00157 break ;
00158
00159 case NUM_ANGLE_RAD:
00160 tmp_char2 = (guchar*) "rad";
00161 break ;
00162
00163 case NUM_ANGLE_GRAD:
00164 tmp_char2 = (guchar*) "grad";
00165 break ;
00166
00167 case NUM_TIME_MS:
00168 tmp_char2 = (guchar*) "ms";
00169 break ;
00170
00171 case NUM_TIME_S:
00172 tmp_char2 = (guchar*) "s";
00173 break ;
00174
00175 case NUM_FREQ_HZ:
00176 tmp_char2 = (guchar*) "Hz";
00177 break ;
00178
00179 case NUM_FREQ_KHZ:
00180 tmp_char2 = (guchar*) "KHz";
00181 break ;
00182
00183 case NUM_PERCENTAGE:
00184 tmp_char2 = (guchar*) "%";
00185 break ;
00186
00187 default:
00188 break ;
00189 }
00190
00191 if (tmp_char2)
00192 {
00193 result = g_strconcat (tmp_char1, tmp_char2, NULL) ;
00194 g_free (tmp_char1) ;
00195 }
00196 else
00197 {
00198 result = tmp_char1 ;
00199 }
00200
00201 return result ;
00202 }
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213 enum CRStatus
00214 cr_num_copy (CRNum *a_dest, CRNum *a_src)
00215 {
00216 g_return_val_if_fail (a_dest && a_src,
00217 CR_BAD_PARAM_ERROR) ;
00218
00219 memcpy (a_dest, a_src, sizeof (CRNum)) ;
00220
00221 return CR_OK ;
00222 }
00223
00224
00225
00226
00227
00228
00229
00230
00231 CRNum *
00232 cr_num_dup (CRNum *a_this)
00233 {
00234 CRNum *result = NULL ;
00235 enum CRStatus status = CR_OK ;
00236
00237 g_return_val_if_fail (a_this, NULL) ;
00238
00239 result = cr_num_new () ;
00240 g_return_val_if_fail (result, NULL) ;
00241
00242 status = cr_num_copy (result, a_this) ;
00243 g_return_val_if_fail (status == CR_OK, NULL) ;
00244
00245 return result ;
00246 }
00247
00248
00249
00250
00251
00252
00253
00254
00255 enum CRStatus
00256 cr_num_set (CRNum *a_this, gdouble a_val, enum CRNumType a_type)
00257 {
00258 g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ;
00259
00260 a_this->val= a_val ;
00261 a_this->type = a_type ;
00262
00263 return CR_OK ;
00264 }
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274 gboolean
00275 cr_num_is_fixed_length (CRNum *a_this)
00276 {
00277 gboolean result = FALSE ;
00278
00279 g_return_val_if_fail (a_this, FALSE) ;
00280
00281 switch (a_this->type)
00282 {
00283 case NUM_LENGTH_EM ... NUM_LENGTH_PC:
00284 result = TRUE ;
00285 break ;
00286 default:
00287 result = FALSE ;
00288 break ;
00289 }
00290
00291 return result ;
00292 }
00293
00294
00295
00296
00297
00298
00299 void
00300 cr_num_destroy (CRNum *a_this)
00301 {
00302 g_return_if_fail (a_this) ;
00303
00304 g_free (a_this) ;
00305 }