1 /* $Id: c.c,v 1.12 1994/06/24 10:59:15 ceriel Exp $ */
3 /* Language dependant support; this one is for C */
19 extern FILE *db_out, *db_in;
41 static struct langdep c_lang = {
71 struct langdep *c_dep = &c_lang;
100 fprintf(f, c == esc ? "\\%c" : "%c", c);
103 fprintf(f, (c >= 040 && c < 0177) ? "%c" : "\\%03o", c);
113 printchar(db_out, c, '\'');
118 print_string(f, s, len)
123 register char *str = s;
126 while (*str && len-- > 0) printchar(f, *str++, '"');
130 extern long int_size;
136 if (! (int_size % size)) return size;
137 if (! (size % int_size)) return size;
138 return ((size + int_size - 1) / int_size) * int_size;
210 ? (c - 'a' + 10) & 017
219 register int base = 10;
220 register char *p = &buf[0];
221 register long val = 0;
225 /* check if next char is an 'x' or an 'X' */
227 if (c == 'x' || c == 'X') {
233 while (val_c = val_in_base(c, base), val_c >= 0) {
234 val = val * base + val_c;
235 if (p - buf < 512) *p++ = c;
238 if (base == 16 || !((c == '.' || c == 'e' || c == 'E'))) {
244 if (p - buf < 512) *p++ = c;
248 if (p - buf < 512) *p++ = c;
251 if (c == 'e' || c == 'E') {
252 if (p - buf < 512) *p++ = c;
254 if (c == '+' || c == '-') {
255 if (p - buf < 512) *p++ = c;
259 error("malformed floating constant");
262 if (p - buf < 512) *p++ = c;
268 if (p == &buf[512+1]) {
269 error("floating point constant too long");
271 tok.fval = atof(buf);
298 return PREF_OR_BIN_OP;
302 tok.ival = E_DERSELECT;
307 return PREF_OR_BIN_OP;
310 return PREF_OR_BIN_OP;
325 return PREF_OR_BIN_OP;
345 warning("== assumed");
352 tok.ival = E_LTEQUAL;
365 tok.ival = E_GTEQUAL;
378 tok.ival = E_NOTEQUAL;
388 error((c >= 040 && c < 0177) ? "%s'%c'" : "%s'\\0%o'", "illegal character ", c);
397 /* quoted() replaces an escaped character sequence by the
400 /* first char after backslash already in ch */
401 if (!is_oct(ch)) { /* a quoted char */
420 else { /* a quoted octal */
421 register int oct = 0, cnt = 0;
424 oct = oct*8 + (ch-'0');
426 } while (is_oct(ch) && ++cnt < 3);
440 register int len = 0;
442 while (ch = getc(db_in), ch != c) {
444 error("newline in string");
458 while (buf[ch] != 0) {
459 val = (val << 8) + (buf[ch++] & 0377);
464 tok.str = Salloc(buf, (unsigned) len);
475 switch(p->t_whichoper) {
478 print_node(f, p->t_args[0], 0);
483 print_node(f, p->t_args[0], 0);
488 print_node(f, p->t_args[0], 0);
493 print_node(f, p->t_args[0], 0);
498 print_node(f, p->t_args[0], 0);
503 print_node(f, p->t_args[0], 0);
509 if (p->t_whichoper == E_ARRAY) {
510 print_node(f, p->t_args[0], 0);
512 print_node(f, p->t_args[1], 0);
516 if (p->t_whichoper == E_DERSELECT) {
517 print_node(f, p->t_args[0], 0);
519 print_node(f, p->t_args[1], 0);
522 if (p->t_whichoper == E_SELECT) {
523 print_node(f, p->t_args[0], 0);
525 print_node(f, p->t_args[1], 0);
529 print_node(f, p->t_args[0], 0);
530 switch(p->t_whichoper) {
586 print_node(f, p->t_args[1], 0);
596 switch(p->t_whichoper) {
598 p->t_whichoper = E_DEREF;
601 p->t_whichoper = E_ADDR;