home *** CD-ROM | disk | FTP | other *** search
/ Power Programming / powerprogramming1994.iso / progtool / lisp / xlsp20.arc / IBMPCSRC.ARC / MSSTUFF.C < prev    next >
Text File  |  1988-02-02  |  5KB  |  276 lines

  1. /* msstuff.c - ms-dos specific routines */
  2.  
  3. #include "xlisp.h"
  4.  
  5. #define LBSIZE 200
  6.  
  7. /* external variables */
  8. extern LVAL s_unbound,true;
  9. extern FILE *tfp;
  10. extern int errno;
  11.  
  12. /* local variables */
  13. static char lbuf[LBSIZE];
  14. static int lpos[LBSIZE];
  15. static int lindex;
  16. static int lcount;
  17. static int lposition;
  18. static long rseed = 1L;
  19.  
  20. /* osinit - initialize */
  21. osinit(banner)
  22.   char *banner;
  23. {
  24.     printf("%s\n",banner);
  25.     lposition = 0;
  26.     lindex = 0;
  27.     lcount = 0;
  28. }
  29.  
  30. /* osfinish - clean up before returning to the operating system */
  31. osfinish()
  32. {
  33. }
  34.  
  35. /* oserror - print an error message */
  36. oserror(msg)
  37.   char *msg;
  38. {
  39.     printf("error: %s\n",msg);
  40. }
  41.  
  42. /* osrand - return a random number between 0 and n-1 */
  43. int osrand(n)
  44.   int n;
  45. {
  46.     long k1;
  47.  
  48.     /* make sure we don't get stuck at zero */
  49.     if (rseed == 0L) rseed = 1L;
  50.  
  51.     /* algorithm taken from Dr. Dobbs Journal, November 1985, page 91 */
  52.     k1 = rseed / 127773L;
  53.     if ((rseed = 16807L * (rseed - k1 * 127773L) - k1 * 2836L) < 0L)
  54.     rseed += 2147483647L;
  55.  
  56.     /* return a random number between 0 and n-1 */
  57.     return ((int)(rseed % (long)n));
  58. }
  59.  
  60. /* osaopen - open an ascii file */
  61. FILE *osaopen(name,mode)
  62.   char *name,*mode;
  63. {
  64.     return (fopen(name,mode));
  65. }
  66.  
  67. /* osbopen - open a binary file */
  68. FILE *osbopen(name,mode)
  69.   char *name,*mode;
  70. {
  71.     char bmode[10];
  72.     strcpy(bmode,mode); strcat(bmode,"b");
  73.     return (fopen(name,bmode));
  74. }
  75.  
  76. /* osclose - close a file */
  77. int osclose(fp)
  78.   FILE *fp;
  79. {
  80.     return (fclose(fp));
  81. }
  82.  
  83. /* osagetc - get a character from an ascii file */
  84. int osagetc(fp)
  85.   FILE *fp;
  86. {
  87.     return (getc(fp));
  88. }
  89.  
  90. /* osaputc - put a character to an ascii file */
  91. int osaputc(ch,fp)
  92.   int ch; FILE *fp;
  93. {
  94.     return (putc(ch,fp));
  95. }
  96.  
  97. /* osbgetc - get a character from a binary file */
  98. int osbgetc(fp)
  99.   FILE *fp;
  100. {
  101.     return (getc(fp));
  102. }
  103.  
  104. /* osbputc - put a character to a binary file */
  105. int osbputc(ch,fp)
  106.   int ch; FILE *fp;
  107. {
  108.     return (putc(ch,fp));
  109. }
  110.  
  111. /* ostgetc - get a character from the terminal */
  112. int ostgetc()
  113. {
  114.     int ch;
  115.  
  116.     /* check for a buffered character */
  117.     if (lcount--)
  118.     return (lbuf[lindex++]);
  119.  
  120.     /* get an input line */
  121.     for (lcount = 0; ; )
  122.     switch (ch = xgetc()) {
  123.     case '\r':
  124.         lbuf[lcount++] = '\n';
  125.         xputc('\r'); xputc('\n'); lposition = 0;
  126.         if (tfp)
  127.             for (lindex = 0; lindex < lcount; ++lindex)
  128.             osaputc(lbuf[lindex],tfp);
  129.         lindex = 0; lcount--;
  130.         return (lbuf[lindex++]);
  131.     case '\010':
  132.     case '\177':
  133.         if (lcount) {
  134.             lcount--;
  135.             while (lposition > lpos[lcount]) {
  136.             xputc('\010'); xputc(' '); xputc('\010');
  137.             lposition--;
  138.             }
  139.         }
  140.         break;
  141.     case '\032':
  142.         xflush();
  143.         return (EOF);
  144.     default:
  145.         if (ch == '\t' || (ch >= 0x20 && ch < 0x7F)) {
  146.             lbuf[lcount] = ch;
  147.             lpos[lcount] = lposition;
  148.             if (ch == '\t')
  149.             do {
  150.                 xputc(' ');
  151.             } while (++lposition & 7);
  152.             else {
  153.             xputc(ch); lposition++;
  154.             }
  155.             lcount++;
  156.         }
  157.         else {
  158.             xflush();
  159.             switch (ch) {
  160.             case '\003':    xltoplevel();    /* control-c */
  161.             case '\007':    xlcleanup();    /* control-g */
  162.             case '\020':    xlcontinue();    /* control-p */
  163.             case '\032':    return (EOF);    /* control-z */
  164.             default:        return (ch);
  165.             }
  166.         }
  167.     }
  168. }
  169.  
  170. /* ostputc - put a character to the terminal */
  171. ostputc(ch)
  172.   int ch;
  173. {
  174.     /* check for control characters */
  175.     oscheck();
  176.  
  177.     /* output the character */
  178.     if (ch == '\n') {
  179.     xputc('\r'); xputc('\n');
  180.     lposition = 0;
  181.     }
  182.     else {
  183.     xputc(ch);
  184.     lposition++;
  185.    }
  186.  
  187.    /* output the character to the transcript file */
  188.    if (tfp)
  189.     osaputc(ch,tfp);
  190. }
  191.  
  192. /* osflush - flush the terminal input buffer */
  193. osflush()
  194. {
  195.     lindex = lcount = lposition = 0;
  196. }
  197.  
  198. /* oscheck - check for control characters during execution */
  199. oscheck()
  200. {
  201.     int ch;
  202.     if (ch = xcheck())
  203.     switch (ch) {
  204.     case '\002':    /* control-b */
  205.         xflush();
  206.         xlbreak("BREAK",s_unbound);
  207.         break;
  208.     case '\003':    /* control-c */
  209.         xflush();
  210.         xltoplevel();
  211.         break;
  212.     case '\024':    /* control-t */
  213.         xinfo();
  214.         break;
  215.     }
  216. }
  217.  
  218. /* xinfo - show information on control-t */
  219. static xinfo()
  220. {
  221.     extern int nfree,gccalls;
  222.     extern long total;
  223.     char buf[80];
  224.     sprintf(buf,"\n[ Free: %d, GC calls: %d, Total: %ld ]",
  225.         nfree,gccalls,total);
  226.     errputstr(buf);
  227. }
  228.  
  229. /* xflush - flush the input line buffer and start a new line */
  230. static xflush()
  231. {
  232.     osflush();
  233.     ostputc('\n');
  234. }
  235.  
  236. /* xgetc - get a character from the terminal without echo */
  237. static int xgetc()
  238. {
  239.     return (bdos(7) & 0xFF);
  240. }
  241.  
  242. /* xputc - put a character to the terminal */
  243. static xputc(ch)
  244.   int ch;
  245. {
  246.     bdos(6,ch);
  247. }
  248.  
  249. /* xcheck - check for a character */
  250. static int xcheck()
  251. {
  252.     return (bdos(6,0xFF));
  253. }
  254.  
  255. /* xsystem - execute a system command */
  256. LVAL xsystem()
  257. {
  258.     char *cmd="COMMAND";
  259.     if (moreargs())
  260.     cmd = (char *)getstring(xlgastring());
  261.     xllastarg();
  262.     return (system(cmd) == 0 ? true : cvfixnum((FIXTYPE)errno));
  263. }
  264.  
  265. /* xgetkey - get a key from the keyboard */
  266. LVAL xgetkey()
  267. {
  268.     xllastarg();
  269.     return (cvfixnum((FIXTYPE)xgetc()));
  270. }
  271.  
  272. /* ossymbols - enter os specific symbols */
  273. ossymbols()
  274. {
  275. }
  276.