home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d2xx
/
d282
/
rcs.lha
/
RCS
/
rcs.zoo
/
rcs
/
rsbx.lib
/
uxmain.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-11-12
|
4KB
|
216 lines
#include <stdio.h>
#include <fcntl.h>
#include <ios1.h>
#include <string.h>
#include <stdlib.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <proto/dos.h>
#include <proto/exec.h>
#define MAXARG 256 /* maximum command line arguments */
#define QUOTE '"'
#define ESCAPE '*'
#define ESC '\027'
#define NL '\n'
#define isspace(c) ((c == ' ')||(c == '\t') || (c == '\n'))
#ifndef TINY
extern int _fmode,_iomode;
extern int (*_ONBREAK)();
extern int CXBRK();
#endif
extern void main(int argc, char **argv);
extern char *_ProgramName;
extern struct UFB _ufbs[];
static int argc; /* arg count */
static char *argv[MAXARG]; /* arg pointers */
static void badarg(char *program);
#define MAXWINDOW 40
/*
* name _xmain - process command line, open files, and call "main"
*
* synopsis _xmain(line, length);
* char *line; argument string to command
* int length length of argument string
*
* description This function performs the standard pre-processing for
* the main module of a C program. It accepts a command
* line of the form
*
* arg1 arg2 ...
*
* and builds a list of pointers to each argument. The first
* pointer is to the program name. For some environments, the
* standard I/O files are also opened, using file names that
* were set up by the OS interface module XCMAIN.
*/
/*
* This is a modified umain.c, supplied with the Lattice 5.04 compiler,
* that correctly handles AmigaDos escapes.
*
* Ray
*/
void _xmain(char *line, int length)
{
char *argbuf;
int x;
/*
*
* Open standard files
*
*/
#ifndef TINY
_ufbs[0].ufbfh = Input();
_ufbs[1].ufbfh = Output();
_ufbs[2].ufbfh = Open("*", MODE_OLDFILE);
_ufbs[0].ufbflg |= UFB_RA | O_RAW | UFB_NC;
_ufbs[1].ufbflg |= UFB_WA | O_RAW | UFB_NC;
_ufbs[2].ufbflg |= UFB_RA | O_RAW | UFB_WA;
stdin->_file = 0;
stdout->_file = 1;
stderr->_file = 2;
x = (_fmode) ? 0 : _IOXLAT;
stdin->_flag = _IOREAD | x;
stdout->_flag = _IOWRT | x;
stderr->_flag = _IORW | x;
/* establish control-c handler */
_ONBREAK = CXBRK;
#endif
if (!(argbuf = malloc(_ProgramName[-1] + length + 2)))
{
_exit(1);
}
argv[argc++] = argbuf;
strncpy(argbuf, _ProgramName, _ProgramName[-1]);
argbuf += _ProgramName[-1];
*argbuf++ = '\0';
/*
*
* Build argument pointer list
*
*/
while (argc < MAXARG)
{
while (isspace(*line) && length)
{
line++;
length--;
}
if (!length)
{
break;
}
argv[argc++] = argbuf;
if (*line == QUOTE)
{
line++;
length--;
while (length && (*line != QUOTE))
{
if (*line == ESCAPE)
{
line++;
length--;
if (!length)
{
badarg(*argv);
}
else
{
switch (*line)
{
case 'E':
*argbuf++ = ESC;
break;
case 'N':
*argbuf++ = NL;
break;
default:
*argbuf++ = *line;
}
length--;
line++;
}
}
else
{
*argbuf++ = *line++;
length--;
}
}
if (!length)
{
badarg(*argv);
}
line++;
length--;
*argbuf++ = '\0'; /* terminate arg */
if (length && !isspace(*line))
{
badarg(*argv);
}
}
else /* non-quoted arg */
{
while (length && (!isspace(*line)))
{
*argbuf++ = *line++;
length--;
}
if (!length)
{
*argbuf = '\0';
break;
}
else
{
*argbuf++ = '\0'; /* terminate arg */
}
}
} /* while */
/*
*
* Call user's main program
*
*/
main(argc, argv); /* call main function */
#ifndef TINY
exit(0);
#else
_exit(0);
#endif
}
static void badarg(char *program)
{
fputs("Invalid argument to ", stderr);
fputs(program, stderr);
fputc('\n', stderr);
exit(100);
}