xref: /original-bsd/old/dbx/languages.c (revision f0fd5f8a)
1 /* Copyright (c) 1982 Regents of the University of California */
2 
3 static char sccsid[] = "@(#)languages.c 1.2 12/15/82";
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
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     pascal_init();
45     asm_init();
46 }
47 
48 public Language findlanguage(suffix)
49 String suffix;
50 {
51     Language lang;
52 
53     lang = head;
54     if (suffix != nil) {
55 	while (lang != nil and not streq(lang->suffix, suffix)) {
56 	    lang = lang->next;
57 	}
58 	if (lang == nil) {
59 	    lang = head;
60 	}
61     }
62     return lang;
63 }
64 
65 public String language_name(lang)
66 Language lang;
67 {
68     return (lang == nil) ? "(nil)" : lang->name;
69 }
70 
71 public Language language_define(name, suffix)
72 String name;
73 String suffix;
74 {
75     Language p;
76 
77     p = new(Language);
78     p->name = name;
79     p->suffix = suffix;
80     p->next = head;
81     head = p;
82     return p;
83 }
84 
85 public language_setop(lang, op, operation)
86 Language lang;
87 LanguageOp op;
88 LanguageOperation *operation;
89 {
90     checkref(lang);
91     assert(ord(op) <= ord(L_TYPEMATCH));
92     lang->op[ord(op)] = operation;
93 }
94 
95 public LanguageOperation *language_op(lang, op)
96 Language lang;
97 LanguageOp op;
98 {
99     LanguageOperation *o;
100 
101     checkref(lang);
102     o = lang->op[ord(op)];
103     checkref(o);
104     return o;
105 }
106