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