|
|
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.