1 /* 2 * Copyright (c) 1980 Regents of the University of California. 3 * All rights reserved. The Berkeley software License Agreement 4 * specifies the terms and conditions for redistribution. 5 */ 6 7 #ifndef lint 8 static char sccsid[] = "@(#)setfmt.c 5.1 (Berkeley) 06/07/85"; 9 #endif not lint 10 11 #include "defs.h" 12 #include "format.h" 13 14 #define GLITCH '\2' 15 16 extern char *fmtptr, *s_init; 17 extern int fmt_strings; 18 19 setfmt(lp) 20 struct Labelblock *lp; 21 { 22 int fmt_len, frmt_str_lab; 23 char *s, *lexline(); 24 25 s = lexline(&fmt_len); 26 preven(ALILONG); 27 prlabel(asmfile, lp->labelno); 28 if( pars_f(s) != 0) { 29 err_fmt(fmt_len); 30 } else { 31 fprintf( asmfile, ".word %d\n", FMT_COMP ); /* precompiled format */ 32 fprintf( asmfile, ".word %d\n", pc ); 33 frmt_str_lab = newlabel(); /* to mark loc of format string */ 34 prcona( asmfile, frmt_str_lab ); 35 putshrts( syl, sizeof(struct syl)/SZSHORT*pc ); 36 } 37 if( fmt_strings ) pruse( asmfile, USEINIT) ; 38 prlabel(asmfile, frmt_str_lab ); 39 putstr(asmfile, s, fmt_len); 40 if( fmt_strings ) pruse( asmfile, USECONST) ; 41 flline(); 42 } 43 44 LOCAL 45 putshrts( words, count ) 46 short *words; 47 { 48 while ( count-- > 0 ) 49 fprintf( asmfile, ".word %d\n", *words++ ); 50 } 51 52 static char *fmt_seg_ptr; 53 54 LOCAL 55 err_fmt(fmt_len) 56 { 57 int i; 58 char *ep, *end_ptr = s_init+fmt_len; 59 char fmt_seg[50]; 60 61 fmt_seg_ptr = fmt_seg; 62 i = fmtptr - s_init; 63 ep = fmtptr - (i<25?i:25); 64 i = i + 5; 65 while(i && *ep && ep<end_ptr) 66 { 67 if(ep==fmtptr) save_char('|',fmt_seg); 68 save_char(*ep); 69 ep++; i--; 70 } 71 *fmt_seg_ptr++ = '\0'; 72 errstr("Error in format: %s", fmt_seg); 73 } 74 75 LOCAL 76 save_char(c) 77 int c; 78 { 79 c &= 0177; 80 if( c == GLITCH ) { 81 c = '"'; 82 } else if (c < ' ' || c == 0177) { 83 *fmt_seg_ptr++ ='^'; 84 c ^= 0100; 85 } 86 *fmt_seg_ptr++ = c; 87 } 88