xref: /csrg-svn/old/dbx/languages.c (revision 38105)
121605Sdist /*
2*38105Sbostic  * Copyright (c) 1983 The Regents of the University of California.
3*38105Sbostic  * All rights reserved.
4*38105Sbostic  *
5*38105Sbostic  * Redistribution and use in source and binary forms are permitted
6*38105Sbostic  * provided that the above copyright notice and this paragraph are
7*38105Sbostic  * duplicated in all such forms and that any documentation,
8*38105Sbostic  * advertising materials, and other materials related to such
9*38105Sbostic  * distribution and use acknowledge that the software was developed
10*38105Sbostic  * by the University of California, Berkeley.  The name of the
11*38105Sbostic  * University may not be used to endorse or promote products derived
12*38105Sbostic  * from this software without specific prior written permission.
13*38105Sbostic  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14*38105Sbostic  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15*38105Sbostic  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
1621605Sdist  */
179665Slinton 
1821605Sdist #ifndef lint
19*38105Sbostic static char sccsid[] = "@(#)languages.c	5.2 (Berkeley) 05/23/89";
20*38105Sbostic #endif /* not lint */
219665Slinton 
229665Slinton /*
239665Slinton  * Language management.
249665Slinton  */
259665Slinton 
269665Slinton #include "defs.h"
279665Slinton #include "languages.h"
289665Slinton #include "c.h"
299665Slinton #include "pascal.h"
3016611Ssam #include "modula-2.h"
319665Slinton #include "asm.h"
329665Slinton 
339665Slinton #ifndef public
3416611Ssam 
359665Slinton typedef struct Language *Language;
369665Slinton 
379665Slinton typedef enum {
3816611Ssam     L_PRINTDECL, L_PRINTVAL, L_TYPEMATCH, L_BUILDAREF, L_EVALAREF,
3916611Ssam     L_MODINIT, L_HASMODULES, L_PASSADDR,
4016611Ssam     L_ENDOP
419665Slinton } LanguageOp;
429665Slinton 
439665Slinton typedef LanguageOperation();
4416611Ssam 
4516611Ssam Language primlang;
4616611Ssam 
479665Slinton #endif
489665Slinton 
499665Slinton struct Language {
509665Slinton     String name;
519665Slinton     String suffix;
5216611Ssam     LanguageOperation *op[20];
539665Slinton     Language next;
549665Slinton };
559665Slinton 
569665Slinton private Language head;
579665Slinton 
589665Slinton /*
599665Slinton  * Initialize language information.
609665Slinton  *
619665Slinton  * The last language initialized will be the default one
629665Slinton  * for otherwise indistinguised symbols.
639665Slinton  */
649665Slinton 
659665Slinton public language_init()
669665Slinton {
6716611Ssam     primlang = language_define("$builtin symbols", ".?");
689665Slinton     c_init();
6912540Scsvaf     fortran_init();
709665Slinton     pascal_init();
7116611Ssam     modula2_init();
729665Slinton     asm_init();
739665Slinton }
749665Slinton 
759665Slinton public Language findlanguage(suffix)
769665Slinton String suffix;
779665Slinton {
789665Slinton     Language lang;
799665Slinton 
809665Slinton     lang = head;
819665Slinton     if (suffix != nil) {
829665Slinton 	while (lang != nil and not streq(lang->suffix, suffix)) {
839665Slinton 	    lang = lang->next;
849665Slinton 	}
859665Slinton 	if (lang == nil) {
869665Slinton 	    lang = head;
879665Slinton 	}
889665Slinton     }
899665Slinton     return lang;
909665Slinton }
919665Slinton 
929665Slinton public String language_name(lang)
939665Slinton Language lang;
949665Slinton {
959665Slinton     return (lang == nil) ? "(nil)" : lang->name;
969665Slinton }
979665Slinton 
989665Slinton public Language language_define(name, suffix)
999665Slinton String name;
1009665Slinton String suffix;
1019665Slinton {
1029665Slinton     Language p;
1039665Slinton 
1049665Slinton     p = new(Language);
1059665Slinton     p->name = name;
1069665Slinton     p->suffix = suffix;
1079665Slinton     p->next = head;
1089665Slinton     head = p;
1099665Slinton     return p;
1109665Slinton }
1119665Slinton 
1129665Slinton public language_setop(lang, op, operation)
1139665Slinton Language lang;
1149665Slinton LanguageOp op;
1159665Slinton LanguageOperation *operation;
1169665Slinton {
1179665Slinton     checkref(lang);
11816611Ssam     assert(ord(op) < ord(L_ENDOP));
1199665Slinton     lang->op[ord(op)] = operation;
1209665Slinton }
1219665Slinton 
1229665Slinton public LanguageOperation *language_op(lang, op)
1239665Slinton Language lang;
1249665Slinton LanguageOp op;
1259665Slinton {
1269665Slinton     LanguageOperation *o;
1279665Slinton 
1289665Slinton     checkref(lang);
1299665Slinton     o = lang->op[ord(op)];
1309665Slinton     checkref(o);
1319665Slinton     return o;
1329665Slinton }
133