xref: /csrg-svn/old/dbx/languages.c (revision 9665)
1*9665Slinton /* Copyright (c) 1982 Regents of the University of California */
2*9665Slinton 
3*9665Slinton static char sccsid[] = "@(#)@(#)languages.c 1.1 12/15/82";
4*9665Slinton 
5*9665Slinton /*
6*9665Slinton  * Language management.
7*9665Slinton  */
8*9665Slinton 
9*9665Slinton #include "defs.h"
10*9665Slinton #include "languages.h"
11*9665Slinton #include "c.h"
12*9665Slinton #include "pascal.h"
13*9665Slinton #include "asm.h"
14*9665Slinton 
15*9665Slinton #ifndef public
16*9665Slinton typedef struct Language *Language;
17*9665Slinton 
18*9665Slinton typedef enum {
19*9665Slinton     L_PRINTDECL, L_PRINTVAL, L_TYPEMATCH
20*9665Slinton } LanguageOp;
21*9665Slinton 
22*9665Slinton typedef LanguageOperation();
23*9665Slinton #endif
24*9665Slinton 
25*9665Slinton struct Language {
26*9665Slinton     String name;
27*9665Slinton     String suffix;
28*9665Slinton     LanguageOperation *op[10];
29*9665Slinton     Language next;
30*9665Slinton };
31*9665Slinton 
32*9665Slinton private Language head;
33*9665Slinton 
34*9665Slinton /*
35*9665Slinton  * Initialize language information.
36*9665Slinton  *
37*9665Slinton  * The last language initialized will be the default one
38*9665Slinton  * for otherwise indistinguised symbols.
39*9665Slinton  */
40*9665Slinton 
41*9665Slinton public language_init()
42*9665Slinton {
43*9665Slinton     c_init();
44*9665Slinton     pascal_init();
45*9665Slinton     asm_init();
46*9665Slinton }
47*9665Slinton 
48*9665Slinton public Language findlanguage(suffix)
49*9665Slinton String suffix;
50*9665Slinton {
51*9665Slinton     Language lang;
52*9665Slinton 
53*9665Slinton     lang = head;
54*9665Slinton     if (suffix != nil) {
55*9665Slinton 	while (lang != nil and not streq(lang->suffix, suffix)) {
56*9665Slinton 	    lang = lang->next;
57*9665Slinton 	}
58*9665Slinton 	if (lang == nil) {
59*9665Slinton 	    lang = head;
60*9665Slinton 	}
61*9665Slinton     }
62*9665Slinton     return lang;
63*9665Slinton }
64*9665Slinton 
65*9665Slinton public String language_name(lang)
66*9665Slinton Language lang;
67*9665Slinton {
68*9665Slinton     return (lang == nil) ? "(nil)" : lang->name;
69*9665Slinton }
70*9665Slinton 
71*9665Slinton public Language language_define(name, suffix)
72*9665Slinton String name;
73*9665Slinton String suffix;
74*9665Slinton {
75*9665Slinton     Language p;
76*9665Slinton 
77*9665Slinton     p = new(Language);
78*9665Slinton     p->name = name;
79*9665Slinton     p->suffix = suffix;
80*9665Slinton     p->next = head;
81*9665Slinton     head = p;
82*9665Slinton     return p;
83*9665Slinton }
84*9665Slinton 
85*9665Slinton public language_setop(lang, op, operation)
86*9665Slinton Language lang;
87*9665Slinton LanguageOp op;
88*9665Slinton LanguageOperation *operation;
89*9665Slinton {
90*9665Slinton     checkref(lang);
91*9665Slinton     assert(ord(op) <= ord(L_TYPEMATCH));
92*9665Slinton     lang->op[ord(op)] = operation;
93*9665Slinton }
94*9665Slinton 
95*9665Slinton public LanguageOperation *language_op(lang, op)
96*9665Slinton Language lang;
97*9665Slinton LanguageOp op;
98*9665Slinton {
99*9665Slinton     LanguageOperation *o;
100*9665Slinton 
101*9665Slinton     checkref(lang);
102*9665Slinton     o = lang->op[ord(op)];
103*9665Slinton     checkref(o);
104*9665Slinton     return o;
105*9665Slinton }
106