File:  [MW Coherent from dump] / coherent / b / lib / libc / sys / i386 / mkscall.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Wed May 29 04:56:35 2019 UTC (7 years ago) by root
Branches: MarkWilliams, MAIN
CVS tags: relic, HEAD
coherent

/* Copyright (c) Bureau d'Etudes Ciaran O'Donnell,1987,1990,1991 */
/*
 * mkscall.c - to make sys-call interface routine
 * usage : mkscall name number nargs [-r rel-num]
 *	   mkscall -f file
 */	
#include <stdio.h>
#include <ctype.h>

char *usage = "usage: mkscall name number nargs [flags] [-r rel]\n";

struct _args {

	char *a_name;	/* function name	*/	
	short a_num;	/* system call number   */
	short a_arg;	/* arg-count		*/ 
	short a_flag;	/* various flags - FLAG0 -> rval in d1.	*/
			/*		   FLAG1 -> arg = *arg	*/
	char *a_rel;	/* ident string		*/
};

#define FLAG0	0x01
#define FLAG1	0x02
 
main(argc, argv)
register argc;
register char *argv[];
{

	struct _args args;
	register char *fname = 0;	/* input file for arg list */

	if(argc < 4){

		if(argc == 3 && argv[1][0] == '-' && argv[1][1] == 'f') {
			fname = argv[2];
		}
		else {
			fprintf(stderr,usage);
			exit(1);
		}
	}

	
	if(fname == (char *)0) {

		args.a_name = argv[1];
		args.a_num = atoi(argv[2]);
		args.a_arg = atoi(argv[3]);
	
		if(argc > 4) {
			args.a_flag = atoi(argv[4]);
		}

		mk_func(&args);


	} else {

		register FILE *ffd;
		register lcount;
		register st;

		if((ffd = fopen(fname, "r")) == NULL) {

			fprintf(stderr, "mkscall: can't open %s\n", fname);
			exit(2);
		}

		for(lcount = 1; st = getargs(ffd, &args); lcount++) {

			if(st == -1)
				fprintf(stderr,
				"mkscall: file %s, line %d discarded\n",
							 fname, lcount);

			else
				mk_func(&args);
		}
	}

	exit(0);
}


/*
 * make system call routine.
 */


mk_func(arg)
register struct _args *arg;
{

	register FILE *fd;
	register count;
	char file[20];
	register flag;

	flag = arg->a_flag;

	if(arg->a_arg > 6) {
		fprintf(stderr, "mkscall: func %s, too much args\n",
							 arg->a_name);
		return(-1);
	}

	/* check arg count for flag = FLAG1 (arg = *arg) */
	if((flag & FLAG1) && (arg->a_arg > 1)) {

		fprintf(stderr,
		 "mkscall: func %s, only one arg allowed with flag 0x%02x.\n",
					 arg->a_name, flag & FLAG1);
		return(-1);
	}

	strcpy(file, arg->a_name);
	strcat(file, ".s");

	if((fd = fopen(file, "w")) == NULL) {

		fprintf(stderr, "mkscall: can't create %s\n", file);
		return(-1);
	}


	fprintf(fd, "/ C library - %s\n",  arg->a_name);

	fprintf(fd,"\n	.globl	%s", arg->a_name);
	fprintf(fd,"\n	.globl	.cerror");

	fprintf(fd,"\n\n%s:\n", arg->a_name);
	
	if(flag & FLAG1) {		/* arg must be *arg */

		fprintf(fd,"	movl	4(%%esp),%%edx\n");
		fprintf(fd,"	movl	(%%edx),%%edx\n");
		fprintf(fd,"	movl	%%edx,4(%%esp)\n");
	}

	/* put system-call number in d0	*/
	fprintf(fd, "	movl	$%d,%%eax\n", arg->a_num);
	fprintf(fd, "	lcall	$0x7,$0\n");
	fprintf(fd,"	jc	.cerror\n");

	if(flag & FLAG0) {		/* rval in d1 */
 
		fprintf(fd, "\n	movl	%%edx,%%eax\n");  
	}

	fprintf(fd,"	ret\n");
	fflush(fd);
	fclose(fd);

	return(0);
}

/*
 * get a line from input file and cracks args.
 */

#define BFS 20
char bfnam[BFS];

getargs(fd, arg) 	
register FILE *fd;
register struct _args *arg;
{
	register char buff[80];

	arg->a_name = NULL;
	arg->a_num = arg->a_arg = arg->a_flag = 0;

more :	if(fgets(buff, 80, fd) == NULL) {

		return(0);
	}

	else {

		char *get_word();
		register char *w;


		if(*buff == '#') {
			goto more;		/* skip comment line */
		}

		if(w = get_word(buff)) {
			strncpy(bfnam, w, BFS-1);
			arg->a_name = bfnam;	/* get func name */
		}
		else
			goto error;

		if(w = get_word(w + strlen(w) + 1))
			arg->a_num = atoi(w);	/* get sys-call number */
		else
			goto error;

		if(w = get_word(w + strlen(w) + 1))
			arg->a_arg = atoi(w);	/* get arg count */
		else
			goto error;

		if(w = get_word(w + strlen(w) + 1))
			arg->a_flag = atoi(w);	/* get flags	*/

		
		return(1);
	}

error :
	return(-1);
}


/*
 * get next string from buff and terminate it by a null.
 */

char * 
get_word(buff)
register char *buff;
{
	register char *w = (char *)0;
	register c;

	while((c = *buff)) {

		if(c == '#')		/* rest of the line is comment */
			break;

		if(isspace(c)) {

			if(w)
			{
				*buff = '\0';
				break;
			}

		} else if(!w)
			w = buff;

		buff++;
	}

	return(w);
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.