|
|
1.1 root 1: #include "sbbs.h"
2: #include "text_defaults.h" /* text_defaults */
3:
4: /****************************************************************************/
5: /* Reads special TEXT.DAT printf style text lines, splicing multiple lines, */
6: /* replacing escaped characters, and allocating the memory */
7: /****************************************************************************/
8: char *readtext(long *line,FILE *stream,long dflt)
9: {
10: char buf[MAX_TEXTDAT_ITEM_LEN+256],str[MAX_TEXTDAT_ITEM_LEN+1],tmp[256],*p,*p2;
11: int i,j,k;
12:
13: if(!fgets(buf,256,stream)) {
14: /* Hide the EOF */
15: if(feof(stream))
16: clearerr(stream);
17: goto use_default;
18: }
19: if(line)
20: (*line)++;
21: if(buf[0]=='#')
22: goto use_default;
23: p=strrchr(buf,'"');
24: if(!p) {
25: if(line)
26: lprintf(LOG_WARNING,"No quotation marks in line %d of text.dat",*line);
27: goto use_default;
28: }
29: if(*(p+1)=='\\') /* merge multiple lines */
30: while(strlen(buf)<MAX_TEXTDAT_ITEM_LEN) {
31: if(!fgets(str,255,stream)) {
32: /* Hide the EOF */
33: if(feof(stream))
34: clearerr(stream);
35: goto use_default;
36: }
37: if(line)
38: (*line)++;
39: p2=strchr(str,'"');
40: if(!p2)
41: continue;
42: strcpy(p,p2+1);
43: p=strrchr(p,'"');
44: if(p && *(p+1)=='\\')
45: continue;
46: break;
47: }
48: *(p)=0;
49: k=strlen(buf);
50: for(i=1,j=0;i<k && j<sizeof(str)-1;j++) {
51: if(buf[i]=='\\') { /* escape */
52: i++;
53: if(isdigit(buf[i])) {
54: str[j]=atoi(buf+i); /* decimal, NOT octal */
55: if(isdigit(buf[++i])) /* skip up to 3 digits */
56: if(isdigit(buf[++i]))
57: i++;
58: continue;
59: }
60: switch(buf[i++]) {
61: case '\\':
62: str[j]='\\';
63: break;
64: case '?':
65: str[j]='?';
66: break;
67: case 'x':
68: tmp[0]=buf[i++]; /* skip next character */
69: tmp[1]=0;
70: if(isxdigit(buf[i])) { /* if another hex digit, skip too */
71: tmp[1]=buf[i++];
72: tmp[2]=0;
73: }
74: str[j]=(char)ahtoul(tmp);
75: break;
76: case '\'':
77: str[j]='\'';
78: break;
79: case '"':
80: str[j]='"';
81: break;
82: case 'r':
83: str[j]=CR;
84: break;
85: case 'n':
86: str[j]=LF;
87: break;
88: case 't':
89: str[j]=TAB;
90: break;
91: case 'b':
92: str[j]=BS;
93: break;
94: case 'a':
95: str[j]=BEL;
96: break;
97: case 'f':
98: str[j]=FF;
99: break;
100: case 'v':
101: str[j]=11; /* VT */
102: break;
103: default:
104: str[j]=buf[i];
105: break;
106: }
107: continue;
108: }
109: str[j]=buf[i++];
110: }
111: str[j]=0;
112: if((p=(char *)calloc(1,j+2))==NULL) { /* +1 for terminator, +1 for YNQX line */
113: lprintf(LOG_CRIT,"Error allocating %u bytes of memory from text.dat",j);
114: goto use_default;
115: }
116: strcpy(p,str);
117: return(p);
118: use_default:
119: p=strdup(text_defaults[dflt]);
120: if(p==NULL)
121: lprintf(LOG_CRIT,"Error duplicating %s text defaults",text_defaults[dflt]);
122: return(p);
123: }
124:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.