int main(int argc, char *argv[]) { Clp_Parser *clp = Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options); char buf[BUFSIZ]; const char *paper = NULL, *output = NULL; FILE *pf, *of; int overflow, nest, is_ps2write = -1, ps2write_state = 0; int colorize = 1, lighten = 1, newcoloropt = 0, random_random_seed = 1; int rotate = 0; uint32_t random_seed = 0; program_name = Clp_ProgramName(clp); while (1) { int opt = Clp_Next(clp); switch (opt) { case DIR_OPT: catdir(clp->vstr, 0, colorize, lighten, rotate); newcoloropt = 0; break; case FILE_OPT: addcat(clp->vstr, colorize, lighten, rotate); newcoloropt = 0; break; case PAPER_OPT: if (paper) { fprintf(stderr, "%s: `--paper` specified twice\n", program_name); usage_error(); } paper = clp->vstr; break; case OUTPUT_OPT: if (output) { fprintf(stderr, "%s: `--output` specified twice\n", program_name); usage_error(); } output = clp->vstr; break; case SEED_OPT: if (clp->negated) random_random_seed = -1; else if (!clp->have_val) random_random_seed = 1; else random_random_seed = 0, random_seed = clp->val.u; break; case COLORIZE_OPT: colorize = !clp->negated; newcoloropt = 1; break; case LIGHTEN_OPT: lighten = !clp->negated; newcoloropt = 1; break; case ROTATE_OPT: if (clp->negated) rotate = 0; else if (clp->have_val) rotate = clp->val.i; else rotate = 20; newcoloropt = 1; break; case NOCOLORIZE_OPT: colorize = 0; newcoloropt = 1; break; case NOLIGHTEN_OPT: lighten = 0; newcoloropt = 1; break; case MAXCATS_OPT: maxcats = clp->val.i; break; case HELP_OPT: usage(); exit(0); case VERSION_OPT: printf("yapteaparprfotci %s\n", VERSION); printf("Copyright (c) 2005-2016 Eddie Kohler\n\ This is free software; see the source for copying conditions.\n\ There is NO warranty, not even for merchantability or fitness for a\n\ particular purpose.\n"); exit(0); break; case Clp_NotOption: if (paper) { fprintf(stderr, "%s: too many arguments\n", program_name); usage_error(); } paper = clp->vstr; break; case Clp_Done: goto done; case Clp_BadOption: usage_error(); } } done: if (newcoloropt) fprintf(stderr, "%s: warning: last colorize/lighten options ignored\n(These options only affect subsequently-named cat imagery.)\n", program_name); if (!ncats) fprintf(stderr, "%s: warning: no cat imagery! (Try `-d DIR` or `-f FILE`.)\n", program_name); if (!paper || strcmp(paper, "-") == 0) { pf = stdin; paper = "<stdin>"; } else { pf = fopen(paper, "r"); if (!pf) { perror(paper); exit(1); } fclose(stdin); } // Set random seed if (random_random_seed == 0) srandom(random_seed); else if (random_random_seed > 0) { #if HAVE_SRANDOMDEV srandomdev(); #else int i; srandom(time(NULL)); for (i = 0; i < getpid() % 43; i++) (void) random(); #endif } // Check for PDF if (fgets(buf, sizeof(buf), pf) == NULL) { fprintf(stderr, "%s: Empty file\n", paper); exit(1); } int need_pdf = 0; if (memcmp(buf, "%PDF-", 5) == 0) { int pipe1[2]; if (pipe(pipe1) != 0) { perror(program_name); exit(1); } pid_t child = fork(); if (child == 0) { size_t nread; close(STDOUT_FILENO); close(pipe1[0]); dup2(pipe1[1], STDOUT_FILENO); close(pipe1[1]); FILE* p = popen("pdf2ps -dLanguageLevel=3 - -", "w"); if (!p) { perror("pdftops"); exit(1); } close(STDOUT_FILENO); fputs(buf, p); while ((nread = fread(buf, 1, sizeof(buf), pf))) fwrite(buf, 1, nread, p); pclose(p); exit(0); } else if (child < 0) { perror(program_name); exit(1); } fclose(pf); close(pipe1[1]); pf = fdopen(pipe1[0], "r"); if (fgets(buf, sizeof(buf), pf) == NULL) { fprintf(stderr, "%s: PDF conversion failed\n", paper); exit(1); } need_pdf = 1; } // Output if (need_pdf) { char* ocmd = malloc(strlen(output ? output : "-") * 2 + 20); char* opos; const char* ipos; strcpy(ocmd, "ps2pdf - "); opos = ocmd + strlen(ocmd); for (ipos = output ? output : "-"; *ipos; ++ipos) if (isalnum(*ipos) || *ipos == '/' || *ipos == '.') *opos++ = *ipos; else { *opos++ = '\\'; *opos++ = *ipos; } *opos++ = 0; of = popen(ocmd, "w"); free(ocmd); } else if (!output || strcmp(output, "-") == 0) of = stdout; else if (!(of = fopen(output, "w"))) { perror(output); exit(1); } // Actually process overflow = nest = 0; do { char *newline = strchr(buf, '\n'); if (is_ps2write > 0 && ps2write_state) ps2write_state = check_ps2write(ps2write_state, buf); else if (is_ps2write < 0) { if (buf[0] != '%') is_ps2write = 0; else if (memcmp(buf, "%%Creator:", 10) == 0) is_ps2write = strstr(buf, "ps2write") != 0; } fputs(buf, of); if (!overflow && newline && memcmp(buf, "%%BeginDocument:", 16) == 0) nest++; else if (!overflow && newline && memcmp(buf, "%%EndDocument", 13) == 0) nest--; if (!overflow && newline && memcmp(buf, "%%Page: ", 8) == 0 && nest == 0) { double bbox[4] = {0, 0, 612, 792}; if (fgets(buf, sizeof(buf), pf) != NULL && memcmp(buf, "%%PageBoundingBox: ", 19) == 0) sscanf(buf + 19, "%lg %lg %lg %lg", &bbox[0], &bbox[1], &bbox[2], &bbox[3]); cat(of, 0, bbox); ps2write_state = 1; continue; } overflow = (newline == NULL); } while (fgets(buf, sizeof(buf), pf) != NULL); if (need_pdf) pclose(of); else fclose(of); return 0; }
main() { /* PROGRAM TO LIST CATALOG BETWEEN FREQUENCY LIMITS */ char fqhi[16], buf[82], *molnam, fqlow[16], resp, *xtra, line[82]; double c, freq, err, dfqlow, dfqhi; FILE *flist; float q[7]; int moltag, cnvt, ierr, iver, iresp, nline; xtra = buf + 21; c = 29979.2458; printf(" Enter list file\n"); gets(buf); flist = fopen(buf, "w"); printf(" MHz units, or wavenumbers ? (m,w) [M] "); gets(line); cnvt = (line[0] == 'w'); if (cnvt) { printf(" ENTER FREQUENCY LIMITS IN WAVENUMBERS \n"); dfqlow = 0.; dfqhi = 10000.; gets(buf); iresp = sscanf(buf, "%lf %lf", &dfqlow, &dfqhi); dfqlow *= c; dfqhi *= c; } else { printf(" ENTER FREQUENCY LIMITS IN GHz \n"); dfqlow = 0.; dfqhi = 10000.; gets(buf); iresp = sscanf(buf, "%lf %lf", &dfqlow, &dfqhi); dfqlow *= 1000.; dfqhi *= 1000.; } sprintf(fqlow, "%13.4f", dfqlow); sprintf(fqhi, "%13.4f", dfqhi); moltag = 0; while (nxtdir(&moltag)) { molnam = catdir(moltag, &nline, q, &iver); nline = catfrq(moltag, fqlow, buf); printf("%7d %s %d\n", moltag, molnam, nline); if (nline > 0) puts(buf); if (nline > 0 && strcmp(buf, fqhi) < 0) { printf("%s is next. OK? (y/n/a) [y] ", molnam); gets(line); resp = line[0]; if (resp == 'a') exit(0); if (resp == 'y') { fprintf(flist, " %6d %s\n", moltag, molnam); do { if (cnvt) { sscanf(buf, "%13.4lf%8.4lf", &freq, &err); err /= c; freq /= c; fprintf(flist, "%13.5f%8.5f%s\n", freq, err, xtra); } else { fputs(buf, flist); fputc('\n', flist); } nline++; ierr = catrd(moltag, nline, buf); } while (ierr == 0 && strcmp(buf, fqhi) < 0); } } } printf("LAST SPECIES READ\n"); }