Annotation of sbbs/src/sbbs3/putmsg.cpp, revision 1.1.1.1

1.1       root        1: /* putmsg.cpp */
                      2: 
                      3: /* Synchronet message/menu display routine */
                      4:  
                      5: /* $Id: putmsg.cpp,v 1.17 2006/02/08 00:47:11 rswindell Exp $ */
                      6: 
                      7: /****************************************************************************
                      8:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
                      9:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
                     10:  *                                                                                                                                                     *
                     11:  * Copyright 2006 Rob Swindell - http://www.synchro.net/copyright.html         *
                     12:  *                                                                                                                                                     *
                     13:  * This program is free software; you can redistribute it and/or                       *
                     14:  * modify it under the terms of the GNU General Public License                         *
                     15:  * as published by the Free Software Foundation; either version 2                      *
                     16:  * of the License, or (at your option) any later version.                                      *
                     17:  * See the GNU General Public License for more details: gpl.txt or                     *
                     18:  * http://www.fsf.org/copyleft/gpl.html                                                                                *
                     19:  *                                                                                                                                                     *
                     20:  * Anonymous FTP access to the most recent released source is available at     *
                     21:  * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net     *
                     22:  *                                                                                                                                                     *
                     23:  * Anonymous CVS access to the development source and modification history     *
                     24:  * is available at cvs.synchro.net:/cvsroot/sbbs, example:                                     *
                     25:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs login                       *
                     26:  *     (just hit return, no password is necessary)                                                     *
                     27:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src                *
                     28:  *                                                                                                                                                     *
                     29:  * For Synchronet coding style and modification guidelines, see                                *
                     30:  * http://www.synchro.net/source.html                                                                          *
                     31:  *                                                                                                                                                     *
                     32:  * You are encouraged to submit any modifications (preferably in Unix diff     *
                     33:  * format) via e-mail to [email protected]                                                                      *
                     34:  *                                                                                                                                                     *
                     35:  * Note: If this box doesn't appear square, then you need to fix your tabs.    *
                     36:  ****************************************************************************/
                     37: 
                     38: #include "sbbs.h"
                     39: 
                     40: /****************************************************************************/
                     41: /* Outputs a NULL terminated string locally and remotely (if applicable)       */
                     42: /* checking for message aborts, pauses, ANSI escape and ^A sequences.          */
                     43: /* Changes local text attributes if necessary. Max length of str is 4 gig      */
                     44: /* Returns the last char of the buffer access.. 0 if not aborted.           */
                     45: /* If P_SAVEATR bit is set in mode, the attributes set by the message       */
                     46: /* will be the current attributes after the message is displayed, otherwise */
                     47: /* the attributes prior to diplaying the message are always restored.       */
                     48: /* Ignores Ctrl-Z's                                                         */
                     49: /****************************************************************************/
                     50: char sbbs_t::putmsg(char *str, long mode)
                     51: {
                     52:        char    tmpatr,tmp2[256],tmp3[128];
                     53:        uchar   exatr=0;
                     54:        int     orgcon=console,i;
                     55:        ulong   l=0,sys_status_sav=sys_status;
                     56:        long    col=0;
                     57: 
                     58:        attr_sp=0;      /* clear any saved attributes */
                     59:        tmpatr=curatr;  /* was lclatr(-1) */
                     60:        if(!(mode&P_SAVEATR))
                     61:                attr(LIGHTGRAY);
                     62:        if(mode&P_NOPAUSE)
                     63:                sys_status|=SS_PAUSEOFF;
                     64:        if(mode&P_HTML)
                     65:                putcom("\x02\x02");
                     66:        while(str[l] && (mode&P_NOABORT || !msgabort()) && online) {
                     67:                if(str[l]==CTRL_A && str[l+1]!=0) {
                     68:                        if(str[l+1]=='"' && !(sys_status&SS_NEST_PF)) {  /* Quote a file */
                     69:                                l+=2;
                     70:                                i=0;
                     71:                                while(i<12 && isprint(str[l]) && str[l]!='\\' && str[l]!='/')
                     72:                                        tmp2[i++]=str[l++];
                     73:                                tmp2[i]=0;
                     74:                                sys_status|=SS_NEST_PF;         /* keep it only one message deep! */
                     75:                                sprintf(tmp3,"%s%s",cfg.text_dir,tmp2);
                     76:                                printfile(tmp3,0);
                     77:                                sys_status&=~SS_NEST_PF; 
                     78:                        }
                     79:                        else if(toupper(str[l+1])=='Z')             /* Ctrl-AZ==EOF */
                     80:                                break;
                     81:                        else {
                     82:                                ctrl_a(str[l+1]);
                     83:                                l+=2; 
                     84:                        } 
                     85:                }
                     86:                else if((str[l]=='`' || str[l]=='�') && str[l+1]=='[') {   
                     87:                        outchar(ESC); /* Convert `[ and �[ to ESC[ */
                     88:                        l++; 
                     89:                }
                     90:                else if(cfg.sys_misc&SM_PCBOARD && str[l]=='@' && str[l+1]=='X'
                     91:                        && isxdigit(str[l+2]) && isxdigit(str[l+3])) {
                     92:                        sprintf(tmp2,"%.2s",str+l+2);
                     93:                        attr(ahtoul(tmp2));
                     94:                        exatr=1;
                     95:                        l+=4; 
                     96:                }
                     97:                else if(cfg.sys_misc&SM_WILDCAT && str[l]=='@' && str[l+3]=='@'
                     98:                        && isxdigit(str[l+1]) && isxdigit(str[l+2])) {
                     99:                        sprintf(tmp2,"%.2s",str+l+1);
                    100:                        attr(ahtoul(tmp2));
                    101:                        // exatr=1;
                    102:                        l+=4; 
                    103:                }
                    104:                else if(cfg.sys_misc&SM_RENEGADE && str[l]=='|' && isdigit(str[l+1])
                    105:                        && isdigit(str[l+2]) && !(useron.misc&(RIP|WIP))) {
                    106:                        sprintf(tmp2,"%.2s",str+l+1);
                    107:                        i=atoi(tmp2);
                    108:                        if(i>=16) {                             /* setting background */
                    109:                                i-=16;
                    110:                                i<<=4;
                    111:                                i|=(curatr&0x0f);               /* leave foreground alone */
                    112:                        }       
                    113:                        else
                    114:                                i|=(curatr&0xf0);               /* leave background alone */
                    115:                        attr(i);
                    116:                        exatr=1;
                    117:                        l+=3;   /* Skip |xx */
                    118:                }       
                    119:                else if(cfg.sys_misc&SM_CELERITY && str[l]=='|' && isalpha(str[l+1])
                    120:                        && !(useron.misc&(RIP|WIP))) {
                    121:                        switch(str[l+1]) {
                    122:                                case 'k':
                    123:                                        attr((curatr&0xf0)|BLACK);
                    124:                                        break;
                    125:                                case 'b':
                    126:                                        attr((curatr&0xf0)|BLUE);
                    127:                                        break;
                    128:                                case 'g':
                    129:                                        attr((curatr&0xf0)|GREEN);
                    130:                                        break;
                    131:                                case 'c':
                    132:                                        attr((curatr&0xf0)|CYAN);
                    133:                                        break;
                    134:                                case 'r':
                    135:                                        attr((curatr&0xf0)|RED);
                    136:                                        break;
                    137:                                case 'm':
                    138:                                        attr((curatr&0xf0)|MAGENTA);
                    139:                                        break;
                    140:                                case 'y':
                    141:                                        attr((curatr&0xf0)|YELLOW);
                    142:                                        break;
                    143:                                case 'w':
                    144:                                        attr((curatr&0xf0)|LIGHTGRAY);
                    145:                                        break;
                    146:                                case 'd':
                    147:                                        attr((curatr&0xf0)|BLACK|HIGH);
                    148:                                        break;
                    149:                                case 'B':
                    150:                                        attr((curatr&0xf0)|BLUE|HIGH);
                    151:                                        break;
                    152:                                case 'G':
                    153:                                        attr((curatr&0xf0)|GREEN|HIGH);
                    154:                                        break;
                    155:                                case 'C':
                    156:                                        attr((curatr&0xf0)|CYAN|HIGH);
                    157:                                        break;
                    158:                                case 'R':
                    159:                                        attr((curatr&0xf0)|RED|HIGH);
                    160:                                        break;
                    161:                                case 'M':
                    162:                                        attr((curatr&0xf0)|MAGENTA|HIGH);
                    163:                                        break;
                    164:                                case 'Y':   /* Yellow */
                    165:                                        attr((curatr&0xf0)|YELLOW|HIGH);
                    166:                                        break;
                    167:                                case 'W':
                    168:                                        attr((curatr&0xf0)|LIGHTGRAY|HIGH);
                    169:                                        break;
                    170:                                case 'S':   /* swap foreground and background */
                    171:                                        attr((curatr&0x07)<<4);
                    172:                                        break; 
                    173:                        }
                    174:                        exatr=1;
                    175:                        l+=2;   /* Skip |x */
                    176:                }  /* Skip second digit if it exists */
                    177:                else if(cfg.sys_misc&SM_WWIV && str[l]==CTRL_C && isdigit(str[l+1])) {
                    178:                        exatr=1;
                    179:                        switch(str[l+1]) {
                    180:                                default:
                    181:                                        attr(LIGHTGRAY);
                    182:                                        break;
                    183:                                case '1':
                    184:                                        attr(CYAN|HIGH);
                    185:                                        break;
                    186:                                case '2':
                    187:                                        attr(BROWN|HIGH);
                    188:                                        break;
                    189:                                case '3':
                    190:                                        attr(MAGENTA);
                    191:                                        break;
                    192:                                case '4':
                    193:                                        attr(LIGHTGRAY|HIGH|BG_BLUE);
                    194:                                        break;
                    195:                                case '5':
                    196:                                        attr(GREEN);
                    197:                                        break;
                    198:                                case '6':
                    199:                                        attr(RED|HIGH|BLINK);
                    200:                                        break;
                    201:                                case '7':
                    202:                                        attr(BLUE|HIGH);
                    203:                                        break;
                    204:                                case '8':
                    205:                                        attr(BLUE);
                    206:                                        break;
                    207:                                case '9':
                    208:                                        attr(CYAN);
                    209:                                        break; 
                    210:                        }
                    211:                        l+=2; 
                    212:                }
                    213:                else {
                    214:                        if(str[l]=='\n') {
                    215:                                if(exatr)       /* clear at newline for extra attr codes */
                    216:                                        attr(LIGHTGRAY);
                    217:                                if(l==0 || str[l-1]!='\r')      /* expand sole LF to CR/LF */
                    218:                                        outchar('\r');
                    219:                        }
                    220: 
                    221:                        /* ansi escape sequence */
                    222:                        if(outchar_esc) {
                    223:                                if(str[l]=='A' || str[l]=='B' || str[l]=='H' || str[l]=='J'
                    224:                                        || str[l]=='f' || str[l]=='u')    /* ANSI anim */
                    225:                                        lncntr=0;                       /* so defeat pause */
                    226:                                if(str[l]=='"') {
                    227:                                        l++;                            /* don't pass on keyboard reassignment */
                    228:                                        continue; 
                    229:                                } 
                    230:                        }
                    231:                        if(str[l]=='!' && str[l+1]=='|' && useron.misc&(RIP|WIP)) /* RIP */
                    232:                                lncntr=0;                               /* so defeat pause */
                    233:                        if(str[l]==ESC && str[l+1]=='$')    /* WIP command */
                    234:                                lncntr=0;
                    235:                        if(str[l]=='@' && !(mode&P_NOATCODES)) {
                    236:                                i=show_atcode((char *)str+l);   /* returns 0 if not valid @ code */
                    237:                                l+=i;                                   /* i is length of code string */
                    238:                                if(i)                                   /* if valid string, go to top */
                    239:                                        continue; 
                    240:                        }
                    241:                        if(str[l]!=CTRL_Z) {
                    242:                                outchar(str[l]);
                    243:                                if(!exatr && !outchar_esc && lncntr && lbuflen && cols && ++col==cols)
                    244:                                        lncntr++;
                    245:                                else
                    246:                                        col=0;
                    247:                        }
                    248:                        l++; 
                    249:                } 
                    250:        }
                    251:        if(!(mode&P_SAVEATR)) {
                    252:                console=orgcon;
                    253:                attr(tmpatr); 
                    254:        }
                    255:        if(mode&P_HTML)
                    256:                putcom("\x02");
                    257: 
                    258:        attr_sp=0;      /* clear any saved attributes */
                    259:        /* Restore original settings of Forced Pause On/Off */
                    260:        sys_status&=~(SS_PAUSEOFF|SS_PAUSEON);
                    261:        sys_status|=(sys_status_sav&(SS_PAUSEOFF|SS_PAUSEON));
                    262:        return(str[l]);
                    263: }
                    264: 

unix.superglobalmegacorp.com

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