home *** CD-ROM | disk | FTP | other *** search
- /* CHAIN(filename) - terminate current program, execute new file
-
- Copyright (c) 1983, 1984 by JMI Software Consultants, Inc.
- */
- #include "bio.h"
- #include "adl.h"
-
- VOID CHAIN(filename)
- BTEXT *filename;
- {
- IMPORT INT strlpfx;
- IMPORT struct adm_var avar;
- IMPORT BOOL putdata, run_flag;
- TEXT chnaddr[10];
- BYTES chnoff, chnseg, off, seg;
- FAST COUNT i;
-
- if (run_flag)
- {
- for (i = avar.min_bu; i <= avar.max_bu; ++i)
- BCLOSE(i, 0);
- clslot(sf_PR);
- }
- putdata = YES;
- common();
- if (get_cmd_var("CHAIN=", chnaddr))
- {
- atoh(chnaddr, 4, &chnseg);
- atoh(chnaddr + 4, 4, &chnoff);
- i = x_len(filename);
- ptr_split(filename + strlpfx, &seg, &off);
- movedata(seg, off, chnseg, chnoff, i + 1);
- exit(0);
- }
- xerror(36, "CHAIN");
- }
-
- /* atoh - interpret ASCII text as a hexadecimal integer */
-
- LOCAL INT atoh(a, n, h)
- TEXT *a; /* ASCII input buffer */
- COUNT n; /* number of characters to convert */
- INT *h; /* where to put output */
- {
- INT x, y;
-
- for (x = 0; n-- > 0; ++a, x = x * 16 + y)
- if ('0' <= *a && *a <= '9')
- y = *a - '0';
- else if ('a' <= *a && *a <= 'f')
- y = *a - 'a' + 10;
- else if ('A' <= *a && *a <= 'F')
- y = *a - 'A' + 10;
- else
- break;
- *h = x;
- return (n);
- }