4.4BSD/usr/src/old/dbx/languages.c
/*
* 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;
}