121605Sdist /*
238105Sbostic * Copyright (c) 1983 The Regents of the University of California.
338105Sbostic * All rights reserved.
438105Sbostic *
5*42683Sbostic * %sccs.include.redist.c%
621605Sdist */
79665Slinton
821605Sdist #ifndef lint
9*42683Sbostic static char sccsid[] = "@(#)languages.c 5.3 (Berkeley) 06/01/90";
1038105Sbostic #endif /* not lint */
119665Slinton
129665Slinton /*
139665Slinton * Language management.
149665Slinton */
159665Slinton
169665Slinton #include "defs.h"
179665Slinton #include "languages.h"
189665Slinton #include "c.h"
199665Slinton #include "pascal.h"
2016611Ssam #include "modula-2.h"
219665Slinton #include "asm.h"
229665Slinton
239665Slinton #ifndef public
2416611Ssam
259665Slinton typedef struct Language *Language;
269665Slinton
279665Slinton typedef enum {
2816611Ssam L_PRINTDECL, L_PRINTVAL, L_TYPEMATCH, L_BUILDAREF, L_EVALAREF,
2916611Ssam L_MODINIT, L_HASMODULES, L_PASSADDR,
3016611Ssam L_ENDOP
319665Slinton } LanguageOp;
329665Slinton
339665Slinton typedef LanguageOperation();
3416611Ssam
3516611Ssam Language primlang;
3616611Ssam
379665Slinton #endif
389665Slinton
399665Slinton struct Language {
409665Slinton String name;
419665Slinton String suffix;
4216611Ssam LanguageOperation *op[20];
439665Slinton Language next;
449665Slinton };
459665Slinton
469665Slinton private Language head;
479665Slinton
489665Slinton /*
499665Slinton * Initialize language information.
509665Slinton *
519665Slinton * The last language initialized will be the default one
529665Slinton * for otherwise indistinguised symbols.
539665Slinton */
549665Slinton
language_init()559665Slinton public language_init()
569665Slinton {
5716611Ssam primlang = language_define("$builtin symbols", ".?");
589665Slinton c_init();
5912540Scsvaf fortran_init();
609665Slinton pascal_init();
6116611Ssam modula2_init();
629665Slinton asm_init();
639665Slinton }
649665Slinton
findlanguage(suffix)659665Slinton public Language findlanguage(suffix)
669665Slinton String suffix;
679665Slinton {
689665Slinton Language lang;
699665Slinton
709665Slinton lang = head;
719665Slinton if (suffix != nil) {
729665Slinton while (lang != nil and not streq(lang->suffix, suffix)) {
739665Slinton lang = lang->next;
749665Slinton }
759665Slinton if (lang == nil) {
769665Slinton lang = head;
779665Slinton }
789665Slinton }
799665Slinton return lang;
809665Slinton }
819665Slinton
language_name(lang)829665Slinton public String language_name(lang)
839665Slinton Language lang;
849665Slinton {
859665Slinton return (lang == nil) ? "(nil)" : lang->name;
869665Slinton }
879665Slinton
language_define(name,suffix)889665Slinton public Language language_define(name, suffix)
899665Slinton String name;
909665Slinton String suffix;
919665Slinton {
929665Slinton Language p;
939665Slinton
949665Slinton p = new(Language);
959665Slinton p->name = name;
969665Slinton p->suffix = suffix;
979665Slinton p->next = head;
989665Slinton head = p;
999665Slinton return p;
1009665Slinton }
1019665Slinton
language_setop(lang,op,operation)1029665Slinton public language_setop(lang, op, operation)
1039665Slinton Language lang;
1049665Slinton LanguageOp op;
1059665Slinton LanguageOperation *operation;
1069665Slinton {
1079665Slinton checkref(lang);
10816611Ssam assert(ord(op) < ord(L_ENDOP));
1099665Slinton lang->op[ord(op)] = operation;
1109665Slinton }
1119665Slinton
language_op(lang,op)1129665Slinton public LanguageOperation *language_op(lang, op)
1139665Slinton Language lang;
1149665Slinton LanguageOp op;
1159665Slinton {
1169665Slinton LanguageOperation *o;
1179665Slinton
1189665Slinton checkref(lang);
1199665Slinton o = lang->op[ord(op)];
1209665Slinton checkref(o);
1219665Slinton return o;
1229665Slinton }
123