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); }
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; }