Commit | Line | Data |
---|---|---|
3be3d0a4 KM |
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) %G%"; | |
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 | } |