static void StoreIdentifiers(IDatabaseWrapper& database, int64_t resource, ResourceType level, const DicomMap& map) { const DicomTag* tags; size_t size; LoadIdentifiers(tags, size, level); for (size_t i = 0; i < size; i++) { const DicomValue* value = map.TestAndGetValue(tags[i]); if (value != NULL && !value->IsNull() && !value->IsBinary()) { std::string s = NormalizeIdentifier(value->GetContent()); database.SetIdentifierTag(resource, tags[i], s); } } }
/* parse an identifier */ static int parseIdentifier(LexStream *L, AST **ast_ptr, const char *prefix) { int c; struct flexbuf fb; Symbol *sym; AST *ast = NULL; int startColumn = L->colCounter - 1; char *idstr; flexbuf_init(&fb, INCSTR); if (prefix) { flexbuf_addmem(&fb, prefix, strlen(prefix)); if (gl_gas_dat) { flexbuf_addchar(&fb, '.'); } else { flexbuf_addchar(&fb, ':'); } } c = lexgetc(L); while (isIdentifierChar(c)) { //flexbuf_addchar(&fb, tolower(c)); flexbuf_addchar(&fb, c); c = lexgetc(L); } // add a trailing 0, and make sure there is room for an extra // character in case the name mangling needs it flexbuf_addchar(&fb, '\0'); flexbuf_addchar(&fb, '\0'); idstr = flexbuf_get(&fb); lexungetc(L, c); /* check for reserved words */ if (InDatBlock(L)) { sym = FindSymbol(&pasmWords, idstr); if (sym) { free(idstr); if (sym->type == SYM_INSTR) { ast = NewAST(AST_INSTR, NULL, NULL); ast->d.ptr = sym->val; *ast_ptr = ast; return T_INSTR; } if (sym->type == SYM_INSTRMODIFIER) { ast = NewAST(AST_INSTRMODIFIER, NULL, NULL); ast->d.ptr = sym->val; *ast_ptr = ast; return T_INSTRMODIFIER; } fprintf(stderr, "Internal error: Unknown pasm symbol type %d\n", sym->type); } } sym = FindSymbol(&reservedWords, idstr); if (sym != NULL) { if (sym->type == SYM_BUILTIN) { /* run any parse hooks */ Builtin *b = (Builtin *)sym->val; if (b && b->parsehook) { (*b->parsehook)(b); } goto is_identifier; } if (sym->type == SYM_CONSTANT || sym->type == SYM_FLOAT_CONSTANT) { goto is_identifier; } free(idstr); if (sym->type == SYM_RESERVED) { c = INTVAL(sym); /* check for special handling */ switch(c) { case T_PUB: case T_PRI: case T_DAT: case T_OBJ: case T_VAR: case T_CON: L->in_block = c; L->block_firstline = L->lineCounter; //EstablishIndent(L, 1); break; case T_ASM: if (L->in_block == T_ASM) { fprintf(stderr, "WARNING: ignoring nested asm\n"); } else { L->save_block = L->in_block; } L->in_block = c; break; case T_ENDASM: L->in_block = L->save_block; break; case T_IF: case T_IFNOT: case T_ELSE: case T_ELSEIF: case T_ELSEIFNOT: case T_REPEAT: case T_CASE: EstablishIndent(L, startColumn); break; default: break; } if (!ast) ast = GetComments(); *ast_ptr = ast; return c; } if (sym->type == SYM_HWREG) { ast = NewAST(AST_HWREG, NULL, NULL); ast->d.ptr = sym->val; *ast_ptr = ast; return T_HWREG; } fprintf(stderr, "Internal error: Unknown symbol type %d\n", sym->type); } is_identifier: ast = NewAST(AST_IDENTIFIER, NULL, NULL); /* make sure identifiers do not conflict with C keywords */ if (gl_normalizeIdents || Is_C_Reserved(idstr)) { NormalizeIdentifier(idstr); } ast->d.string = idstr; *ast_ptr = ast; return T_IDENTIFIER; }