271
272 #define INDEX_INIT(tag, nullOK, subindex) \
273 ((tag) + (subindex)*SUBINDEX_BIT + (nullOK)*256)
274
275 #define INDEX(tag) INDEX_INIT(tag, 0, 0)
276 #define NULL_OR_INDEX(tag) INDEX_INIT(tag, 1, 0)
277 #define SUB_INDEX(tag) INDEX_INIT(tag, 0, 1)
278 #define NO_INDEX 0
279
280 struct band_init {
281 int bn;
282 const char* name;
283 int defc;
284 int index;
285 };
286
287 #define BAND_INIT(name, cspec, ix) \
288 { e_##name, #name, /*debug only*/ \
289 cspec, ix }
290
291 const band_init all_band_inits[] = {
292 //BAND_INIT(archive_magic, BYTE1_spec, 0),
293 //BAND_INIT(archive_header, UNSIGNED5_spec, 0),
294 //BAND_INIT(band_headers, BYTE1_spec, 0),
295 BAND_INIT(cp_Utf8_prefix, DELTA5_spec, 0),
296 BAND_INIT(cp_Utf8_suffix, UNSIGNED5_spec, 0),
297 BAND_INIT(cp_Utf8_chars, CHAR3_spec, 0),
298 BAND_INIT(cp_Utf8_big_suffix, DELTA5_spec, 0),
299 BAND_INIT(cp_Utf8_big_chars, DELTA5_spec, 0),
300 BAND_INIT(cp_Int, UDELTA5_spec, 0),
301 BAND_INIT(cp_Float, UDELTA5_spec, 0),
302 BAND_INIT(cp_Long_hi, UDELTA5_spec, 0),
303 BAND_INIT(cp_Long_lo, DELTA5_spec, 0),
304 BAND_INIT(cp_Double_hi, UDELTA5_spec, 0),
305 BAND_INIT(cp_Double_lo, DELTA5_spec, 0),
306 BAND_INIT(cp_String, UDELTA5_spec, INDEX(CONSTANT_Utf8)),
307 BAND_INIT(cp_Class, UDELTA5_spec, INDEX(CONSTANT_Utf8)),
308 BAND_INIT(cp_Signature_form, DELTA5_spec, INDEX(CONSTANT_Utf8)),
309 BAND_INIT(cp_Signature_classes, UDELTA5_spec, INDEX(CONSTANT_Class)),
310 BAND_INIT(cp_Descr_name, DELTA5_spec, INDEX(CONSTANT_Utf8)),
311 BAND_INIT(cp_Descr_type, UDELTA5_spec, INDEX(CONSTANT_Signature)),
431 BAND_INIT(bc_classref, UNSIGNED5_spec, NULL_OR_INDEX(CONSTANT_Class)),
432 BAND_INIT(bc_fieldref, DELTA5_spec, INDEX(CONSTANT_Fieldref)),
433 BAND_INIT(bc_methodref, UNSIGNED5_spec, INDEX(CONSTANT_Methodref)),
434 BAND_INIT(bc_imethodref, DELTA5_spec, INDEX(CONSTANT_InterfaceMethodref)),
435 BAND_INIT(bc_indyref, DELTA5_spec, INDEX(CONSTANT_InvokeDynamic)),
436 BAND_INIT(bc_thisfield, UNSIGNED5_spec, SUB_INDEX(CONSTANT_Fieldref)),
437 BAND_INIT(bc_superfield, UNSIGNED5_spec, SUB_INDEX(CONSTANT_Fieldref)),
438 BAND_INIT(bc_thismethod, UNSIGNED5_spec, SUB_INDEX(CONSTANT_Methodref)),
439 BAND_INIT(bc_supermethod, UNSIGNED5_spec, SUB_INDEX(CONSTANT_Methodref)),
440 BAND_INIT(bc_initref, UNSIGNED5_spec, SUB_INDEX(CONSTANT_Methodref)),
441 BAND_INIT(bc_escref, UNSIGNED5_spec, INDEX(CONSTANT_All)),
442 BAND_INIT(bc_escrefsize, UNSIGNED5_spec, 0),
443 BAND_INIT(bc_escsize, UNSIGNED5_spec, 0),
444 BAND_INIT(bc_escbyte, BYTE1_spec, 0),
445 BAND_INIT(file_name, UNSIGNED5_spec, INDEX(CONSTANT_Utf8)),
446 BAND_INIT(file_size_hi, UNSIGNED5_spec, 0),
447 BAND_INIT(file_size_lo, UNSIGNED5_spec, 0),
448 BAND_INIT(file_modtime, DELTA5_spec, 0),
449 BAND_INIT(file_options, UNSIGNED5_spec, 0),
450 //BAND_INIT(file_bits, BYTE1_spec, 0),
451 #ifndef PRODUCT
452 { 0, 0, 0, 0 }
453 #else
454 { 0, 0 }
455 #endif
456 };
457 #define NUM_BAND_INITS \
458 (sizeof(all_band_inits)/sizeof(all_band_inits[0]))
459
460 band* band::makeBands(unpacker* u) {
461 band* tmp_all_bands = U_NEW(band, BAND_LIMIT);
462 for (int i = 0; i < BAND_LIMIT; i++) {
463 assert((byte*)&all_band_inits[i+1]
464 < (byte*)all_band_inits+sizeof(all_band_inits));
465 const band_init& bi = all_band_inits[i];
466 band& b = tmp_all_bands[i];
467 coding* defc = coding::findBySpec(bi.defc);
468 assert((defc == null) == (bi.defc == -1)); // no garbage, please
469 assert(defc == null || !defc->isMalloc);
470 assert(bi.bn == i); // band array consistent w/ band enum
471 b.init(u, i, defc);
472 if (bi.index > 0) {
473 b.nullOK = ((bi.index >> 8) & 1);
474 b.ixTag = (bi.index & 0xFF);
475 }
476 #ifndef PRODUCT
477 b.name = bi.name;
478 #endif
|
271
272 #define INDEX_INIT(tag, nullOK, subindex) \
273 ((tag) + (subindex)*SUBINDEX_BIT + (nullOK)*256)
274
275 #define INDEX(tag) INDEX_INIT(tag, 0, 0)
276 #define NULL_OR_INDEX(tag) INDEX_INIT(tag, 1, 0)
277 #define SUB_INDEX(tag) INDEX_INIT(tag, 0, 1)
278 #define NO_INDEX 0
279
280 struct band_init {
281 int bn;
282 const char* name;
283 int defc;
284 int index;
285 };
286
287 #define BAND_INIT(name, cspec, ix) \
288 { e_##name, #name, /*debug only*/ \
289 cspec, ix }
290
291 const band_init all_band_inits[BAND_LIMIT+1] = {
292 //BAND_INIT(archive_magic, BYTE1_spec, 0),
293 //BAND_INIT(archive_header, UNSIGNED5_spec, 0),
294 //BAND_INIT(band_headers, BYTE1_spec, 0),
295 BAND_INIT(cp_Utf8_prefix, DELTA5_spec, 0),
296 BAND_INIT(cp_Utf8_suffix, UNSIGNED5_spec, 0),
297 BAND_INIT(cp_Utf8_chars, CHAR3_spec, 0),
298 BAND_INIT(cp_Utf8_big_suffix, DELTA5_spec, 0),
299 BAND_INIT(cp_Utf8_big_chars, DELTA5_spec, 0),
300 BAND_INIT(cp_Int, UDELTA5_spec, 0),
301 BAND_INIT(cp_Float, UDELTA5_spec, 0),
302 BAND_INIT(cp_Long_hi, UDELTA5_spec, 0),
303 BAND_INIT(cp_Long_lo, DELTA5_spec, 0),
304 BAND_INIT(cp_Double_hi, UDELTA5_spec, 0),
305 BAND_INIT(cp_Double_lo, DELTA5_spec, 0),
306 BAND_INIT(cp_String, UDELTA5_spec, INDEX(CONSTANT_Utf8)),
307 BAND_INIT(cp_Class, UDELTA5_spec, INDEX(CONSTANT_Utf8)),
308 BAND_INIT(cp_Signature_form, DELTA5_spec, INDEX(CONSTANT_Utf8)),
309 BAND_INIT(cp_Signature_classes, UDELTA5_spec, INDEX(CONSTANT_Class)),
310 BAND_INIT(cp_Descr_name, DELTA5_spec, INDEX(CONSTANT_Utf8)),
311 BAND_INIT(cp_Descr_type, UDELTA5_spec, INDEX(CONSTANT_Signature)),
431 BAND_INIT(bc_classref, UNSIGNED5_spec, NULL_OR_INDEX(CONSTANT_Class)),
432 BAND_INIT(bc_fieldref, DELTA5_spec, INDEX(CONSTANT_Fieldref)),
433 BAND_INIT(bc_methodref, UNSIGNED5_spec, INDEX(CONSTANT_Methodref)),
434 BAND_INIT(bc_imethodref, DELTA5_spec, INDEX(CONSTANT_InterfaceMethodref)),
435 BAND_INIT(bc_indyref, DELTA5_spec, INDEX(CONSTANT_InvokeDynamic)),
436 BAND_INIT(bc_thisfield, UNSIGNED5_spec, SUB_INDEX(CONSTANT_Fieldref)),
437 BAND_INIT(bc_superfield, UNSIGNED5_spec, SUB_INDEX(CONSTANT_Fieldref)),
438 BAND_INIT(bc_thismethod, UNSIGNED5_spec, SUB_INDEX(CONSTANT_Methodref)),
439 BAND_INIT(bc_supermethod, UNSIGNED5_spec, SUB_INDEX(CONSTANT_Methodref)),
440 BAND_INIT(bc_initref, UNSIGNED5_spec, SUB_INDEX(CONSTANT_Methodref)),
441 BAND_INIT(bc_escref, UNSIGNED5_spec, INDEX(CONSTANT_All)),
442 BAND_INIT(bc_escrefsize, UNSIGNED5_spec, 0),
443 BAND_INIT(bc_escsize, UNSIGNED5_spec, 0),
444 BAND_INIT(bc_escbyte, BYTE1_spec, 0),
445 BAND_INIT(file_name, UNSIGNED5_spec, INDEX(CONSTANT_Utf8)),
446 BAND_INIT(file_size_hi, UNSIGNED5_spec, 0),
447 BAND_INIT(file_size_lo, UNSIGNED5_spec, 0),
448 BAND_INIT(file_modtime, DELTA5_spec, 0),
449 BAND_INIT(file_options, UNSIGNED5_spec, 0),
450 //BAND_INIT(file_bits, BYTE1_spec, 0),
451 { 0, NULL, 0, 0 }
452 };
453
454 band* band::makeBands(unpacker* u) {
455 band* tmp_all_bands = U_NEW(band, BAND_LIMIT);
456 for (int i = 0; i < BAND_LIMIT; i++) {
457 assert((byte*)&all_band_inits[i+1]
458 < (byte*)all_band_inits+sizeof(all_band_inits));
459 const band_init& bi = all_band_inits[i];
460 band& b = tmp_all_bands[i];
461 coding* defc = coding::findBySpec(bi.defc);
462 assert((defc == null) == (bi.defc == -1)); // no garbage, please
463 assert(defc == null || !defc->isMalloc);
464 assert(bi.bn == i); // band array consistent w/ band enum
465 b.init(u, i, defc);
466 if (bi.index > 0) {
467 b.nullOK = ((bi.index >> 8) & 1);
468 b.ixTag = (bi.index & 0xFF);
469 }
470 #ifndef PRODUCT
471 b.name = bi.name;
472 #endif
|