xref: /csrg-svn/old/dbx/languages.c (revision 42683)
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