home *** CD-ROM | disk | FTP | other *** search
/ Boldly Go Collection / version40.iso / TS / 17A / DRWIN101.ZIP / WNDUTIL.CPP < prev    next >
C/C++ Source or Header  |  1991-10-08  |  9KB  |  222 lines

  1. #include <stdiostr.h>
  2. #include <stdarg.h>
  3. #include <ctype.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6.  
  7. #include "scrutil.hpp"
  8. #include "wndutil.hpp"
  9.  
  10.  
  11. TextScreen tscr;                       //create a single text screen
  12.  
  13.  
  14. //===========================================================================
  15. Wind::Wind(void)
  16. {
  17.   srow=3*tscr.rows/8;
  18.   scol=3*tscr.cols/8;
  19.       int rs=tscr.rows/4,cs=tscr.cols/4;
  20.       rows=cols=0;                         //first indicate failure
  21.       if ((rs<MIN_ROWS)||(rs>MAX_ROWS)) return;   //fail
  22.       if ((cs<MIN_COLS)||(cs>MAX_COLS)) return;   //fail
  23.       rows=rs;                             //set rows
  24.       cols=cs;                             //set columns
  25.       txt=new (WORD[rows*cols]);           //allocate space for text
  26.       if (txt==NULL) {                     //if no room..
  27.         rows=cols=0;                       //..reset things
  28.         return;                            //..exit
  29.       }
  30.       row=0;                               //start at upper
  31.       col=0;                               //left corner
  32.       att=DEF_ATT;                         //use default attributes
  33.       fil=DEF_FIL;                         //use default fill character
  34.       nam[0]=0;                            //don't set up a name
  35.       fl.wrap=1;                           //wrapping
  36.       fl.scroll=1;                         //scrolling
  37.       border_att=att;
  38.       border_lines=1;
  39.   update=1;                            //force update
  40.       Clr();                               //clear the buffer
  41. }   //Wind::Wind(void)
  42.  
  43.  
  44. //===========================================================================
  45. Wind::Wind(int r0,int c0,int r1,int c1,char *cfg,...)
  46. {
  47.   va_list va;
  48.   char cfg_str[0x100];
  49.  
  50.   va_start(va,cfg);
  51.   vsprintf(cfg_str,cfg,va);
  52.   va_end(va);
  53.  
  54.   r1 -= r0-1;                          //get size in rows
  55.   c1 -= c0-1;                          //get size in columns
  56.   if ((r1<1)||(r1>tscr.rows)) r1=tscr.rows>>2;
  57.   if ((c1<1)||(c1>tscr.cols)) c1=tscr.cols>>2;
  58.   if ((r0<0)||((r0+r1)>tscr.rows)) r0=0;
  59.   if ((c0<0)||((c0+c1)>tscr.cols)) c0=0;
  60.   srow=r0;
  61.   scol=c0;
  62. //  TBuf::TBuf(r1,c1);
  63.       int rs=r1,cs=c1;
  64.       rows=cols=0;                         //first indicate failure
  65.       if ((rs<MIN_ROWS)||(rs>MAX_ROWS)) return;   //fail
  66.       if ((cs<MIN_COLS)||(cs>MAX_COLS)) return;   //fail
  67.       rows=rs;                             //set rows
  68.       cols=cs;                             //set columns
  69.       txt=new (WORD[rows*cols]);           //allocate space for text
  70.       if (txt==NULL) {                     //if no room..
  71.         rows=cols=0;                       //..reset things
  72.         return;                            //..exit
  73.       }
  74.       row=0;                               //start at upper
  75.       col=0;                               //left corner
  76.       att=DEF_ATT;                         //use default attributes
  77.       fil=DEF_FIL;                         //use default fill character
  78.       nam[0]=0;                            //don't set up a name
  79.       fl.wrap=1;                           //wrapping
  80.       fl.scroll=1;                         //scrolling
  81.       border_att=att;
  82.       border_lines=1;
  83.   update=1;                                //force and update
  84.   Config(cfg_str);                         //set configuration string values
  85.       Clr();                               //clear the buffer
  86. }   //Wind(int,int,int,int,char*,...)
  87.  
  88.  
  89. //===========================================================================
  90. void Wind::Config(char* cfg)           //set values via configuration string
  91. {
  92.   if (!cfg) return;
  93.   while (*cfg) {
  94.     while (*cfg && isspace(*cfg)) cfg++;
  95.     switch (*cfg++) {
  96.     case 'f': att&=0xF0; att|=atoi(cfg)&0x0F; break;
  97.     case 'b': att&=0x0F; att|=(atoi(cfg)&0x0F)<<4; break;
  98.     case 'u': if (*cfg=='0') update=0; else update=1; break;
  99.     case 's': if (*cfg=='0') fl.scroll=0; else fl.scroll=1; break;
  100.     case 'w': if (*cfg=='0') fl.wrap=0; else fl.wrap=1; break;
  101.     case 'r': row=atoi(cfg); if ((row<0)||(row>=rows)) row=0; break;
  102.     case 'c': col=atoi(cfg); if ((col<0)||(col>=cols)) col=0; break;
  103.     case 'L': border_lines=atoi(cfg); break;
  104.     case 'F': border_att&=0xF0; border_att|=atoi(cfg)&0x0F; break;
  105.     case 'B': border_att&=0x0F; border_att|=(atoi(cfg)&0x0F)<<4; break;
  106.     case 'N': strncpy(nam,cfg,sizeof(nam)-1); nam[sizeof(nam)-1]=0; break;
  107.     default:
  108.       ;
  109.     }   //switch
  110.     while (*cfg && !isspace(*cfg)) cfg++;
  111.   }   //while
  112. }   //Wind::Config(char*)
  113.  
  114.  
  115. //===========================================================================
  116. void Wind::Configf(char *cfg,...)
  117. {
  118.   va_list va;
  119.   char cfg_str[0x100];
  120.  
  121.   va_start(va,cfg);
  122.   vsprintf(cfg_str,cfg,va);
  123.   va_end(va);
  124.   Config(cfg_str);
  125. }   //Wind::Configf(char*,...)
  126.  
  127.  
  128. //===========================================================================
  129. void Wind::Printf(char *fmt,...)       //formatted print
  130. {
  131.   va_list va;                          //variable argument list
  132.   int l;                               //length of string
  133.   char b[256];                         //buffer to hold string
  134.  
  135.   va_start(va,fmt);                    //open va list
  136.   l=vsprintf(b,fmt,va);                //write into a string
  137.   va_end(va);                          //close va list
  138.   Put(b,l);                            //put out string of l chars
  139. }   //Wind::Printf
  140.  
  141.  
  142.  
  143. //===========================================================================
  144. void Wind::Update(void)
  145. {
  146.   WORD far* vp;
  147.   WORD* tp=txt;
  148.  
  149.   ShowBorder(border_lines);
  150.   for (int r=0;r<rows;r++) {
  151.     vp=&tscr.video[(r+srow)*tscr.cols+scol];
  152.     for (int c=0;c<cols;c++) *vp++=*tp++;
  153.   }   //for each row
  154.   setcpos(srow+row,scol+col);
  155.   update=1;
  156. }   //Wind::Update(void)
  157.  
  158.  
  159. //===========================================================================
  160. void Wind::ShowBorder(int lines)
  161. {
  162. #define TOPLEFT    0
  163. #define HORIZ      1
  164. #define TOP_T      2
  165. #define TOPRIGHT   3
  166. #define VERT       4
  167. #define LEFT_T     5
  168. #define MIDDLE     6
  169. #define RIGHT_T    7
  170. #define BOTLEFT    8
  171. #define BOT_T      9
  172. #define BOTRIGHT   10
  173.   static BYTE text_lines[]={           //text mode graphics characters
  174.     '\x20','\x20','\x20','\x20','\x20','\x20',
  175.     '\x20','\x20','\x20','\x20','\x20','\x00',
  176.     '\xDA','\xC4','\xC2','\xBF','\xB3','\xC3',
  177.     '\xC5','\xB4','\xC0','\xC1','\xD9','\x00',
  178.     '\xC9','\xCD','\xCB','\xBB','\xBA','\xCC',
  179.     '\xCE','\xB9','\xC8','\xCA','\xBC','\x00'
  180.   };
  181.  
  182.   if (lines==0) lines=0;               //offset in table
  183.   else if (lines==2) lines=24;
  184.   else lines=12;                       //default to one line
  185.  
  186.   WORD ac;                             //attribute:character
  187.   WORD far* vp;                        //pointer into video memory
  188.   char *p;                             //pointer to name
  189.   int  k;                              //row/col counter
  190.   int  l;                              //length
  191.  
  192.   ac=border_att<<8;                    //get border attribute
  193.   l=0;                                 //initialize length to 0
  194.   p=nam;                               //point to name of window
  195.   if (p!=NULL) l=strlen(p);            //get length of name
  196.   vp=tscr.video;                       //start at top of screen
  197.   vp+=(srow-1)*tscr.cols;              //offset to first border row
  198.   vp+=(scol-1);                        //offset to correct column
  199.   *vp++=ac|text_lines[lines+TOPLEFT];  //write top left character
  200.   for (k=0;k<cols;k++) {               //go through each column
  201.     if (k<l)                           //if still writing prompt...
  202.       *vp++=ac|*p++;                   //...write out prompt character
  203.     else                               //otherwise...
  204.       *vp++=ac|text_lines[lines+HORIZ];  //...write out horizontal bar
  205.   }     //for
  206.   *vp++=ac|text_lines[lines+TOPRIGHT]; //write top right character
  207.   ac|=text_lines[lines+VERT];
  208.   for (k=0;k<rows;k++) {               //write out side walls on each row
  209.     vp+=(tscr.cols-cols-2);            //point to left side wall
  210.     *vp++=ac;                          //write out vertical character
  211.     vp+=cols;                          //go to right wall
  212.     *vp++=ac;                          //write out vertical character
  213.   }     //for
  214.   ac&=0xFF00;                          //clear out the vertical character
  215.   vp+=(tscr.cols-cols-2);              //point to bottom left
  216.   *vp++=ac|text_lines[lines+BOTLEFT];  //write bottom left character
  217.   for (k=0;k<cols;k++)                 //go through each column
  218.     *vp++=ac|text_lines[lines+HORIZ];  //write out horizontal
  219.   *vp++=ac|text_lines[lines+BOTRIGHT]; //write bottom right character
  220. }  //Wind::ShowBoarder(int)
  221.  
  222.