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 #include "eyedb_p.h"
00026
00027 namespace eyedb {
00028
00029 void
00030 decode_atom_array(rpc_ClientData *data, void *_atom_array,
00031 int count)
00032 {
00033 IteratorAtom *atom_array = (IteratorAtom *)_atom_array;
00034 Offset offset = 0;
00035 Data idr = (Data)data->data;
00036
00037 IteratorAtom *p = atom_array;
00038
00039 for (int c = 0; c < count; c++, p++)
00040 p->decode(idr, &offset);
00041
00042 free(idr);
00043 }
00044
00045 void
00046 IteratorAtom::code(Data *idr, Offset *offset, Size *alloc_size)
00047 {
00048 eyedblib::int16 t = (eyedblib::int16)type;
00049 int16_code(idr, offset, alloc_size, &t);
00050
00051 switch(type)
00052 {
00053 case IteratorAtom_INT16:
00054 int16_code(idr, offset, alloc_size, &i16);
00055 break;
00056
00057 case IteratorAtom_INT32:
00058 int32_code(idr, offset, alloc_size, &i32);
00059 break;
00060
00061 case IteratorAtom_INT64:
00062 int64_code(idr, offset, alloc_size, &i64);
00063 break;
00064
00065 case IteratorAtom_CHAR:
00066 char_code(idr, offset, alloc_size, &c);
00067 break;
00068
00069 case IteratorAtom_DOUBLE:
00070 double_code(idr, offset, alloc_size, &d);
00071 break;
00072
00073 case IteratorAtom_STRING:
00074 string_code(idr, offset, alloc_size, str);
00075 break;
00076
00077 case IteratorAtom_OID:
00078 oid_code(idr, offset, alloc_size, &oid);
00079 break;
00080
00081 case IteratorAtom_IDR:
00082 {
00083 eyedblib::int32 size = (eyedblib::int32)data.size;
00084 int32_code(idr, offset, alloc_size, &size);
00085 buffer_code(idr, offset, alloc_size, data.idr, data.size);
00086 break;
00087 }
00088
00089 #ifndef NEW_ITER_ATOM
00090 case IteratorAtom_BOOL:
00091 {
00092 char tc = (char)b;
00093 char_code(idr, offset, alloc_size, &tc);
00094 break;
00095 }
00096
00097 case IteratorAtom_IDENT:
00098 string_code(idr, offset, alloc_size, ident);
00099 break;
00100
00101 case IteratorAtom_LISTSEP:
00102 {
00103 char cc = (char)open;
00104 char_code(idr, offset, alloc_size, &cc);
00105 }
00106 break;
00107 #endif
00108
00109 default:
00110 assert(0);
00111 break;
00112 }
00113 }
00114
00115 void
00116 IteratorAtom::decode(Data idr, Offset *offset)
00117 {
00118 memset(this, 0, sizeof(IteratorAtom));
00119 eyedblib::int16 t;
00120 int16_decode(idr, offset, &t);
00121 type = (IteratorAtomType)t;
00122
00123 switch(type)
00124 {
00125 case IteratorAtom_INT16:
00126 int16_decode(idr, offset, &i16);
00127 break;
00128
00129 case IteratorAtom_INT32:
00130 int32_decode(idr, offset, &i32);
00131 break;
00132
00133 case IteratorAtom_INT64:
00134 int64_decode(idr, offset, &i64);
00135 break;
00136
00137 case IteratorAtom_CHAR:
00138 char_decode(idr, offset, &c);
00139 break;
00140
00141 case IteratorAtom_DOUBLE:
00142 double_decode(idr, offset, &d);
00143 break;
00144
00145 case IteratorAtom_OID:
00146 oid_decode(idr, offset, &oid);;
00147 break;
00148
00149 case IteratorAtom_STRING:
00150 {
00151 char *ts;
00152 string_decode(idr, offset, &ts);
00153 str = strdup(ts);
00154 }
00155 break;
00156
00157 case IteratorAtom_IDR:
00158 {
00159 eyedblib::int32 size;
00160 int32_decode(idr, offset, &size);
00161 data.size = size;
00162 data.idr = (unsigned char *)malloc(data.size);
00163 buffer_decode(idr, offset, data.idr, data.size);
00164 }
00165 break;
00166
00167 #ifndef NEW_ITER_ATOM
00168 case IteratorAtom_BOOL:
00169 {
00170 char tc;
00171 char_decode(idr, offset, &tc);
00172 b = (Bool)tc;
00173 break;
00174 }
00175
00176 case IteratorAtom_IDENT:
00177 {
00178 char *ts;
00179 string_decode(idr, offset, &ts);
00180 ident = strdup(ts);
00181 }
00182 break;
00183
00184 case IteratorAtom_LISTSEP:
00185 {
00186 char cc;
00187 char_decode(idr, offset, &cc);
00188 open = (Bool)cc;
00189 }
00190 break;
00191 #endif
00192
00193 default:
00194 assert(0);
00195 break;
00196 }
00197 }
00198
00199 IteratorAtom::IteratorAtom()
00200 {
00201 memset(this, 0, sizeof(IteratorAtom));
00202 }
00203
00204 IteratorAtom::IteratorAtom(const IteratorAtom &atom)
00205 {
00206 *this = atom;
00207 }
00208
00209 void IteratorAtom::print(FILE *fd)
00210 {
00211 fprintf(fd, "%s", getString());
00212
00213 }
00214
00215 char *IteratorAtom::getString()
00216 {
00217 if (fmt_str)
00218 return fmt_str;
00219
00220 switch(type)
00221 {
00222 case IteratorAtom_INT16:
00223 {
00224 char tok[16];
00225 sprintf(tok, "%d", i16);
00226 fmt_str = strdup(tok);
00227 break;
00228 }
00229
00230 case IteratorAtom_INT32:
00231 {
00232 char tok[16];
00233 sprintf(tok, "%ld", i32);
00234 fmt_str = strdup(tok);
00235 break;
00236 }
00237
00238 case IteratorAtom_INT64:
00239 {
00240 char tok[16];
00241 sprintf(tok, "%lld", i64);
00242 fmt_str = strdup(tok);
00243 break;
00244 }
00245
00246 case IteratorAtom_CHAR:
00247 {
00248 char tok[8];
00249 sprintf(tok, "'%c'", c);
00250 fmt_str = strdup(tok);
00251 break;
00252 }
00253
00254 case IteratorAtom_DOUBLE:
00255 {
00256 char tok[16];
00257 sprintf(tok, "%f", d);
00258 fmt_str = strdup(tok);
00259 break;
00260 }
00261
00262 case IteratorAtom_STRING:
00263 {
00264 char *tok = (char *)malloc(strlen(str)+3);
00265 sprintf(tok, "\"%s\"", str);
00266 fmt_str = tok;
00267 break;
00268 }
00269
00270 case IteratorAtom_OID:
00271 fmt_str = strdup(OidGetString(&oid));
00272 break;
00273
00274 case IteratorAtom_IDR:
00275 {
00276 char tok[64];
00277 sprintf(tok, "buffer 0x%x, size %d", data.idr, data.size);
00278 fmt_str = strdup(tok);
00279 break;
00280 }
00281
00282 #ifndef NEW_ITER_ATOM
00283 case IteratorAtom_NULL:
00284 fmt_str = strdup(NullString);
00285 break;
00286
00287 case IteratorAtom_NIL:
00288 fmt_str = strdup(NilString);
00289 break;
00290
00291 case IteratorAtom_BOOL:
00292 fmt_str = (b ? strdup("true") : strdup("false"));
00293 break;
00294
00295 case IteratorAtom_IDENT:
00296 fmt_str = strdup(ident);
00297 break;
00298
00299 case IteratorAtom_LISTSEP:
00300 fmt_str = strdup(open ? "(" : ")");
00301 break;
00302 #endif
00303
00304 default:
00305 assert(0);
00306 return 0;
00307 }
00308
00309 return fmt_str;
00310 }
00311
00312 int IteratorAtom::getSize() const
00313 {
00314 switch(type)
00315 {
00316 case IteratorAtom_INT16:
00317 return sizeof(eyedblib::int16);
00318
00319 case IteratorAtom_INT32:
00320 return sizeof(eyedblib::int32);
00321
00322 case IteratorAtom_INT64:
00323 return sizeof(eyedblib::int64);
00324
00325 case IteratorAtom_CHAR:
00326 return sizeof(char);
00327
00328 case IteratorAtom_DOUBLE:
00329 return sizeof(double);
00330
00331 case IteratorAtom_STRING:
00332 return sizeof(eyedblib::int32) + strlen(str) + 1;
00333
00334 case IteratorAtom_OID:
00335 return sizeof(Oid);
00336
00337 case IteratorAtom_IDR:
00338 return sizeof(eyedblib::int32) + data.size;
00339
00340 #ifndef NEW_ITER_ATOM
00341 case IteratorAtom_NULL:
00342 return 0;
00343
00344 case IteratorAtom_NIL:
00345 return 0;
00346
00347 case IteratorAtom_BOOL:
00348 return sizeof(char);
00349
00350 case IteratorAtom_IDENT:
00351 return sizeof(eyedblib::int32) + strlen(ident) + 1;
00352
00353 case IteratorAtom_LISTSEP:
00354 return sizeof(char);
00355 #endif
00356 case 0:
00357 return 0;
00358
00359 default:
00360 assert(0);
00361 return 0;
00362 }
00363 }
00364
00365 IteratorAtom & IteratorAtom::operator =(const IteratorAtom &atom)
00366 {
00367 garbage();
00368
00369 memcpy(this, &atom, sizeof(IteratorAtom));
00370
00371 fmt_str = 0;
00372
00373 if (type == IteratorAtom_STRING)
00374 str = strdup(atom.str);
00375 #ifndef NEW_ITER_ATOM
00376 else if (type == IteratorAtom_IDENT)
00377 ident = strdup(atom.ident);
00378 #endif
00379 else if (type == IteratorAtom_IDR) {
00380 data.size = atom.data.size;
00381 data.idr = (unsigned char *)malloc(data.size);
00382 memcpy(data.idr, atom.data.idr, data.size);
00383 }
00384
00385 return *this;
00386 }
00387
00388 Value *
00389 IteratorAtom::toValue() const
00390 {
00391 Value *value = NULL;
00392
00393 switch(type)
00394 {
00395 case IteratorAtom_INT16:
00396 value = new Value(i16);
00397 break;
00398
00399 case IteratorAtom_INT32:
00400 value = new Value(i32);
00401 break;
00402
00403 case IteratorAtom_INT64:
00404 value = new Value(i64);
00405 break;
00406
00407 case IteratorAtom_CHAR:
00408 value = new Value(c);
00409 break;
00410
00411 case IteratorAtom_DOUBLE:
00412 value = new Value(d);
00413 break;
00414
00415 case IteratorAtom_STRING:
00416 value = new Value(str);
00417 break;
00418
00419 case IteratorAtom_OID:
00420 value = new Value(oid);
00421 break;
00422
00423 case IteratorAtom_IDR:
00424 {
00425
00426 Data idr = (unsigned char *)malloc(data.size);
00427 memcpy(idr, data.idr, data.size);
00428 value = new Value(idr, data.size);
00429 }
00430 break;
00431
00432 #ifndef NEW_ITER_ATOM
00433 case IteratorAtom_NULL:
00434 value = new Value(True, True);
00435 break;
00436
00437 case IteratorAtom_NIL:
00438 value = new Value();
00439 break;
00440
00441 case IteratorAtom_BOOL:
00442 value = new Value(b);
00443 break;
00444
00445 case IteratorAtom_IDENT:
00446 value = new Value(str, True);
00447 break;
00448
00449 case IteratorAtom_LISTSEP:
00450 break;
00451 #endif
00452
00453 default:
00454 assert(0);
00455 break;
00456 }
00457
00458 return value;
00459 }
00460
00461 void IteratorAtom::garbage()
00462 {
00463 free(fmt_str);
00464 if (type == IteratorAtom_STRING)
00465 free(str);
00466 #ifndef NEW_ITER_ATOM
00467 else if (type == IteratorAtom_IDENT)
00468 free(ident);
00469 #endif
00470 else if (type == IteratorAtom_IDR)
00471 free(data.idr);
00472
00473 fmt_str = 0;
00474 type = (IteratorAtomType)0;
00475 }
00476
00477 IteratorAtom::~IteratorAtom()
00478 {
00479 garbage();
00480 }
00481 }