/* * Copyright (c) 1983 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint static char sccsid[] = "@(#)languages.c 5.3 (Berkeley) 6/1/90"; #endif /* not lint */ /* * Language management. */ #include "defs.h" #include "languages.h" #include "c.h" #include "pascal.h" #include "modula-2.h" #include "asm.h" #ifndef public typedef struct Language *Language; typedef enum { L_PRINTDECL, L_PRINTVAL, L_TYPEMATCH, L_BUILDAREF, L_EVALAREF, L_MODINIT, L_HASMODULES, L_PASSADDR, L_ENDOP } LanguageOp; typedef LanguageOperation(); Language primlang; #endif struct Language { String name; String suffix; LanguageOperation *op[20]; Language next; }; private Language head; /* * Initialize language information. * * The last language initialized will be the default one * for otherwise indistinguised symbols. */ public language_init() { primlang = language_define("$builtin symbols", ".?"); c_init(); fortran_init(); pascal_init(); modula2_init(); asm_init(); } public Language findlanguage(suffix) String suffix; { Language lang; lang = head; if (suffix != nil) { while (lang != nil and not streq(lang->suffix, suffix)) { lang = lang->next; } if (lang == nil) { lang = head; } } return lang; } public String language_name(lang) Language lang; { return (lang == nil) ? "(nil)" : lang->name; } public Language language_define(name, suffix) String name; String suffix; { Language p; p = new(Language); p->name = name; p->suffix = suffix; p->next = head; head = p; return p; } public language_setop(lang, op, operation) Language lang; LanguageOp op; LanguageOperation *operation; { checkref(lang); assert(ord(op) < ord(L_ENDOP)); lang->op[ord(op)] = operation; } public LanguageOperation *language_op(lang, op) Language lang; LanguageOp op; { LanguageOperation *o; checkref(lang); o = lang->op[ord(op)]; checkref(o); return o; }