home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 9 / 09.iso / l / l200 / 6.ddi / LIB / CHAIN.C < prev    next >
Encoding:
C/C++ Source or Header  |  1986-08-21  |  1.2 KB  |  59 lines

  1. /*    CHAIN(filename) - terminate current program, execute new file
  2.  
  3.     Copyright (c) 1983, 1984 by JMI Software Consultants, Inc.
  4.  */
  5. #include "bio.h"
  6. #include "adl.h"
  7.  
  8. VOID CHAIN(filename)
  9.     BTEXT *filename;
  10.     {
  11.     IMPORT INT strlpfx;
  12.     IMPORT struct adm_var avar;
  13.     IMPORT BOOL putdata, run_flag;
  14.     TEXT chnaddr[10];
  15.     BYTES chnoff, chnseg, off, seg;
  16.     FAST COUNT i;
  17.     
  18.     if (run_flag)
  19.         {
  20.         for (i = avar.min_bu; i <= avar.max_bu; ++i)
  21.             BCLOSE(i, 0);
  22.         clslot(sf_PR);
  23.         }
  24.     putdata = YES;
  25.     common();
  26.     if (get_cmd_var("CHAIN=", chnaddr))
  27.         {
  28.         atoh(chnaddr, 4, &chnseg);
  29.         atoh(chnaddr + 4, 4, &chnoff);
  30.         i = x_len(filename);
  31.         ptr_split(filename + strlpfx, &seg, &off);
  32.         movedata(seg, off, chnseg, chnoff, i + 1);
  33.         exit(0);
  34.         }
  35.     xerror(36, "CHAIN");
  36.     }
  37.  
  38. /* atoh - interpret ASCII text as a hexadecimal integer */
  39.  
  40. LOCAL INT atoh(a, n, h)
  41.     TEXT *a;     /* ASCII input buffer */
  42.     COUNT n;    /* number of characters to convert */
  43.     INT *h;        /* where to put output */
  44.     {
  45.     INT x, y;
  46.  
  47.     for (x = 0; n-- > 0; ++a, x = x * 16 + y)
  48.         if ('0' <= *a && *a <= '9')
  49.             y = *a - '0';
  50.         else if ('a' <= *a && *a <= 'f')
  51.             y = *a - 'a' + 10;
  52.         else if ('A' <= *a && *a <= 'F')
  53.             y = *a - 'A' + 10;
  54.         else
  55.             break;
  56.          *h = x;
  57.     return (n);
  58.     }
  59.