/* * Copyright (C) 2026 Peter Mikkelsen * * This file is part of aplwc. * * Aplwc is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Aplwc is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with aplwc. If not, see . */ #include "aplwc_internal.h" enum aplwc_rc getsym(struct aplwc *aplwc, struct string *string, symbol_t *id) { static symbol_t next_id; struct symbol *sym; enum aplwc_rc rc; MEMPTRS(aplwc, 1); rc = APLWC_OK; for(sym = aplwc->symtab; sym; sym = sym->link){ if(string_compare(sym->text, string) == 0) goto end; } MEMPTR(0, string); if((sym = memory_alloc_symbol(aplwc)) == NULL){ rc = aplwc->last_error; goto end; } sym->id = next_id++; sym->text = string; sym->link = aplwc->symtab; aplwc->symtab = sym; end: *id = sym->id; MEMPTRS_EXIT(aplwc); return rc; }