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