Subversion Repositories SvarDOS

Compare Revisions

Ignore whitespace Rev 371 → Rev 372

/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 */
}