Annotation of sbbs/src/sbbs3/readtext.c, revision 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.