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