home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1998 September / PCO_0998.ISO / filesbbs / dos / sbbs_src.exe / SBBS / PUTMSG.C < prev    next >
Encoding:
C/C++ Source or Header  |  1997-04-13  |  5.5 KB  |  196 lines

  1. #line 1 "PUTMSG.C"
  2.  
  3. /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
  4.  
  5. #include "sbbs.h"
  6.  
  7. /****************************************************************************/
  8. /* Outputs a NULL terminated string locally and remotely (if applicable)    */
  9. /* checking for message aborts, pauses, ANSI escape and ^A sequences.        */
  10. /* Changes local text attributes if necessary. Max length of str is 4 gig    */
  11. /* Returns the last char of the buffer access.. 0 if not aborted.           */
  12. /* If P_SAVEATR bit is set in mode, the attributes set by the message       */
  13. /* will be the current attributes after the message is displayed, otherwise */
  14. /* the attributes prior to diplaying the message are always restored.       */
  15. /* Ignores Ctrl-Z's                                                         */
  16. /****************************************************************************/
  17. char putmsg(char HUGE16 *str, int mode)
  18. {
  19.     uchar    tmpatr,tmp2[256],tmp3[128],*p,exatr=0;
  20.     int     orgcon=console,i;
  21.     ulong    l=0,sys_status_sav=sys_status;
  22.  
  23. tmpatr=curatr;    /* was lclatr(-1) */
  24. if(!(mode&P_SAVEATR))
  25.     attr(LIGHTGRAY);
  26. while(str[l] && (mode&P_NOABORT || !msgabort()) && online) {
  27.     if(str[l]==1) {        /* Ctrl-Ax sequence */
  28.         if(str[l+1]=='"' && !(sys_status&SS_NEST_PF)) {  /* Quote a file */
  29.             l+=2;
  30.             i=0;
  31.             while(i<12 && isprint(str[l]) && str[l]!='\\' && str[l]!='/')
  32.                 tmp2[i++]=str[l++];
  33.             tmp2[i]=0;
  34.             sys_status|=SS_NEST_PF;     /* keep it only one message deep! */
  35.             sprintf(tmp3,"%s%s",text_dir,tmp2);
  36.             printfile(tmp3,0);
  37.             sys_status&=~SS_NEST_PF; }
  38.         else if(toupper(str[l+1])=='Z')             /* Ctrl-AZ==EOF */
  39.             break;
  40.         else {
  41.             ctrl_a(str[l+1]);
  42.             l+=2; } }
  43.     else if((str[l]=='`' || str[l]=='·') && str[l+1]=='[') {   
  44.         outchar(ESC); /* Convert `[ and ·[ to ESC[ */
  45.         l++; }
  46.     else if(sys_misc&SM_PCBOARD && str[l]=='@' && str[l+1]=='X'
  47.         && isxdigit(str[l+2]) && isxdigit(str[l+3])) {
  48.         sprintf(tmp2,"%.2s",str+l+2);
  49.         attr(ahtoul(tmp2));
  50.         exatr=1;
  51.         l+=4; }
  52.     else if(sys_misc&SM_WILDCAT && str[l]=='@' && str[l+3]=='@'
  53.         && isxdigit(str[l+1]) && isxdigit(str[l+2])) {
  54.         sprintf(tmp2,"%.2s",str+l+1);
  55.         attr(ahtoul(tmp2));
  56.         // exatr=1;
  57.         l+=4; }
  58.     else if(sys_misc&SM_RENEGADE && str[l]=='|' && isdigit(str[l+1])
  59.         && !(useron.misc&(RIP|WIP))) {
  60.         sprintf(tmp2,"%.2s",str+l+1);
  61.         i=atoi(tmp2);
  62.         if(i>=16) {                  /* setting background */
  63.             i-=16;
  64.             i<<=4;
  65.             i|=(curatr&0x0f); }     /* leave foreground alone */
  66.         else
  67.             i|=(curatr&0xf0);        /* leave background alone */
  68.         attr(i);
  69.         exatr=1;
  70.         l+=2;    /* Skip |x */
  71.         if(isdigit(str[l]))
  72.             l++; }    /* Skip second digit if it exists */
  73.     else if(sys_misc&SM_CELERITY && str[l]=='|' && isalpha(str[l+1])
  74.         && !(useron.misc&(RIP|WIP))) {
  75.         switch(str[l+1]) {
  76.             case 'k':
  77.                 attr((curatr&0xf0)|BLACK);
  78.                 break;
  79.             case 'b':
  80.                 attr((curatr&0xf0)|BLUE);
  81.                 break;
  82.             case 'g':
  83.                 attr((curatr&0xf0)|GREEN);
  84.                 break;
  85.             case 'c':
  86.                 attr((curatr&0xf0)|CYAN);
  87.                 break;
  88.             case 'r':
  89.                 attr((curatr&0xf0)|RED);
  90.                 break;
  91.             case 'm':
  92.                 attr((curatr&0xf0)|MAGENTA);
  93.                 break;
  94.             case 'y':
  95.                 attr((curatr&0xf0)|YELLOW);
  96.                 break;
  97.             case 'w':
  98.                 attr((curatr&0xf0)|LIGHTGRAY);
  99.                 break;
  100.             case 'd':
  101.                 attr((curatr&0xf0)|BLACK|HIGH);
  102.                 break;
  103.             case 'B':
  104.                 attr((curatr&0xf0)|BLUE|HIGH);
  105.                 break;
  106.             case 'G':
  107.                 attr((curatr&0xf0)|GREEN|HIGH);
  108.                 break;
  109.             case 'C':
  110.                 attr((curatr&0xf0)|CYAN|HIGH);
  111.                 break;
  112.             case 'R':
  113.                 attr((curatr&0xf0)|RED|HIGH);
  114.                 break;
  115.             case 'M':
  116.                 attr((curatr&0xf0)|MAGENTA|HIGH);
  117.                 break;
  118.             case 'Y':   /* Yellow */
  119.                 attr((curatr&0xf0)|YELLOW|HIGH);
  120.                 break;
  121.             case 'W':
  122.                 attr((curatr&0xf0)|LIGHTGRAY|HIGH);
  123.                 break;
  124.             case 'S':   /* swap foreground and background */
  125.                 attr((curatr&0x07)<<4);
  126.                 break; }
  127.         exatr=1;
  128.         l+=2;    /* Skip |x */
  129.         }  /* Skip second digit if it exists */
  130.     else if(sys_misc&SM_WWIV && str[l]==3 && isdigit(str[l+1])) {
  131.         exatr=1;
  132.         switch(str[l+1]) {
  133.             default:
  134.                 attr(LIGHTGRAY);
  135.                 break;
  136.             case '1':
  137.                 attr(CYAN|HIGH);
  138.                 break;
  139.             case '2':
  140.                 attr(BROWN|HIGH);
  141.                 break;
  142.             case '3':
  143.                 attr(MAGENTA);
  144.                 break;
  145.             case '4':
  146.                 attr(LIGHTGRAY|HIGH|(BLUE<<4));
  147.                 break;
  148.             case '5':
  149.                 attr(GREEN);
  150.                 break;
  151.             case '6':
  152.                 attr(RED|HIGH|BLINK);
  153.                 break;
  154.             case '7':
  155.                 attr(BLUE|HIGH);
  156.                 break;
  157.             case '8':
  158.                 attr(BLUE);
  159.                 break;
  160.             case '9':
  161.                 attr(CYAN);
  162.                 break; }
  163.         l+=2; }
  164.     else {
  165.         if(exatr && str[l]==LF)     /* clear at newline for extra attr codes */
  166.             attr(LIGHTGRAY);
  167.         if(lclaes()) {
  168.             if(str[l]=='A' || str[l]=='B' || str[l]=='H' || str[l]=='J'
  169.                 || str[l]=='f' || str[l]=='u')    /* ANSI anim */
  170.                 lncntr=0;            /* so defeat pause */
  171.             if(str[l]=='"') {
  172.                 l++;                /* don't pass on keyboard reassignment */
  173.                 continue; } }
  174.         if(str[l]=='!' && str[l+1]=='|' && useron.misc&(RIP|WIP)) /* RIP */
  175.             lncntr=0;                /* so defeat pause */
  176.         if(str[l]==ESC && str[l+1]=='$')    /* WIP command */
  177.             lncntr=0;
  178.         if(str[l]=='@' && !(mode&P_NOATCODES)) {
  179.             i=atcodes((char *)str+l);    /* returns 0 if not valid @ code */
  180.             l+=i;                    /* i is length of code string */
  181.             if(i)                    /* if valid string, go to top */
  182.                 continue; }
  183.         if(str[l]!=26)
  184.             outchar(str[l]);
  185.         l++; } }
  186. //curatr=lclatr(-1);        01/29/96
  187. if(!(mode&P_SAVEATR)) {
  188.     console=orgcon;
  189.     attr(tmpatr); }
  190.  
  191. /* Restore original settings of Forced Pause On/Off */
  192. sys_status&=~(SS_PAUSEOFF|SS_PAUSEON);
  193. sys_status|=(sys_status_sav&(SS_PAUSEOFF|SS_PAUSEON));
  194. return(str[l]);
  195. }
  196.