xref: /csrg-svn/old/dbx/languages.c (revision 18221)
19665Slinton /* Copyright (c) 1982 Regents of the University of California */
29665Slinton 
3*18221Slinton static	char sccsid[] = "@(#)languages.c	1.5 (Berkeley) 03/01/85";
49665Slinton 
5*18221Slinton static char rcsid[] = "$Header: languages.c,v 1.5 84/12/26 10:39:49 linton Exp $";
6*18221Slinton 
79665Slinton /*
89665Slinton  * Language management.
99665Slinton  */
109665Slinton 
119665Slinton #include "defs.h"
129665Slinton #include "languages.h"
139665Slinton #include "c.h"
149665Slinton #include "pascal.h"
1516611Ssam #include "modula-2.h"
169665Slinton #include "asm.h"
179665Slinton 
189665Slinton #ifndef public
1916611Ssam 
209665Slinton typedef struct Language *Language;
219665Slinton 
229665Slinton typedef enum {
2316611Ssam     L_PRINTDECL, L_PRINTVAL, L_TYPEMATCH, L_BUILDAREF, L_EVALAREF,
2416611Ssam     L_MODINIT, L_HASMODULES, L_PASSADDR,
2516611Ssam     L_ENDOP
269665Slinton } LanguageOp;
279665Slinton 
289665Slinton typedef LanguageOperation();
2916611Ssam 
3016611Ssam Language primlang;
3116611Ssam 
329665Slinton #endif
339665Slinton 
349665Slinton struct Language {
359665Slinton     String name;
369665Slinton     String suffix;
3716611Ssam     LanguageOperation *op[20];
389665Slinton     Language next;
399665Slinton };
409665Slinton 
419665Slinton private Language head;
429665Slinton 
439665Slinton /*
449665Slinton  * Initialize language information.
459665Slinton  *
469665Slinton  * The last language initialized will be the default one
479665Slinton  * for otherwise indistinguised symbols.
489665Slinton  */
499665Slinton 
509665Slinton public language_init()
519665Slinton {
5216611Ssam     primlang = language_define("$builtin symbols", ".?");
539665Slinton     c_init();
5412540Scsvaf     fortran_init();
559665Slinton     pascal_init();
5616611Ssam     modula2_init();
579665Slinton     asm_init();
589665Slinton }
599665Slinton 
609665Slinton public Language findlanguage(suffix)
619665Slinton String suffix;
629665Slinton {
639665Slinton     Language lang;
649665Slinton 
659665Slinton     lang = head;
669665Slinton     if (suffix != nil) {
679665Slinton 	while (lang != nil and not streq(lang->suffix, suffix)) {
689665Slinton 	    lang = lang->next;
699665Slinton 	}
709665Slinton 	if (lang == nil) {
719665Slinton 	    lang = head;
729665Slinton 	}
739665Slinton     }
749665Slinton     return lang;
759665Slinton }
769665Slinton 
779665Slinton public String language_name(lang)
789665Slinton Language lang;
799665Slinton {
809665Slinton     return (lang == nil) ? "(nil)" : lang->name;
819665Slinton }
829665Slinton 
839665Slinton public Language language_define(name, suffix)
849665Slinton String name;
859665Slinton String suffix;
869665Slinton {
879665Slinton     Language p;
889665Slinton 
899665Slinton     p = new(Language);
909665Slinton     p->name = name;
919665Slinton     p->suffix = suffix;
929665Slinton     p->next = head;
939665Slinton     head = p;
949665Slinton     return p;
959665Slinton }
969665Slinton 
979665Slinton public language_setop(lang, op, operation)
989665Slinton Language lang;
999665Slinton LanguageOp op;
1009665Slinton LanguageOperation *operation;
1019665Slinton {
1029665Slinton     checkref(lang);
10316611Ssam     assert(ord(op) < ord(L_ENDOP));
1049665Slinton     lang->op[ord(op)] = operation;
1059665Slinton }
1069665Slinton 
1079665Slinton public LanguageOperation *language_op(lang, op)
1089665Slinton Language lang;
1099665Slinton LanguageOp op;
1109665Slinton {
1119665Slinton     LanguageOperation *o;
1129665Slinton 
1139665Slinton     checkref(lang);
1149665Slinton     o = lang->op[ord(op)];
1159665Slinton     checkref(o);
1169665Slinton     return o;
1179665Slinton }
118