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