home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / ABUSESRC.ZIP / AbuseSrc / macabuse / src / text_gui.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-05-20  |  11.1 KB  |  495 lines

  1. #include "lisp.hpp"
  2. #include "system.h"
  3. #include "lisp_gc.hpp"
  4. #include "dprint.hpp"
  5. #include <ctype.h>
  6.  
  7. #include <unistd.h>
  8. #include <stdio.h>
  9. #include <string.h>
  10. #include <stdlib.h>
  11.  
  12. #if defined( __MAC__ )
  13. extern char *macify_name(char *s);
  14. #elif defined( __WATCOMC__ )
  15. #include <sys\types.h>
  16. #include <direct.h>
  17. #define make_dir(dir) mkdir(dir)
  18. #else
  19. #include <sys/stat.h>
  20. #define make_dir(dir) mkdir(dir,S_IRWXU | S_IRWXG | S_IRWXO)
  21.  
  22. void modify_install_path(char *path) { ; }
  23. #endif
  24.  
  25.  
  26. #ifdef __WATCOMC__
  27. void modify_install_path(char *path)
  28. {
  29.   char ret[100],*r,*i_path=path;
  30.   int dc=0;
  31.   r=ret;
  32.  
  33.   if (path[1]==':')   // if "c:\blahblah "  skip the c:
  34.   {
  35.     r[0]=path[0];
  36.     r[1]=path[1];
  37.     r+=2;
  38.     path+=2;
  39.   }
  40.  
  41.   while (*path)       // eliminate double slashes and reduce more than 8 char dirs
  42.   {
  43.     
  44.     if (*path=='\\' || *path=='/')
  45.     {
  46.       dc=0;
  47.       *r=*path;
  48.       r++;
  49.       path++;
  50.       while (*path=='\\' || *path=='/') path++;
  51.     } else if (dc<8)
  52.     {
  53.       dc++;
  54.       *r=*path;
  55.       r++;
  56.       path++;
  57.     } else path++;
  58.   }
  59.  
  60.  
  61.   *r=0;
  62.   strcpy(i_path,ret);
  63. }
  64.  
  65. #include <dos.h>
  66. #endif
  67.  
  68. int change_dir(char *path)
  69. {
  70. #ifdef __WATCOMC__
  71.   unsigned cur_drive;
  72.   _dos_getdrive(&cur_drive);
  73.   if (path[1]==':')
  74.   {
  75.     unsigned total;
  76.     _dos_setdrive(toupper(path[0])-'A'+1,&total);
  77.  
  78.  
  79.     unsigned new_drive;
  80.     _dos_getdrive(&new_drive);
  81.  
  82.     if (new_drive!=toupper(path[0])-'A'+1)
  83.     {
  84.       return 0;
  85.     }
  86.  
  87.     path+=2;
  88.   }
  89.   
  90.   int er=chdir(path);
  91.   if (er)
  92.   {
  93.     unsigned total;
  94.     _dos_setdrive(cur_drive,&total);
  95.   }
  96.   return !er;
  97. #else
  98.   int ret;    // weird, used to include =chdir(path)
  99. #ifdef __MAC__
  100.   ret=chdir(macify_name(path));
  101. #else
  102.   ret=chdir(path);
  103. #endif
  104.   return ret==0;
  105. #endif  
  106. }
  107.  
  108. long K_avail(char *path);
  109.  
  110. #ifdef __WATCOMC__
  111. #include "i86.h"
  112. #include <conio.h>
  113. #include <bios.h>
  114.  
  115. long K_avail(char *path)
  116. {
  117.   unsigned drive=0;
  118.   if (path[1]==':') drive=toupper(path[0])-'A'+1;
  119.   else _dos_getdrive(&drive);
  120.  
  121.   struct diskfree_t f;
  122.   _dos_getdiskfree(drive,&f);
  123.   
  124.   return (long)((long)f.sectors_per_cluster*(long)f.bytes_per_sector/1024)*(long)f.avail_clusters;
  125. }
  126.  
  127. void set_cursor(int x, int y) {
  128.   union  REGS in,out;
  129.   memset(&in,0,sizeof(in));
  130.   in.w.ax=0x0200; in.w.bx=0; in.w.dx=(y<<8)|x;
  131.   int386(0x10,&in,&in);
  132. }
  133.  
  134. void put_char(int x, int y, int val, int color) { *((unsigned short *)(0xb8000+y*2*80+x*2))=(val)|(color<<8); }
  135. unsigned short get_char(int x, int y, int val) { return *((unsigned short *)(0xb8000+y*2*80+x*2)); }
  136. void put_string(int x,int y,char *s, int c) { while (*s) put_char(x++,y,*(s++),c); }
  137. void bar(int x1, int y1, int x2, int y2, int v, int c)
  138. { int x,y; 
  139.   for (x=x1;x<=x2;x++)
  140.     for (y=y1;y<=y2;y++)
  141.       put_char(x,y,v,c);
  142. }
  143.  
  144. void cls() { bar(0,0,79,25,' ',0x07); set_cursor(0,0); }
  145.  
  146. void box(int x1, int y1, int x2, int y2, int c)
  147.   unsigned char bc[]={  218,191,217,192,196,179 };
  148.   put_char(x1,y1,bc[0],c);
  149.   put_char(x2,y1,bc[1],c);
  150.   put_char(x2,y2,bc[2],c);
  151.   put_char(x1,y2,bc[3],c);
  152.   int x; for (x=x1+1;x<x2;x++) { put_char(x,y1,bc[4],c);  put_char(x,y2,bc[4],c); }
  153.   int y; for (y=y1+1;y<y2;y++) { put_char(x1,y,bc[5],c);  put_char(x2,y,bc[5],c); }
  154. }
  155.  
  156. void put_title(char *t)
  157. {
  158.   int x1=0,y1=0,x2=79,y2=25;
  159.   bar(x1,y1,x2,y1,' ',0x4f);
  160.   put_string((x1+x2)/2-strlen(t)/2,y1,t,0x4f);
  161. }
  162.  
  163.  
  164.  
  165.  
  166. int nice_copy(char *title, char *source, char *dest)
  167. {
  168.   int x1=0,y1=0,x2=79,y2=25;
  169.   bar(x1,y1+1,x2,y2,176,0x01);
  170.   put_title(title);
  171.  
  172.   box(x1,(y1+y2)/2-1,x2,(y1+y2)/2+3,0x17);
  173.   bar(x1+1,(y1+y2)/2,x2-1,(y1+y2)/2+2,' ',0x17);
  174.   
  175.   char msg[100];
  176.   sprintf(msg,"Copying %s -> %s",source,dest);
  177.   put_string(x1+1,(y1+y2)/2,msg,0x17);
  178.   bar(x1+1,(y1+y2)/2+2,x2-1,(y1+y2)/2+2,176,0x17);
  179.  
  180.   char *buffer=(char *)jmalloc(0xf000,"read buf");
  181.   if (!buffer) return 0;
  182.   FILE *out=fopen(dest,"wb");
  183.   if (!out) { jfree(buffer) ; return 0; }
  184.   FILE *in=fopen(source,"rb");
  185.   if (!in) { jfree(buffer); fclose(out); unlink(dest); return 0; }
  186.  
  187.   fseek(in,0,SEEK_END);
  188.   long size=ftell(in);
  189.   fseek(in,0,SEEK_SET);
  190.   int osize=size;
  191.   while (size)
  192.   {
  193.     long tr=fread(buffer,1,0xf000,in);
  194.     bar(x1+1,(y1+y2)/2+2,x1+1+(x2-x1)*(osize-size-tr)/osize,(y1+y2)/2+2,178,0x17);
  195.  
  196.     if (fwrite(buffer,1,tr,out)!=tr)
  197.     {
  198.       fclose(out);
  199.       fclose(in);
  200.       unlink(dest);
  201.       jfree(buffer);
  202.       return 0;
  203.     }
  204.     size-=tr;
  205.     
  206.   }
  207.   fclose(in);
  208.   fclose(out);
  209.   jfree(buffer);
  210.   cls();
  211.   return 1;
  212. }
  213.  
  214. void *nice_input(char *t, char *p, char *d)
  215. {  
  216.  
  217.   int x1=0,y1=0,x2=79,y2=25;
  218.   bar(x1,y1+1,x2,y2,176,0x01);
  219.   put_title(t);
  220.  
  221.   box(x1,(y1+y2)/2-1,x2,(y1+y2)/2+1,0x17);
  222.   bar(x1+1,(y1+y2)/2,x2-1,(y1+y2)/2,' ',0x17);
  223.  
  224.   put_string(x1+1,(y1+y2)/2,p,0x17);
  225.   bar       (x1+1+strlen(p)+1,(y1+y2)/2,x2-1,(y1+y2)/2,' ',0x0f);
  226.   put_string(x1+1+strlen(p)+1,(y1+y2)/2,d,0x70);
  227.   set_cursor(x1+1+strlen(p)+1,(y1+y2)/2);
  228.   while (!_bios_keybrd(_KEYBRD_READY));
  229.   if (_bios_keybrd(_KEYBRD_READY)==7181)
  230.   {
  231.     getch();
  232.     cls();
  233.     char ln[100];
  234.     strcpy(ln,d);                  // d might get collect in next new
  235.     return new_lisp_string(ln);
  236.   }
  237.   else
  238.   {
  239.     bar       (x1+1+strlen(p)+1,(y1+y2)/2,x2-1,(y1+y2)/2,' ',0x0f);
  240.     int key;
  241.     char ln[100];
  242.     ln[0]=0;
  243.     do
  244.     {
  245.       key=getch();
  246.       if (key==8 && ln[0]) 
  247.       {
  248.     ln[strlen(ln)-1]=0;
  249.     bar(x1+1+strlen(p)+1,(y1+y2)/2,x2-1,(y1+y2)/2,' ',0x0f);
  250.     put_string(x1+1+strlen(p)+1,(y1+y2)/2,ln,0x0f);
  251.       }
  252.       else if (isprint(key))
  253.       {
  254.     ln[strlen(ln)+1]=0;
  255.     ln[strlen(ln)]=key;
  256.  
  257.     put_string(x1+1+strlen(p)+1,(y1+y2)/2,ln,0x0f);
  258.       }      
  259.       set_cursor(x1+1+strlen(p)+1+strlen(ln),(y1+y2)/2);
  260.     } while (key!=13 && key!=27);
  261.  
  262.     cls();
  263.     if (key==27) return NULL;
  264.     return new_lisp_string(ln);          
  265.   }
  266. }
  267.  
  268. void *nice_menu(void *main_title, void *menu_title, void *list)
  269. {
  270.   int x1=0,y1=0,x2=79,y2=25;
  271.  
  272.   p_ref r1(main_title),r2(menu_title),r3(list);
  273.   main_title=eval(main_title);
  274.   menu_title=eval(menu_title);
  275.   char *t=lstring_value(main_title);
  276.   put_title(t);
  277.  
  278.   bar(x1,y1+1,x2,y2,176,0x01);
  279.  
  280.   void *l=eval(list);
  281.   p_ref r4(l);
  282.   int menu_height=list_length(l),menu_length=0;
  283.   void *m;
  284.   for (m=l;m;m=CDR(m))
  285.   { long l=strlen(lstring_value(CAR(m)));
  286.     if (l>menu_length) menu_length=l;
  287.   }
  288.  
  289.   char *mt=lstring_value(menu_title);
  290.   if (strlen(mt)>menu_length) menu_length=strlen(mt);
  291.  
  292.   int mx=(x2+x1)/2-menu_length/2-1,my=(y2+y1)/2-menu_height/2-2;
  293.   box(mx,my,mx+menu_length+2,my+menu_height+3,0x17);
  294.   bar(mx+1,my+1,mx+menu_length+1,my+menu_height+2,' ',0x17);
  295.   put_string(mx+1+menu_length/2-strlen(mt)/2,my,mt,0x1f);       // draw menu title
  296.   set_cursor(0,25);
  297.  
  298.   int cur_sel=0;
  299.   int key;
  300.   do
  301.   {
  302.     int y=0;
  303.     for (m=l;m;m=CDR(m),y++)
  304.     {
  305.       char *s=lstring_value(CAR(m));
  306.       if (y==cur_sel)
  307.       {
  308.     bar(mx+1,my+2+y,mx+1+menu_length,my+2+y,' ',0x0f);
  309.     put_string(mx+1+menu_length/2-strlen(s)/2,my+2+y,s,0x0f);
  310.       }
  311.       else
  312.       {
  313.     bar(mx+1,my+2+y,mx+1+menu_length,my+2+y,' ',0x1f);
  314.     put_string(mx+1+menu_length/2-strlen(s)/2,my+2+y,s,0x1f);
  315.       }
  316.     }
  317.  
  318.     key=_bios_keybrd(_KEYBRD_READ);
  319.  
  320.     if (key==18432) 
  321.     { cur_sel--; if (cur_sel==-1) cur_sel=menu_height-1; }
  322.     if (key==20480)
  323.     { cur_sel++; if (cur_sel==menu_height) cur_sel=0; }
  324.  
  325.   } while (key!=283 && key!=7181);
  326.   cls();
  327.   if (key==283) 
  328.     return new_lisp_number(-1);
  329.  
  330.   return new_lisp_number(cur_sel);
  331. }
  332.  
  333. void center_tbox(void *list, int c)
  334. {
  335.   int x1=0,y1=0,x2=79,y2=25;
  336.   int h;
  337.  
  338.   if (item_type(list)==L_CONS_CELL)
  339.     h=list_length(list);
  340.   else h=1;
  341.  
  342.   int y=(y1+y2)/2-h/2+1;
  343.   box(x1,(y1+y2)/2-h/2,x2,(y1+y2)/2-h/2+h+1,c);
  344.   bar(x1+1,y,x2-1,(y1+y2)/2-h/2+h+1-1,' ',c);
  345.  
  346.   if (item_type(list)==L_CONS_CELL)
  347.   {
  348.     while (list)
  349.     {
  350.       char *s=lstring_value(CAR(list));
  351.       put_string((x1+x2)/2-strlen(s)/2,y++,s,c);
  352.       list=CDR(list);
  353.     }
  354.   } else 
  355.   {
  356.     char *s=lstring_value(list);
  357.     put_string((x1+x2)/2-strlen(s)/2,y++,s,c);
  358.   }
  359. }
  360.  
  361. void *show_yes_no(void *t, void *msg, void *y, void *n)
  362. {
  363.   p_ref r1(t),r2(msg),r3(y),r4(n);
  364.   y=eval(y);
  365.   n=eval(n);
  366.   put_title(lstring_value(eval(t)));
  367.  
  368.   int x1=0,y1=0,x2=79,y2=25;
  369.   bar(x1,y1+1,x2,y2,176,0x01);  
  370.   center_tbox(eval(msg),0x1f);
  371.   int key;
  372.   char *yes=lstring_value(y);
  373.   char *no=lstring_value(n);
  374.   set_cursor(0,25);
  375.   do
  376.   {
  377.     key=getch();
  378.     set_cursor(0,0);
  379.   } while (toupper(key)!=toupper(yes[0]) && toupper(key)!=toupper(no[0]));
  380.   cls();
  381.   if (toupper(key)==toupper(yes[0]))
  382.     return true_symbol;
  383.   else return NULL;
  384. }
  385.  
  386. #else
  387.  
  388. int nice_copy(char *title, char *source, char *dest) { return 0; }
  389.  
  390. long K_avail(char *path)
  391. {
  392. #if 0 // ugh
  393.   char cmd[100];
  394.   sprintf(cmd,"du %s",path);
  395.   FILE *fp=popen(cmd,"rb");
  396.   if (!fp)
  397.   {
  398.     pclose(fp);
  399.     return 20000;
  400.   }
  401.   else
  402.   {
  403.     fgets(cmd,100,fp);
  404.     if (feof(fp))
  405.     {
  406.       pclose(fp);
  407.       return 20000;
  408.     }
  409.     fgets(cmd,100,fp);
  410.     char *s=cmd+strlen(cmd)-1;
  411.     while (*s==' ' || *s=='\t') s--;
  412.     while (*s!=' ' && *s!='\t') s--;  // skip last field
  413.  
  414.     while (*s==' ' || *s=='\t') s--;
  415.     while (*s!=' ' && *s!='\t') s--;  // skip last field
  416.  
  417.     while (*s==' ' || *s=='\t') s--;
  418.     while (*s!=' ' && *s!='\t') s--; s++;  // skip last field
  419.  
  420.     long a;
  421.     sscanf(s,"%d",&a);
  422.     
  423.     pclose(fp);
  424.     return a;
  425.   }
  426. #endif
  427.     return 0;
  428. }
  429.  
  430. void *show_yes_no(void *t, void *msg, void *y, void *n)
  431. {
  432.   p_ref r1(t),r2(msg),r3(y),r4(n);
  433.   t=eval(t); msg=eval(msg); y=eval(y); n=eval(n);
  434.   int c;
  435.   char *yes=lstring_value(y);
  436.   char *no=lstring_value(n);
  437.   do
  438.   {
  439.     dprintf("\n\n\n\n\n%s\n\n",lstring_value(t));
  440.     void *v=msg;
  441.     if (item_type(v)==L_CONS_CELL)
  442.       while (v) { dprintf("** %s\n",lstring_value(CAR(v))); v=CDR(v); }
  443.     else dprintf("** %s\n",lstring_value(v));
  444.     char msg[100];
  445.     fgets(msg,100,stdin);
  446.     c=msg[0];
  447.   } while (toupper(c)!=toupper(yes[0]) && toupper(c)!=toupper(no[0]));
  448.   if (toupper(c)==toupper(yes[0]))
  449.     return true_symbol;
  450.   else return NULL;
  451. }
  452.  
  453. void *nice_menu(void *main_title, void *menu_title, void *list)
  454. {
  455.   p_ref r1(main_title),r2(menu_title),r3(list);
  456.   main_title=eval(main_title);  menu_title=eval(menu_title);  list=eval(list);
  457.   char msg[100];
  458.   int i=0,d;
  459.   do
  460.   {
  461.     dprintf("\n\n\n\n\n%s\n\n%s\n-----------------------------------\n",
  462.        lstring_value(main_title),lstring_value(menu_title));
  463.  
  464.     void *v=list;
  465.     for (;v;v=CDR(v),i++)
  466.     {
  467.       dprintf("%d) %s\n",i+1,lstring_value(CAR(v)));
  468.     }
  469.     dprintf("> ");
  470.     fgets(msg,100,stdin);
  471.     sscanf(msg,"%d",&d);
  472.   } while (d-1>=i && d<=0);
  473.   return new_lisp_number(d-1);
  474. }
  475.  
  476. void *nice_input(char *t, char *p, char *d)
  477. {
  478.   int x; for (x=0;x<(40-strlen(t)/2);x++) dprintf(" ");
  479.   dprintf(" %s\n",t);
  480.   for (x=0;x<78;x++) dprintf("-"); dprintf("\n");
  481.   dprintf("%s (ENTER=%s) > ",p,d);
  482.   char ln[100];
  483.   fgets(ln,100,stdin); ln[strlen(ln)-1]=0;
  484.   if (ln[0]==0)
  485.   {
  486.     strcpy(ln,d);                  // d might get collect in next new
  487.     return new_lisp_string(ln);
  488.   }
  489.   else
  490.     return new_lisp_string(ln);    
  491. }
  492.  
  493. #endif
  494.