Ejemplo n.º 1
0
void
main(int argc, char **argv)
{
	Word *w;
	char *s, *temp;
	char *files[256], **f = files, **ff;
	int sflag = 0;
	int i;
	int tfd = -1;
	Biobuf tb;
	Bufblock *buf;
	Bufblock *whatif;

	/*
	 *  start with a copy of the current environment variables
	 *  instead of sharing them
	 */

	Binit(&bout, 1, OWRITE);
	buf = newbuf();
	whatif = 0;
	USED(argc);
	for(argv++; *argv && (**argv == '-'); argv++)
	{
		bufcpy(buf, argv[0], strlen(argv[0]));
		insert(buf, ' ');
		switch(argv[0][1])
		{
		case 'a':
			aflag = 1;
			break;
		case 'd':
			if(*(s = &argv[0][2]))
				while(*s) switch(*s++)
				{
				case 'p':	debug |= D_PARSE; break;
				case 'g':	debug |= D_GRAPH; break;
				case 'e':	debug |= D_EXEC; break;
				}
			else
				debug = 0xFFFF;
			break;
		case 'e':
			explain = &argv[0][2];
			break;
		case 'f':
			if(*++argv == 0)
				badusage();
			*f++ = *argv;
			bufcpy(buf, argv[0], strlen(argv[0]));
			insert(buf, ' ');
			break;
		case 'i':
			iflag = 1;
			break;
		case 'k':
			kflag = 1;
			break;
		case 'n':
			nflag = 1;
			break;
		case 's':
			sflag = 1;
			break;
		case 't':
			tflag = 1;
			break;
		case 'u':
			uflag = 1;
			break;
		case 'w':
			if(whatif == 0)
				whatif = newbuf();
			else
				insert(whatif, ' ');
			if(argv[0][2])
				bufcpy(whatif, &argv[0][2], strlen(&argv[0][2]));
			else {
				if(*++argv == 0)
					badusage();
				bufcpy(whatif, &argv[0][0], strlen(&argv[0][0]));
			}
			break;
		default:
			badusage();
		}
	}
#ifdef	PROF
	{
		extern etext();
		monitor(main, etext, buf, sizeof buf, 300);
	}
#endif

	if(aflag)
		iflag = 1;
	usage();
	syminit();
	initenv();
	usage();

	/*
		assignment args become null strings
	*/
	temp = 0;
	for(i = 0; argv[i]; i++) if(utfrune(argv[i], '=')){
		bufcpy(buf, argv[i], strlen(argv[i]));
		insert(buf, ' ');
		if(tfd < 0){
			temp = maketmp();
			if(temp == 0) {
				perror("temp file");
				Exit();
			}
			close(create(temp, OWRITE, 0600));
			if((tfd = open(temp, 2)) < 0){
				perror(temp);
				Exit();
			}
			Binit(&tb, tfd, OWRITE);
		}
		Bprint(&tb, "%s\n", argv[i]);
		*argv[i] = 0;
	}
	if(tfd >= 0){
		Bflush(&tb);
		LSEEK(tfd, 0L, 0);
		parse("command line args", tfd, 1);
		remove(temp);
	}

	if (buf->current != buf->start) {
		buf->current--;
		insert(buf, 0);
	}
	symlook("MKFLAGS", S_VAR, (void *) stow(buf->start));
	buf->current = buf->start;
	for(i = 0; argv[i]; i++){
		if(*argv[i] == 0) continue;
		if(i)
			insert(buf, ' ');
		bufcpy(buf, argv[i], strlen(argv[i]));
	}
	insert(buf, 0);
	symlook("MKARGS", S_VAR, (void *) stow(buf->start));
	freebuf(buf);

	if(f == files){
		if(access(MKFILE, 4) == 0)
			parse(MKFILE, open(MKFILE, 0), 0);
	} else
		for(ff = files; ff < f; ff++)
			parse(*ff, open(*ff, 0), 0);
	if(DEBUG(D_PARSE)){
		dumpw("default targets", target1);
		dumpr("rules", rules);
		dumpr("metarules", metarules);
		dumpv("variables");
	}
	if(whatif){
		insert(whatif, 0);
		timeinit(whatif->start);
		freebuf(whatif);
	}
	execinit();
	/* skip assignment args */
	while(*argv && (**argv == 0))
		argv++;

	catchnotes();
	if(*argv == 0){
		if(target1)
			for(w = target1; w; w = w->next)
				mk(w->s);
		else {
			fprint(2, "mk: nothing to mk\n");
			Exit();
		}
	} else {
		if(sflag){
			for(; *argv; argv++)
				if(**argv)
					mk(*argv);
		} else {
			Word *head, *tail, *t;

			/* fake a new rule with all the args as prereqs */
			tail = 0;
			t = 0;
			for(; *argv; argv++)
				if(**argv){
					if(tail == 0)
						tail = t = newword(*argv);
					else {
						t->next = newword(*argv);
						t = t->next;
					}
				}
			if(tail->next == 0)
				mk(tail->s);
			else {
				head = newword("command line arguments");
				addrules(head, tail, strdup(""), VIR, mkinline, 0);
				mk(head->s);
			}
		}
	}
	if(uflag)
		prusage();
	exits(0);
}
Ejemplo n.º 2
0
int cmd_dump (int argc, const char** argv)
{
    struct descriptor_d d;
    int result = 0;
    unsigned long index;
    unsigned long more;
    static int width;

    /* Parse arguments */
    while (argc > 1 && *argv[1] == '-') {
        switch (argv[1][1]) {
        case '1':
        case '2':
        case '4':
            width = argv[1][1] - '0';
            break;
        default:
            return ERROR_PARAM;
            break;
        }
        --argc;
        ++argv;
    }

    if (argc < 2)
        return ERROR_PARAM;

    if ((result = parse_descriptor (argv[1], &d))) {
        printf ("Unable to open '%s'\n", argv[1]);
        goto fail;
    }

    if (!d.length)
        d.length = 16*8;		/* ** FIXME: get from environment */

    if ((result = open_descriptor (&d)))
        goto fail;

    d.width = width;		/* Request I/O of the same width as display */

    index = d.start;
    more = index + MORE_PAGE;

    /* *** FIXME: it would be a very good idea to let this function read
       *** more than 16 bytes from the input stream.  It might be
       *** expensive to fetch the incoming data (e.g. NAND) so we'd like
       *** to be friendly.  That said, it might not matter much since
       *** we're just showing it to the user.  */

    while (index < d.start + d.length) {
        char __aligned rgb[16];
        size_t available = sizeof (rgb);
        int cb;

        if (available > d.start + d.length - index)
            available = d.start + d.length - index;

        cb = d.driver->read (&d, rgb, available);

        if (cb < 0)
            goto fail;

        if (cb == 0) {
            result = ERROR_RESULT (ERROR_FAILURE, "premature end of input");
            goto fail;
        }

        dumpw (rgb, cb, index, width);
        index += cb;

        if (index >= more && index < d.start + d.length) {
            char ch;

            printf (" --More-- ");
            console->read (0, &ch, 1);
            switch (ch) {
            default:
            case 'q':
            case '.':
                index = d.start + d.length;
                break;

            case '\r':
            case '\n':
                more = index + MORE_LINE;
                break;

            case ' ':
                more = index + MORE_PAGE;
                break;
            }
            printf ("\r");
        }
    }

    printf ("         \r");

fail:
    close_descriptor (&d);

    return result;
}