Annotation of sbbs/src/sbbs3/readtext.c, revision 1.1.1.1

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.