Pristine Ack-5.5
[Ack-5.5.git] / util / ceg / EM_parser / common / help.c
1 #include <ctype.h>
2 #include <system.h>
3 #if __STDC__
4 #include <stdarg.h>
5 extern out(char *, ...);
6 #else
7 #include <varargs.h>
8 #endif
9
10 #define CODE_EXPANDER
11 #include "em.h"
12
13 #include "decl.h"
14
15 extern int library;
16 extern File *outfile;
17
18 /* This file contains some routines called from the parser in 'pars.g' */
19
20 question( str)
21 char *str;
22
23 /* Print : "if ( <str> ) {"
24  */
25 {
26         register char c;
27         int arg_nr;
28
29         out( "if ( ");
30         for ( c = *str++; c != '\0'; c= *str++)
31                 if ( c == '$' && isdigit( *str)) {
32
33                         arg_nr = *str++ - '0' - 1;
34                         out( "%s", C_instr_info->arg_id[arg_nr]);
35                 }
36                 else
37                         out( "%c", c);
38         
39         out( ") {\n");
40 }
41
42 extern arith cur_pos;
43 extern int segment;
44
45 print_call( str)
46 char *str;
47
48 /* Print 'str' and handle the $i's. Also count the number of text-bytes
49  * that are generated, look for text?() and reloc?() calls.
50  */
51 {
52         register char c;
53         int arg_nr;
54         extern int no_conversions;
55
56         if ( strncmp( "text", str, 4) == 0 && isdigit( *(str+4))) 
57                 cur_pos += *(str+4) - '0';
58         else if ( strncmp( "reloc", str, 5) == 0 && isdigit( *(str+5)) &&
59                 segment == SEGTXT) 
60                 cur_pos += *(str+5) - '0';
61
62         for ( c = *str++; c != '\0'; c= *str++)
63                 if ( c == '$' && isdigit( *str)) {
64
65                         arg_nr = *str++ - '0' - 1;
66                         if ( no_conversions)
67                                 out( "%s", C_instr_info->arg_id[arg_nr]);
68                         else
69                                 out( "%s", C_instr_info->arg_conv[arg_nr]);
70                 }
71                 else
72                         out( "%c", c);
73         
74         out( ";\n");
75 }
76
77
78 header( instr)
79 char *instr;
80 {
81         out( "void %s%s", instr, C_instr_info->header);
82         def_admn( instr);
83 }
84
85
86 set_segment( seg)
87 int seg;
88 {
89         switch ( seg) {
90           case SEGTXT : out( "switchseg( SEGTXT);\n");
91                          break;
92           case SEGBSS  : out( "switchseg( SEGBSS);\n");
93                          out( "dump_label();\n");
94                          break;
95           case SEGHOL  : out( "switchseg( SEGHOL);\n");
96                          break;
97           case SEGCON  : out( "switchseg( SEGCON);\n");
98                          out( "dump_label();\n");
99                          break;
100           case SEGROM  : out( "switchseg( SEGROM);\n");
101                          out( "dump_label();\n");
102                          break;
103           case UNKNOWN : break; /* dan niet! */
104         }
105 }
106
107 #if __STDC__
108 /*VARARGS*/
109 out(char *fmt, ...)
110 {
111         va_list pvar;
112  
113         va_start(pvar, fmt);
114         doprnt( outfile, fmt, pvar);
115         va_end(pvar);
116 }
117 #else
118 /*VARARGS*/
119 out(va_alist)
120 va_dcl
121 {
122         va_list pvar;
123         char *fmt;
124  
125         va_start(pvar);
126         fmt = va_arg(pvar, char *);
127         doprnt( outfile, fmt, pvar);
128         va_end(pvar);
129 }
130 #endif
131
132 char *suffix( str, suf)
133 char *str, *suf;
134 {
135         static char res[15];
136         char *s, *strncpy(), *strcat();
137         int strl, sufl, prefl;
138
139         strl = strlen( str);
140         sufl = strlen( suf);
141
142         for ( s = str + strl; --s >= str && *s != '.';)
143                 ;
144
145         if ( *s == '.')
146                 prefl = s - str;
147         else
148                 prefl = strl;
149         
150         if ( prefl + sufl + 1 > 14 )
151                 prefl = 14 - 1 - sufl;
152         
153         strncpy( res, str, prefl);
154         res[prefl] = '\0';
155         s = strcat( res, ".");
156         s = strcat( s, suf);
157         return( s);
158 }
159
160
161 set_outfile( name)
162 char *name;
163 {
164         if ( library) {
165                 name = suffix( name, "c");
166                 sys_close( outfile);
167                 if ( !sys_open( name, OP_WRITE, &outfile))
168                         fprint( STDERR, "!! can't create %s !!\n", name);
169                 file_header();
170         }
171 }
172
173
174 file_header()
175 {
176         out( "#define CODE_EXPANDER\n");
177         out( "#include \"mach.h\"\n");
178         out( "#include \"back.h\"\n\n");
179         out( "extern int B_holno, B_procno;\n\n");
180 }