home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_300 / 328_02 / wprompts.c < prev    next >
C/C++ Source or Header  |  1991-03-17  |  2KB  |  129 lines

  1. /* wprompts.c
  2.  *
  3.  *
  4.  *    display a promp string, get a string in reply
  5.  *
  6.  */
  7. #include "wsys.h"
  8.  
  9.  
  10. #define BUTTON_LENGTH  30
  11.  
  12.  
  13. int wprompts ( char *title, char *prompt, char *reply, int nbytes)
  14.     {
  15.     int lastkey;
  16.  
  17.     int l = 0, r = 10 ;       /* left and right borders of message */
  18.     int t;               /* position of top of window... */
  19.     int linecnt;          /* #lines in message */
  20.     int len;
  21.  
  22.     char *buffer;        /* hold working copy of reply */
  23.  
  24.  
  25.     unsigned char color;
  26.  
  27.     int  x_gets, y_gets;    /* start positions of string to get */
  28.  
  29.  
  30.  
  31.     /* 'normalize' the pointers  (if the memory model requires it)
  32.      * so we can add to them without wrapping around
  33.      * segment boundaries
  34.      */
  35.     _NORMALIZE (title);
  36.     _NORMALIZE (prompt);
  37.  
  38.  
  39.  
  40.     buffer = wmalloc (nbytes, "wprompts");
  41.  
  42.  
  43.  
  44.  
  45.     /* count lines in message  and size of largest line
  46.      * allow 1 blank line below title, 1 below prompt, 1 below instring
  47.      * and 1 at bottom for ESCAPE/ENTER/ORIGINAL buttons
  48.      */
  49.  
  50.     wstrrowcol (prompt, &linecnt, &r );
  51.     r       += 2;
  52.     linecnt += 4;
  53.  
  54.  
  55.     /* now check length of title and button lines,
  56.      *  see if it's longer than the prompt
  57.      */
  58.     len = strlen (title) +2;
  59.     r = max ( r, len );
  60.  
  61.     r = max ( r, BUTTON_LENGTH );
  62.  
  63.  
  64.  
  65.     /* if nbytes is too long too fit on one line,
  66.      * use several lines
  67.      */
  68.     if ( nbytes >= r  )
  69.         {
  70.         /* add number of lines needed to hold
  71.          * a long wrappping line
  72.          */
  73.         linecnt += ( nbytes / r );
  74.         }
  75.  
  76.  
  77.  
  78.     /* set location for message box
  79.      */
  80.     r += 2;
  81.  
  82.     wlocate ( &l, &t, r, linecnt+2 );
  83.  
  84.  
  85.     color = wgetattr();
  86.  
  87.     wopen (l, t, r, linecnt+2 /*allow for frame */,
  88.         color, DOUBLE_BORDER, BRIGHT | color, WSAVE2RAM);
  89.  
  90.  
  91.  
  92.     if (title)
  93.         wtitle (title);
  94.  
  95.  
  96.  
  97.  
  98.     wbutton_add ( "ESCAPE",   1, linecnt, 7, ESCAPE,    0);
  99.     wbutton_add ( "ENTER",   11, linecnt, 6, ENTER,     0);
  100.     wbutton_add ( "ORIGINAL",19, linecnt, 9, CTRL('O'), 0);
  101.  
  102.     wgoto (0,1);
  103.     wputs(prompt);
  104.  
  105.     x_gets = wherex ();
  106.     y_gets = wherey ();
  107.  
  108.     memcpy ( buffer, reply, nbytes );
  109.  
  110.     do
  111.         {
  112.         wgoto ( x_gets, y_gets );
  113.         lastkey = wgets ( nbytes, buffer, 0 );
  114.         }
  115.     while ( ! ( lastkey == ENTER || lastkey == ESCAPE ) );
  116.  
  117.  
  118.     if ( lastkey == ENTER )
  119.         {
  120.         memcpy ( reply, buffer, nbytes );
  121.         }
  122.  
  123.     free (buffer);
  124.  
  125.  
  126.     wclose ();
  127.  
  128.     return (lastkey);
  129.     }