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