From: kaashoek Date: Fri, 18 Dec 1987 16:22:16 +0000 (+0000) Subject: Initial revision X-Git-Tag: release-5-5~3679 X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=d69f0ef861704968c7c124e19875ef42faa89b24;p=ack.git Initial revision --- diff --git a/util/ceg/EM_parser/common/help.c b/util/ceg/EM_parser/common/help.c new file mode 100644 index 000000000..747cb5015 --- /dev/null +++ b/util/ceg/EM_parser/common/help.c @@ -0,0 +1,158 @@ +#include +#include + +#define CODE_EXPANDER +#include "em.h" + +#include "decl.h" + +extern int library; +extern File *outfile; + +/* This file contains some routines called from the parser in 'pars.g' */ + +question( str) +char *str; + +/* Print : "if ( ) {" + */ +{ + register char c; + int arg_nr; + + out( "if ( "); + for ( c = *str++; c != '\0'; c= *str++) + if ( c == '$' && isdigit( *str)) { + + arg_nr = *str++ - '0' - 1; + out( "%s", C_instr_info->arg_id[arg_nr]); + } + else + out( "%c", c); + + out( ") {\n"); +} + +extern arith cur_pos; +extern int segment; + +print_call( str) +char *str; + +/* Print 'str' and handle the $i's. Also count the number of text-bytes + * that are generated, look for text?() and reloc?() calls. + */ +{ + register char c; + int arg_nr; + extern int no_conversions; + + if ( strncmp( "text", str, 4) == 0 && isdigit( *(str+4))) + cur_pos += *(str+4) - '0'; + else if ( strncmp( "reloc", str, 5) == 0 && isdigit( *(str+5)) && + segment == SEGTXT) + cur_pos += *(str+5) - '0'; + + for ( c = *str++; c != '\0'; c= *str++) + if ( c == '$' && isdigit( *str)) { + + arg_nr = *str++ - '0' - 1; + if ( no_conversions) + out( "%s", C_instr_info->arg_id[arg_nr]); + else + out( "%s", C_instr_info->arg_conv[arg_nr]); + } + else + out( "%c", c); + + out( ";\n"); +} + + +header( instr) +char *instr; +{ + out( "%s%s", instr, C_instr_info->header); + def_admn( instr); +} + + +set_segment( seg) +int seg; +{ + switch ( seg) { + case SEGTXT : out( "switchseg( SEGTXT);\n"); + break; + case SEGBSS : out( "switchseg( SEGBSS);\n"); + out( "dump_label();\n"); + break; + case SEGHOL : out( "switchseg( SEGHOL); DOESN'T EXIST!!\n"); + break; + case SEGCON : out( "switchseg( SEGCON);\n"); + out( "dump_label();\n"); + break; + case SEGROM : out( "switchseg( SEGROM);\n"); + out( "dump_label();\n"); + break; + case UNKNOWN : break; /* dan niet! */ + } +} + + +out( fmt, argv) +char *fmt; +int argv; +{ + doprnt( outfile, fmt, &argv); +} + + +char *suffix( str, suf) +char *str, *suf; +{ + static char res[15]; + char *s, *strncpy(), *strcat(); + int strl, sufl, prefl; + + strl = strlen( str); + sufl = strlen( suf); + + for ( s = str + strl; --s >= str && *s != '.';) + ; + + if ( *s == '.') + prefl = s - str; + else + prefl = strl; + + if ( prefl + sufl + 1 > 14 ) + prefl = 14 - 1 - sufl; + + strncpy( res, str, prefl); + res[prefl] = '\0'; + s = strcat( res, "."); + s = strcat( s, suf); + return( s); +} + + +set_outfile( name) +char *name; +{ + if ( library) { + name = suffix( name, "c"); + sys_close( outfile); + if ( !sys_open( name, OP_WRITE, &outfile)) + fprint( STDERR, "!! can't create %s !!\n", name); + file_header(); + } +} + + +file_header() +{ + out( "#define CODE_EXPANDER\n"); + out( "#include \n"); + out( "#include \"mach.h\"\n"); + out( "#include \"back.h\"\n\n"); +}