home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / C / Applications / Moscow ML 1.42 / src / !runtime / msdos.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-08-18  |  3.8 KB  |  184 lines  |  [TEXT/R*ch]

  1. #include <stddef.h>
  2. #include <std.h>
  3. #include <dos.h>
  4. #include "mlvalues.h"
  5. #include "signals.h"
  6. #include "instruct.h"
  7. #include "fail.h"
  8.  
  9. unsigned char raise_break_exn[] = { ATOM, BREAK_EXN, RAISE };
  10.  
  11. static int catch_break = 0;
  12.  
  13. value sys_catch_break(onoff)
  14.      value onoff;
  15. {
  16.   union REGS r;
  17.   catch_break = Tag_val(onoff);
  18.   r.x.ax = 0x3301;
  19.   r.x.dx = catch_break ? 2 : 1;
  20.   int86(0x21, &r, &r);
  21.   return Atom(0);
  22. }
  23.  
  24. void poll_break()
  25. {
  26.   union REGS r;
  27.   if (catch_break == 0) return;
  28.   r.x.ax = 0x3303;
  29.   int86(0x21, &r, &r);
  30.   if (r.x.dx != 0) {
  31.     signal_handler = raise_break_exn;
  32.     signal_number = 0;
  33.     execute_signal();
  34.   } 
  35. }
  36.  
  37. /* Special input function for MS-DOS (to take advantage of external line
  38.    editors when reading from the console. */
  39.  
  40. static struct {
  41.   unsigned char max_len;
  42.   unsigned char act_len;
  43.   char data[200];
  44. } read_buffer;
  45.  
  46. static int stdin_is_console = -1;
  47. static int stdin_at_eof = 0;    /* Valid only if stdin_is_console==1 */
  48.  
  49. int msdos_read(fd, ptr, len)
  50.      int fd;
  51.      char * ptr;
  52.      unsigned len;
  53.   if (fd == 0) {
  54.     if (stdin_is_console == -1) {
  55.       union REGS regs;         
  56.       regs.x.ax = 0x4400;
  57.       regs.x.bx = fd;
  58.       intdos(®s, ®s);
  59.       stdin_is_console = (regs.x.dx & 0x81) == 0x81;
  60.      }
  61.     /* Modified for Moscow SML 1994-08-23 to detect control-Z = 0x1A */
  62.     if (stdin_is_console)
  63.       if (stdin_at_eof) 
  64.     return 0;
  65.       else
  66.     {
  67.           read_buffer.max_len = sizeof(read_buffer.data) - 1;
  68.           if (len <= read_buffer.max_len) read_buffer.max_len = len - 1;
  69.           if (bdosptr(0xA, &read_buffer, 0) != 0) poll_break();
  70.           bdos(0x2, '\n', 0);
  71.           read_buffer.data[read_buffer.act_len] = '\n';
  72.           bcopy(read_buffer.data, ptr, read_buffer.act_len + 1);
  73.       {int i;
  74.            for (i=0; (i<read_buffer.act_len)&&(read_buffer.data[i]!=0x1A);
  75.          i++);
  76.            if (read_buffer.data[i] == 0x1A)
  77.          { 
  78.            stdin_at_eof = 1;
  79.            return i;
  80.          }
  81.        else
  82.          return read_buffer.act_len + 1;
  83.       }
  84.     }
  85.       }
  86.       return read(fd, ptr, len);
  87. }
  88.  
  89. /* Search path function */
  90.  
  91. char * searchpath(name)
  92.      char * name;
  93. {
  94.   static char fullname[256];
  95.   char * path;
  96.   char * p;
  97.   char * q;
  98.  
  99.   if (name[1] == ':') return name;
  100.   for (p = name; *p != 0; p++) {
  101.     if (*p == '\\') return name;
  102.   }
  103.   path = getenv("PATH");
  104.   if (path == 0) return 0;
  105.   while(1) {
  106.     p = fullname;
  107.     while (*path != 0 && *path != ';') {
  108.       *p++ = *path++;
  109.     }
  110.     if (p != fullname) *p++ = '\\';
  111.     q = name;
  112.     while (*q != 0) {
  113.       *p++ = *q++;
  114.     }
  115.     *p = 0;
  116.     if (access(fullname, 4) == 0) return fullname;
  117.     *p++ = '.';
  118.     *p++ = 'e';
  119.     *p++ = 'x';
  120.     *p++ = 'e';
  121.     *p = 0;
  122.     if (access(fullname, 4) == 0) return fullname;
  123.     if (*path == 0) return 0;
  124.     path++;
  125.   }
  126. }
  127.  
  128. /* To reconstruct the command-line arguments when they are passed through
  129.    the environment. */
  130.  
  131. char ** parse_args(cmdname, cmdline)
  132.     char * cmdname, * cmdline;
  133. {
  134.   char * p;
  135.   int argc;
  136.   char ** argv;
  137.   int i;
  138.   
  139.   p = cmdline;
  140.   argc = 1;
  141. inword:
  142.   switch (*p++) {
  143.     case 0  : argc++; goto finished;
  144.     case ' ': p[-1] = 0; argc++; goto skipblanks;
  145.     default : goto inword;
  146.   }
  147. skipblanks:
  148.   switch (*p++) {
  149.     case 0  : goto finished;
  150.     case ' ': goto skipblanks;
  151.     default : goto inword;
  152.   }
  153. finished:
  154.   argv = (char **) malloc((argc + 1) * sizeof(char *));
  155.   argv[argc] = NULL;
  156.   argv[0] = cmdname;
  157.   for (i = 1, p = cmdline; i < argc; i++) {
  158.     while(*p == ' ') p++;
  159.     argv[i] = p;
  160.     while(*p++ != 0) /*nothing*/;
  161.   }
  162.   return argv;
  163. }
  164.  
  165. char ** check_args(argv)
  166.     char ** argv;
  167. {
  168.   char * cmdline;
  169.  
  170.   if (argv[1] == NULL && (cmdline = getenv("*")) != NULL)
  171.     return parse_args(argv[0], cmdline);
  172.   else
  173.     return argv;
  174. }
  175.  
  176. /* EMX provides the built-in chdir2 which would make this obsolete: */
  177. value sml_setdisk(volno)        /* ML */
  178.      value volno;
  179. {
  180.   setdisk(Long_val(volno));
  181.   return Atom(0);
  182. }
  183.