home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / prof_c / 12sbuf / sb_test.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-08-11  |  4.8 KB  |  206 lines

  1. /*
  2.  *    sb_test -- driver for screen-buffer interface functions
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <conio.h>
  8. #include <local\std.h>
  9. #include <local\keydefs.h>
  10. #include <local\sbuf.h>
  11. #include <local\video.h>
  12. #include <local\box.h>
  13. #include "sb_test.h"
  14.  
  15. #define BEL 7
  16.  
  17. extern struct BUFFER Sbuf;
  18.  
  19. main(argc, argv)
  20. int argc;
  21. char *argv[];
  22. {
  23.     char *s, line[MAXLINE];
  24.     int k;
  25.     short i;
  26.     FILE *fp;
  27.     char fname[MAXPATH];
  28.     struct REGION *cmnd, *stat, *text, *help, *curwin;
  29.     unsigned char cmndattr, statattr, textattr, helpattr, curattr;
  30.     unsigned char ch, userattr;
  31.  
  32.     /* function prototypes */
  33.     int sb_init();
  34.     int sb_move(struct REGION *, short, short);
  35.     struct REGION *sb_new(short, short, short, short);
  36.     int sb_putc(struct REGION *, unsigned char);
  37.     int sb_puts(struct REGION *, char *);
  38.     int sb_show(short);
  39.     int sb_fill(struct REGION *, unsigned char, unsigned char);
  40.     char *get_fname(struct REGION *, char *, short);
  41.  
  42.     getstate();
  43.     readca(&ch, &userattr, Vpage);
  44.  
  45.     /* set up the screen buffer */
  46.     if (sb_init() == SB_ERR) {
  47.         fprintf(stderr, "Bad UPDATEMODE value in environment\n");
  48.         exit(1);
  49.     }
  50.  
  51.     /* set up windows and scrolling regions */
  52.     cmnd = sb_new(CMND_ROW, CMND_COL, CMND_HT, CMND_WID);
  53.     stat = sb_new(STAT_ROW, STAT_COL, STAT_HT, STAT_WID);
  54.     text = sb_new(TEXT_ROW, TEXT_COL, TEXT_HT, TEXT_WID);
  55.     help = sb_new(HELP_ROW, HELP_COL, HELP_HT, HELP_WID);
  56.     text->wflags |= SB_SCROLL;
  57.     sb_set_scrl(help, 1, 1, HELP_HT - 1, HELP_WID - 1);
  58.  
  59.     /* display each primary window in its own attribute */
  60.     cmndattr = GRN;
  61.     statattr = (WHT << 4) | BLK;
  62.     textattr = (BLU << 4) | CYAN;
  63.     helpattr = (GRN << 4) | YEL;
  64.     sb_fill(cmnd, ' ', cmndattr);
  65.     if (sb_move(cmnd, 0, 0) == SB_OK)
  66.         sb_puts(cmnd, "SB_TEST (Version 1.0)");
  67.     sb_fill(stat, ' ', statattr);
  68.     if (sb_move(stat, 0, 0) == SB_OK)
  69.         sb_puts(stat, "*** STATUS AREA ***");
  70.     for (i = 0; i <= text->r1 - text->r0; ++i) {
  71.         sb_move(text, i, 0);
  72.         sb_wca(text, i + 'a', textattr,
  73.             text->c1 - text->c0 + 1);
  74.     }
  75.     if (sb_move(text, 10, 25) == SB_OK)
  76.         sb_puts(text, " *** TEXT DISPLAY AREA *** ");
  77.     sb_show(Vpage);
  78.     curwin = text;
  79.     curattr = textattr;
  80.  
  81.     /* respond to user commands */
  82.     while ((k = getkey()) != K_ESC) {
  83.         switch (k) {
  84.         case K_UP:
  85.             sb_scrl(curwin, 1);
  86.             break;
  87.         case K_DOWN:
  88.             sb_scrl(curwin, -1);
  89.             break;
  90.         case K_PGUP:
  91.             sb_scrl(curwin, curwin->sr1 - curwin->sr0);
  92.             break;
  93.         case K_PGDN:
  94.             sb_scrl(curwin, -(curwin->sr1 - curwin->sr0));
  95.             break;
  96.         case K_ALTC:
  97.             /* clear the current window */
  98.             sb_fill(curwin, ' ', curattr);
  99.             break;
  100.         case K_ALTH:
  101.             /* display help */
  102.             curwin = help;
  103.             curattr = helpattr;
  104.             for (i = 0; i < help->r1 - help->r0; ++i) {
  105.                 sb_move(help, i, 0);
  106.                 sb_wca(help, i + 'a', helpattr,
  107.                     help->c1 - help->c0 + 1);
  108.             }
  109.             sb_box(help, BOXBLK, helpattr);
  110.             break;
  111.         case K_ALTS:
  112.             /* fill the command area with letters */
  113.             curwin = stat;
  114.             curattr = statattr;
  115.             sb_fill(stat, 's', statattr);
  116.             break;
  117.         case K_ALTT:
  118.             /* fill the text area */
  119.             curwin = text;
  120.             curattr = textattr;
  121.             for (i = 0; i <= text->r1 - text->r0; ++i) {
  122.                 sb_move(text, i, 0);
  123.                 sb_wca(text, i + 'a', textattr,
  124.                     text->c1 - text->c0 + 1);
  125.             }
  126.             break;
  127.         case K_ALTR:
  128.             /* read a file into the current window */
  129.             sb_fill(stat, ' ', statattr);
  130.             sb_move(stat, 0, 0);
  131.             sb_puts(stat, "File to read: ");
  132.             sb_show(Vpage);
  133.             (void)get_fname(stat, fname, MAXPATH);
  134.             if ((fp = fopen(fname, "r")) == NULL) {
  135.                 sb_fill(stat, ' ', statattr);
  136.                 sb_move(stat, 0, 0);
  137.                 sb_puts(stat, "Cannot open ");
  138.                 sb_puts(stat, fname);
  139.             }
  140.             else {
  141.                 sb_fill(stat, ' ', statattr);
  142.                 sb_move(stat, 0, 0);
  143.                 sb_puts(stat, "File: ");
  144.                 sb_puts(stat, fname);
  145.                 sb_show(Vpage);
  146.                 sb_fill(text, ' ', textattr);
  147.                 sb_move(text, 0, 0);
  148.                 putcur(text->r0, text->c0, Vpage);
  149.                 while ((s = fgets(line, MAXLINE, fp)) != NULL) {
  150.                     if (sb_puts(text, s) == SB_ERR) {
  151.                         clrscrn(userattr);
  152.                         putcur(0, 0, Vpage);
  153.                         fprintf(stderr, "puts error\n");
  154.                         exit(1);
  155.                     }
  156.                     sb_show(Vpage);
  157.                 }
  158.                 if (ferror(fp)) {
  159.                     putcur(text->r0, text->c0, Vpage);
  160.                     fprintf(stderr, "Error reading file\n");
  161.                 }
  162.                 fclose(fp);
  163.             }
  164.             break;
  165.         default:
  166.             /* say what? */
  167.             fputc(BEL, stderr);
  168.             continue;
  169.         }
  170.         if ((Sbuf.flags & SB_DELTA) == SB_DELTA)
  171.             sb_show(Vpage);
  172.     }
  173.  
  174.     clrscrn(userattr);
  175.     putcur(0, 0, Vpage);
  176.     exit(0);
  177. }
  178.  
  179. /*
  180.  *    get_fname -- get a filename from the user
  181.  */
  182.  
  183. char *
  184. get_fname(win, path, lim)
  185. struct REGION *win;
  186. char *path;
  187. short lim;
  188. {
  189.     int ch;
  190.     char *s;
  191.  
  192.     s = path;
  193.     sb_show(Vpage);
  194.     while ((ch = getch()) != K_RETURN) {
  195.         if (ch == '\b')
  196.             --s;
  197.         else {
  198.             sb_putc(win, ch);
  199.             *s++ = ch;
  200.         }
  201.         sb_show(Vpage);
  202.     }
  203.     *s = '\0';
  204.     return (path);
  205. }
  206.