/svarcom/cmd/cd.c |
---|
10,7 → 10,7 |
* Type CD without parameters to display the current drive and directory. |
*/ |
static int cmd_cd(const struct cmd_funcparam *p) { |
static int cmd_cd(struct cmd_funcparam *p) { |
/* two arguments max */ |
if (p->argc > 1) { |
outputnl("Too many parameters"); |
/svarcom/cmd/dir.c |
---|
29,7 → 29,7 |
#define cmd_dir_attr_arc 32 |
static int cmd_dir(const struct cmd_funcparam *p) { |
static int cmd_dir(struct cmd_funcparam *p) { |
const char *filespecptr = "*.*"; |
unsigned short errcode; |
_Packed struct DTA { |
/svarcom/cmd/exit.c |
---|
5,7 → 5,7 |
* |
*/ |
static int cmd_exit(const struct cmd_funcparam *p) { |
static int cmd_exit(struct cmd_funcparam *p) { |
if ((p->argc == 1) && (imatch(p->argv[0], "/?"))) { |
output("EXIT\r\n" |
"\r\n" |
/svarcom/cmd/path.c |
---|
0,0 → 1,68 |
/* |
* path |
* |
* Displays or sets a search path for executable files. |
*/ |
static int cmd_path(struct cmd_funcparam *p) { |
char *buff = p->BUFFER; |
/* no parameter - display current path */ |
if (p->argc == 0) { |
char far *curpath = env_lookup(p->env_seg, "PATH"); |
if (curpath != NULL) { |
unsigned short i; |
for (i = 0;; i++) { |
buff[i] = curpath[i]; |
if (buff[i] == 0) break; |
} |
outputnl(buff); |
} |
return(-1); |
} |
/* more than 1 parameter */ |
if (p->argc > 1) { |
outputnl("Too many parameters"); |
return(-1); |
} |
/* IF HERE: THERE IS EXACTLY 1 ARGUMENT (argc == 1) */ |
/* help screen (/?) */ |
if (imatch(p->argv[0], "/?")) { |
output("Displays or sets a search path for executable files.\r\n" |
"\r\n" |
"PATH [[drive:]path[;...]]\r\n" |
"PATH ;\r\n" |
"\r\n" |
"Type PATH ; to clear all search-path settings and direct DOS to search\r\n" |
"only in the current directory.\r\n" |
"\r\n" |
"Type PATH without parameters to display the current path.\r\n"); |
return(-1); |
} |
/* reset the PATH string (PATH ;) */ |
if (imatch(p->argv[0], ";")) { |
env_dropvar(p->env_seg, "PATH"); |
return(-1); |
} |
/* otherwise set PATH to whatever is passed on command-line */ |
{ |
unsigned short i; |
strcpy(buff, "PATH="); |
for (i = 0;; i++) { |
buff[i + 5] = p->argv[0][i]; |
if (buff[i + 5] == '\r') break; |
} |
buff[i + 5] = 0; |
outputnl("---"); |
outputnl(buff); |
outputnl("---"); |
env_setvar(p->env_seg, buff); |
} |
return(-1); |
} |
/svarcom/cmd/prompt.c |
---|
5,7 → 5,7 |
* |
*/ |
static int cmd_prompt(const struct cmd_funcparam *p) { |
static int cmd_prompt(struct cmd_funcparam *p) { |
if ((p->argc == 1) && (imatch(p->argv[0], "/?"))) { |
output("Changes the DOS command prompt.\r\n" |
"\r\n" |
22,8 → 22,9 |
/* otherwise set PROMPT to whatever is passed on command-line */ |
{ |
char buff[256] = "PROMPT="; |
unsigned short i; |
char *buff = p->BUFFER; |
strcpy(buff, "PROMPT="); |
for (i = 0;; i++) { |
buff[i + 7] = p->cmdline[p->argoffset + i]; |
if (buff[i + 7] == '\r') break; |
/svarcom/cmd/set.c |
---|
6,13 → 6,13 |
*/ |
static int cmd_set(const struct cmd_funcparam *p) { |
static int cmd_set(struct cmd_funcparam *p) { |
char far *env = MK_FP(p->env_seg, 0); |
char buff[256]; |
int i; |
char *buff = p->BUFFER; |
/* no arguments - display content */ |
if (p->argc == 0) { |
while (*env != 0) { |
unsigned short i; |
/* copy string to local buff for display */ |
for (i = 0;; i++) { |
buff[i] = *env; |
19,13 → 19,12 |
env++; |
if (buff[i] == 0) break; |
} |
puts(buff); |
outputnl(buff); |
} |
} else if ((p->argc == 1) && (imatch(p->argv[0], "/?"))) { |
outputnl("TODO: help screen"); /* TODO */ |
} else { /* set variable (do not rely on argv, SET has its own rules...) */ |
const char far *ptr; |
char buff[256]; |
unsigned short i; |
/* locate the first space */ |
for (ptr = p->cmdline; *ptr != ' '; ptr++); |
/svarcom/cmd.c |
---|
6,6 → 6,7 |
#include <i86.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <string.h> |
#include "doserr.h" |
#include "env.h" |
17,11 → 18,13 |
unsigned short env_seg; /* segment of environment block */ |
unsigned short argoffset; /* offset of cmdline where first argument starts */ |
const char far *cmdline; /* original cmdline (terminated by \r) */ |
char BUFFER[1024]; /* a buffer for whatever is needed */ |
}; |
#include "cmd/cd.c" |
#include "cmd/dir.c" |
#include "cmd/exit.c" |
#include "cmd/path.c" |
#include "cmd/prompt.c" |
#include "cmd/set.c" |
30,7 → 33,7 |
struct CMD_ID { |
const char *cmd; |
int (*func_ptr)(const struct cmd_funcparam *); /* pointer to handling function */ |
int (*func_ptr)(struct cmd_funcparam *); /* pointer to handling function */ |
}; |
const struct CMD_ID INTERNAL_CMDS[] = { |
38,6 → 41,7 |
{"CHDIR", cmd_cd}, |
{"DIR", cmd_dir}, |
{"EXIT", cmd_exit}, |
{"PATH", cmd_path}, |
{"PROMPT", cmd_prompt}, |
{"SET", cmd_set}, |
{NULL, NULL} |
104,11 → 108,10 |
} |
int cmd_process(unsigned short env_seg, const char far *cmdline) { |
int cmd_process(unsigned short env_seg, const char far *cmdline, char *BUFFER) { |
const struct CMD_ID *cmdptr; |
struct cmd_funcparam p; |
unsigned short argoffset; |
char cmdbuff[256]; |
struct cmd_funcparam *p = (void *)BUFFER; |
/* special case: is this a drive change? (like "E:") */ |
if ((cmdline[0] != 0) && (cmdline[1] == ':') && ((cmdline[2] == ' ') || (cmdline[2] == 0))) { |
144,10 → 147,10 |
/* printf("recognized internal command: '%s', tail of command at offset %u\r\n", cmdptr->cmd, argoffset); */ |
/* prepare function parameters and feed it to the cmd handling function */ |
p.argc = cmd_explode(cmdbuff, cmdline + argoffset, p.argv); |
p.env_seg = env_seg; |
p.argoffset = argoffset; |
p.cmdline = cmdline; |
p->argc = cmd_explode(BUFFER + sizeof(*p), cmdline + argoffset, p->argv); |
p->env_seg = env_seg; |
p->argoffset = argoffset; |
p->cmdline = cmdline; |
return((cmdptr->func_ptr)(&p)); |
return((cmdptr->func_ptr)(p)); |
} |
/svarcom/cmd.h |
---|
2,7 → 2,7 |
#define CMD_H |
/* process internal commands */ |
int cmd_process(unsigned short env_seg, const char far *cmdline); |
int cmd_process(unsigned short env_seg, const char far *cmdline, char *BUFFER); |
/* explodes a command into an array of arguments where last arg is NULL |
* returns number of args */ |
/svarcom/command.c |
---|
246,10 → 246,11 |
int main(int argc, char **argv) { |
struct config cfg; |
unsigned short rmod_seg; |
unsigned short far *rmod_envseg; |
unsigned short far *lastexitcode; |
static struct config cfg; |
static unsigned short rmod_seg; |
static unsigned short far *rmod_envseg; |
static unsigned short far *lastexitcode; |
static unsigned char BUFFER[4096]; |
parse_argv(&cfg, argc, argv); |
289,8 → 290,7 |
{ |
/* print shell prompt */ |
char buff[256]; |
char *promptptr = buff; |
char *promptptr = BUFFER; |
buildprompt(promptptr, *rmod_envseg); |
_asm { |
push ax |
357,7 → 357,7 |
/* try matching (and executing) an internal command */ |
{ |
int ecode = cmd_process(*rmod_envseg, cmdline); |
int ecode = cmd_process(*rmod_envseg, cmdline, BUFFER); |
if (ecode >= 0) *lastexitcode = ecode; |
if (ecode >= -1) continue; /* internal command executed */ |
} |