static int test_lex_sym_literal_1() { struct ymd_lex lex; struct ytoken token; int rv; lex_init(&lex, NULL, " a\nb\n\t__\t_1\t_1abcdef\n(ab)"); ASSERT_SYM(a); ASSERT_SYM(b); lex_init(&lex, NULL, "4 * (b + 2) / a\n"); ASSERT_DEC(4); ASSERT_TOKEN('*'); ASSERT_TOKEN('('); ASSERT_SYM(b); ASSERT_TOKEN('+'); return 0; }
pdf::Reference PdfReader::getNextReference(){ TR_USE(PDF_Reader); pdf::Reference ret; ret.object = getNextInt(); ret.generation = getNextInt(); ASSERT_TOKEN("R"); return ret; }
pdf::Object* PdfReader::readObject(unsigned offset, pdf::Reference& refr){ TR_USE(PDF_Reader); mReader->jumpTo(offset); int obj = getNextInt(); if (obj != refr.object) TR_ERROR("expected to find %i at offset %i", refr.object, offset); int gen = getNextInt(); if (gen != refr.generation) TR_ERROR("expected to find generation %i", refr.generation); ASSERT_TOKEN("obj"); ASSERT_TOKEN("<<"); const char* key = getNextDictEntry(); while(key != NULL){ key = getNextDictEntry(); } ASSERT_TOKEN("endobj"); return NULL; }
static int test_lex_num_literal_2() { struct ymd_lex lex; struct ytoken token; int rv; lex_init(&lex, NULL, "0x0\t0x1\t0x0123456789abcdefABCDEF"); ASSERT_HEX(0x0); ASSERT_HEX(0x1); ASSERT_HEX(0x0123456789abcdefABCDEF); ASSERT_TOKEN(EOS); return 0; }
PdfDocument* PdfReader::readDocument(){ TR_USE(PDF_Reader); uint8 version[9]; mReader->readBytes(version, 8); mReader->gotoEnd(); findBackwards("startxref"); ASSERT_TOKEN("startxref"); unsigned crtOffset = (unsigned)getNextInt(); //ASSERT_TOKEN("%%EOF"); PdfDocument* doc = new PdfDocument(this, crtOffset); return doc; }
pdf::Reference PdfReader::readCrt(unsigned crtOffset, pdf::CrossReferenceTable& crt){ TR_USE(PDF_Reader); mReader->jumpTo(crtOffset); ASSERT_TOKEN("xref"); crt.sections.push_back(pdf::CrossReferenceSection()); pdf::CrossReferenceSection& sect = crt.sections.back(); sect.object = getNextInt(); sect.numObjects = getNextInt(); for (unsigned i = 0; i < sect.numObjects; ++i){ sect.entries.push_back(pdf::CrtEntry()); pdf::CrtEntry& entry = sect.entries.back(); entry.offset = getNextInt(); entry.generation = getNextInt(); const char* tok = getNextToken(); entry.used = strcmp(tok, "n") == 0; crt.entries.push_back(entry); } //read trailer section int numObjects = 0; pdf::Reference root; ASSERT_TOKEN("trailer"); ASSERT_TOKEN("<<"); const char* key = getNextDictEntry(); while(key != NULL){ if (strcmp(key, "Size") == 0){ numObjects = getNextInt(); } else if (strcmp(key, "Root") == 0){ root = getNextReference(); } else TR_WARN("%s unexpected in trailer", key); key = getNextDictEntry(); } return root; }
static int test_lex_num_literal_1() { struct ymd_lex lex; struct ytoken token; int rv; lex_init(&lex, NULL, "0 -1 -0 0123456789 9 1 12 123 1234"); ASSERT_DEC(0); ASSERT_DEC(-1); ASSERT_DEC(-0); ASSERT_DEC(0123456789); ASSERT_DEC(9); ASSERT_DEC(1); ASSERT_DEC(12); ASSERT_DEC(123); ASSERT_DEC(1234); ASSERT_TOKEN(EOS); return 0; }
static int test_lex_punc_1() { struct ymd_lex lex; struct ytoken token; int rv; lex_init(&lex, NULL, "->!~+-=<>/\n\t .%^*(){}[]:==>=<=!=~=>>|><<@{|&"); ASSERT_TOKEN(DICT); ASSERT_TOKEN('!'); ASSERT_TOKEN('~'); ASSERT_TOKEN('+'); ASSERT_TOKEN('-'); ASSERT_TOKEN('='); ASSERT_TOKEN('<'); ASSERT_TOKEN('>'); ASSERT_TOKEN('/'); ASSERT_TOKEN('.'); ASSERT_TOKEN('%'); ASSERT_TOKEN('^'); ASSERT_TOKEN('*'); ASSERT_TOKEN('('); ASSERT_TOKEN(')'); ASSERT_TOKEN('{'); ASSERT_TOKEN('}'); ASSERT_TOKEN('['); ASSERT_TOKEN(']'); ASSERT_TOKEN(':'); ASSERT_TOKEN(EQ); ASSERT_TOKEN(GE); ASSERT_TOKEN(LE); ASSERT_TOKEN(NE); ASSERT_TOKEN(MATCH); ASSERT_TOKEN(RSHIFT_A); ASSERT_TOKEN(RSHIFT_L); ASSERT_TOKEN(LSHIFT); ASSERT_TOKEN(SKLS); ASSERT_TOKEN('|'); ASSERT_TOKEN('&'); ASSERT_TOKEN(EOS); return 0; }