From 5542b14f31308584e0a4432be7af05699c83a7f9 Mon Sep 17 00:00:00 2001 From: deuce <> Date: Fri, 23 Jan 2009 08:09:51 +0000 Subject: [PATCH] Add new readtext.c file. --- src/sbbs3/readtext.c | 116 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 src/sbbs3/readtext.c diff --git a/src/sbbs3/readtext.c b/src/sbbs3/readtext.c new file mode 100644 index 0000000000..71d794d642 --- /dev/null +++ b/src/sbbs3/readtext.c @@ -0,0 +1,116 @@ +#include "sbbs.h" +#include "text_defaults.h" /* text_defaults */ + +/****************************************************************************/ +/* Reads special TEXT.DAT printf style text lines, splicing multiple lines, */ +/* replacing escaped characters, and allocating the memory */ +/****************************************************************************/ +char *readtext(long *line,FILE *stream,long dflt) +{ + char buf[2048],str[2048],tmp[256],*p,*p2; + int i,j,k; + + if(!fgets(buf,256,stream)) + goto use_default; + if(line) + (*line)++; + if(buf[0]=='#') + goto use_default; + p=strrchr(buf,'"'); + if(!p) { + if(line) + lprintf(LOG_ERR,"No quotation marks in line %d of text.dat",*line); + goto use_default; + } + if(*(p+1)=='\\') /* merge multiple lines */ + while(strlen(buf)<2000) { + if(!fgets(str,255,stream)) + goto use_default; + if(line) + (*line)++; + p2=strchr(str,'"'); + if(!p2) + continue; + strcpy(p,p2+1); + p=strrchr(p,'"'); + if(p && *(p+1)=='\\') + continue; + break; + } + *(p)=0; + k=strlen(buf); + for(i=1,j=0;i<k;j++) { + if(buf[i]=='\\') { /* escape */ + i++; + if(isdigit(buf[i])) { + str[j]=atoi(buf+i); /* decimal, NOT octal */ + if(isdigit(buf[++i])) /* skip up to 3 digits */ + if(isdigit(buf[++i])) + i++; + continue; + } + switch(buf[i++]) { + case '\\': + str[j]='\\'; + break; + case '?': + str[j]='?'; + break; + case 'x': + tmp[0]=buf[i++]; /* skip next character */ + tmp[1]=0; + if(isxdigit(buf[i])) { /* if another hex digit, skip too */ + tmp[1]=buf[i++]; + tmp[2]=0; + } + str[j]=(char)ahtoul(tmp); + break; + case '\'': + str[j]='\''; + break; + case '"': + str[j]='"'; + break; + case 'r': + str[j]=CR; + break; + case 'n': + str[j]=LF; + break; + case 't': + str[j]=TAB; + break; + case 'b': + str[j]=BS; + break; + case 'a': + str[j]=BEL; + break; + case 'f': + str[j]=FF; + break; + case 'v': + str[j]=11; /* VT */ + break; + default: + str[j]=buf[i]; + break; + } + continue; + } + str[j]=buf[i++]; + } + str[j]=0; + if((p=(char *)calloc(1,j+2))==NULL) { /* +1 for terminator, +1 for YNQX line */ + lprintf(LOG_CRIT,"Error allocating %u bytes of memory from text.dat",j); + goto use_default; + } + strcpy(p,str); + return(p); +use_default: + p=strdup(text_defaults[dflt]); + if(p==NULL) + lprintf(LOG_CRIT,"Error duplicating %s text defaults",text_defaults[dflt]); + return(p); +} + -- GitLab