void v_report(int severity, const char *fnm, int line, int col, int en, va_list ap) { #ifdef AVEN (void)col; aven_v_report(severity, fnm, line, en, ap); #else const char * level; if (fnm) { fputs(fnm, STDERR); if (line) fprintf(STDERR, ":%d", line); if (col > 0) fprintf(STDERR, ":%d", col); } else { fputs(appname_copy, STDERR); } fputs(": ", STDERR); if (severity == 0) { /* TRANSLATORS: Indicates a warning message e.g.: * "spoon.svx:12: warning: *prefix is deprecated" */ level = msg(/*warning*/4); } else { /* TRANSLATORS: Indicates an error message e.g.: * "spoon.svx:13:4: error: Field may not be omitted" */ level = msg(/*error*/93); } fputs(level, STDERR); fputs(": ", STDERR); vfprintf(STDERR, msg(en), ap); fputnl(STDERR); #endif switch (severity) { case 0: msg_warnings++; break; case 1: msg_errors++; if (msg_errors == 50) fatalerror_in_file(fnm, 0, /*Too many errors - giving up*/19); break; case 2: exit(EXIT_FAILURE); } }
static void cmd_require(void) { const unsigned int version[] = {COMMAVERSION}; const unsigned int *ver = version; filepos fp; skipblanks(); get_pos(&fp); while (1) { int diff = *ver++ - read_uint(); if (diff > 0) break; if (diff < 0) { size_t i, len; char *v; filepos fp_tmp; /* find end of version number */ while (isdigit(ch) || ch == '.') nextch(); get_pos(&fp_tmp); len = (size_t)(fp_tmp.offset - fp.offset); v = osmalloc(len + 1); set_pos(&fp); for (i = 0; i < len; i++) { v[i] = ch; nextch(); } v[i] = '\0'; fatalerror_in_file(file.filename, file.line, /*Survex version %s or greater required to process this survey data.*/2, v); } if (ch != '.') break; nextch(); if (!isdigit(ch) || ver == version + sizeof(version)) break; } /* skip rest of version number */ while (isdigit(ch) || ch == '.') nextch(); }
int main(int argc, char **argv) { const char *fnm_in, *fnm_out; char *desc; img_point pt; int result; point *fr = NULL, *to; double zMax = -DBL_MAX; point *p; const char *survey = NULL; const char *specfile = NULL; img *pimg; int have_xsect = 0; msg_init(argv); /* TRANSLATORS: Part of extend --help */ cmdline_set_syntax_message(/*INPUT_3D_FILE [OUTPUT_3D_FILE]*/267, 0, NULL); cmdline_init(argc, argv, short_opts, long_opts, NULL, help, 1, 2); while (1) { int opt = cmdline_getopt(); if (opt == EOF) break; if (opt == 's') survey = optarg; if (opt == 'p') specfile = optarg; } fnm_in = argv[optind++]; if (argv[optind]) { fnm_out = argv[optind]; } else { char * base_in = base_from_fnm(fnm_in); char * base_out = osmalloc(strlen(base_in) + 8); strcpy(base_out, base_in); strcat(base_out, "_extend"); fnm_out = add_ext(base_out, EXT_SVX_3D); osfree(base_in); osfree(base_out); } /* try to open image file, and check it has correct header */ pimg = img_open_survey(fnm_in, survey); if (pimg == NULL) fatalerror(img_error2msg(img_error()), fnm_in); putnl(); puts(msg(/*Reading in data - please wait…*/105)); htab = osmalloc(ossizeof(pfx*) * HTAB_SIZE); { int i; for (i = 0; i < HTAB_SIZE; ++i) htab[i] = NULL; } do { result = img_read_item(pimg, &pt); switch (result) { case img_MOVE: fr = find_point(&pt); break; case img_LINE: if (!fr) { result = img_BAD; break; } to = find_point(&pt); if (!(pimg->flags & (img_FLAG_SURFACE|img_FLAG_SPLAY))) add_leg(fr, to, pimg->label, pimg->flags); fr = to; break; case img_LABEL: to = find_point(&pt); add_label(to, pimg->label, pimg->flags); break; case img_BAD: (void)img_close(pimg); fatalerror(img_error2msg(img_error()), fnm_in); break; case img_XSECT: have_xsect = 1; break; } } while (result != img_STOP); desc = osstrdup(pimg->title); if (specfile) { FILE *fs = NULL; char *fnm_used; /* TRANSLATORS: for extend: */ printf(msg(/*Applying specfile: “%s”*/521), specfile); putnl(); fs = fopenWithPthAndExt("", specfile, NULL, "r", &fnm_used); if (fs == NULL) fatalerror(/*Couldn’t open file “%s”*/93, specfile); while (!feof(fs)) { char *lbuf = getline_alloc(fs, 32); lineno++; if (!lbuf) fatalerror_in_file(fnm_used, lineno, /*Error reading file*/18); parseconfigline(fnm_used, lbuf); osfree(lbuf); } osfree(fnm_used); } if (start == NULL) { /* i.e. start wasn't specified in specfile */ /* start at the highest entrance with some legs attached */ for (p = headpoint.next; p != NULL; p = p->next) { if (p->order > 0 && p->p.z > zMax) { const stn *s; for (s = p->stns; s; s = s->next) { if (s->flags & img_SFLAG_ENTRANCE) { start = p; zMax = p->p.z; break; } } } } if (start == NULL) { /* if no entrances with legs, start at the highest 1-node */ for (p = headpoint.next; p != NULL; p = p->next) { if (p->order == 1 && p->p.z > zMax) { start = p; zMax = p->p.z; } } /* of course we may have no 1-nodes... */ if (start == NULL) { for (p = headpoint.next; p != NULL; p = p->next) { if (p->order != 0 && p->p.z > zMax) { start = p; zMax = p->p.z; } } if (start == NULL) { /* There are no legs - just pick the highest station... */ for (p = headpoint.next; p != NULL; p = p->next) { if (p->p.z > zMax) { start = p; zMax = p->p.z; } } if (!start) fatalerror(/*No survey data*/43); } } } } /* TRANSLATORS: for extend: * Used to tell the user that a file is being written - %s is the filename */ printf(msg(/*Writing %s…*/522), fnm_out); putnl(); pimg_out = img_open_write(fnm_out, desc, img_FFLAG_EXTENDED); /* Only does single connected component currently. */ do_stn(start, 0.0, NULL, ERIGHT, 0); if (have_xsect) { img_rewind(pimg); /* Read ahead on pimg before writing pimg_out so we find out if an * img_XSECT_END comes next. */ char * label = NULL; int flags = 0; do { result = img_read_item(pimg, &pt); if (result == img_XSECT || result == img_XSECT_END) { if (label) { if (result == img_XSECT_END) flags |= img_XFLAG_END; img_write_item(pimg_out, img_XSECT, flags, label, 0, 0, 0); osfree(label); label = NULL; } } if (result == img_XSECT) { label = osstrdup(pimg->label); flags = pimg->flags; pimg_out->l = pimg->l; pimg_out->r = pimg->r; pimg_out->u = pimg->u; pimg_out->d = pimg->d; } } while (result != img_STOP); } (void)img_close(pimg); if (!img_close(pimg_out)) { (void)remove(fnm_out); fatalerror(img_error2msg(img_error()), fnm_out); } return EXIT_SUCCESS; }
static void parseconfigline(const char *fnm, char *ln) { point *p; const stn *s; const stn *t; leg *l; char *lc = NULL; ln = delimword(ln, &lc); if (*ln == '\0') return; if (strcmp(ln, "*start")==0) { ln = delimword(lc, &lc); if (*ln == 0) fatalerror_in_file(fnm, lineno, /*Expecting station name*/28); for (p = headpoint.next; p != NULL; p = p->next) { for (s = p->stns; s; s = s->next) { if (strcmp(s->label, ln)==0) { start = p; /* TRANSLATORS: for extend: "extend" is starting to produce an extended elevation from station %s */ printf(msg(/*Starting from station %s*/512),ln); putnl(); goto loopend; } } } /* TRANSLATORS: for extend: the user specified breaking a loop or * changing extend direction at this station, but we didn’t find it in * the 3d file */ warning_in_file(fnm, lineno, /*Failed to find station %s*/510, ln); } else if (strcmp(ln, "*eleft")==0) { char *ll = delimword(lc, &lc); if (*ll == 0) fatalerror_in_file(fnm, lineno, /*Expecting station name*/28); ln = delimword(lc, &lc); if (*ln == 0) { /* One argument, look for point to switch at. */ for (p = headpoint.next; p != NULL; p = p->next) { for (s = p->stns; s; s = s->next) { if (strcmp(s->label, ll)==0) { /* TRANSLATORS: for extend: */ printf(msg(/*Extending to the left from station %s*/513), ll); putnl(); p->dir = ELEFT; goto loopend; } } } warning_in_file(fnm, lineno, /*Failed to find station %s*/510, ll); } else { /* Two arguments look for a specific leg */ for (l = headleg.next; l; l=l->next) { point * fr = l->fr; point * to = l->to; if (fr && to) { for (s=fr->stns; s; s=s->next) { int b = 0; if (strcmp(s->label,ll)==0 || (strcmp(s->label, ln)==0 && (b = 1)) ) { char * lr = (b ? ll : ln); for (t=to->stns; t; t=t->next) { if (strcmp(t->label,lr)==0) { /* TRANSLATORS: for extend: */ printf(msg(/*Extending to the left from leg %s → %s*/515), s->label, t->label); putnl(); l->dir = ELEFT; goto loopend; } } } } } } /* TRANSLATORS: for extend: the user specified breaking a loop or * changing extend direction at this leg, but we didn’t find it in the * 3d file */ warning_in_file(fnm, lineno, /*Failed to find leg %s → %s*/511, ll, ln); } } else if (strcmp(ln, "*eright")==0) { char *ll = delimword(lc, &lc); if (*ll == 0) fatalerror_in_file(fnm, lineno, /*Expecting station name*/28); ln = delimword(lc, &lc); if (*ln == 0) { /* One argument, look for point to switch at. */ for (p = headpoint.next; p != NULL; p = p->next) { for (s = p->stns; s; s = s->next) { if (strcmp(s->label, ll)==0) { /* TRANSLATORS: for extend: */ printf(msg(/*Extending to the right from station %s*/514), ll); putnl(); p->dir = ERIGHT; goto loopend; } } } warning_in_file(fnm, lineno, /*Failed to find station %s*/510, ll); } else { /* Two arguments look for a specific leg */ for (l = headleg.next; l; l=l->next) { point * fr = l->fr; point * to = l->to; if (fr && to) { for (s=fr->stns; s; s=s->next) { int b = 0; if (strcmp(s->label,ll)==0 || (strcmp(s->label, ln)==0 && (b = 1)) ) { char * lr = (b ? ll : ln); for (t=to->stns; t; t=t->next) { if (strcmp(t->label,lr)==0) { /* TRANSLATORS: for extend: */ printf(msg(/*Extending to the right from leg %s → %s*/516), s->label, t->label); putnl(); l->dir=ERIGHT; goto loopend; } } } } } } warning_in_file(fnm, lineno, /*Failed to find leg %s → %s*/511, ll, ln); } } else if (strcmp(ln, "*eswap")==0) { char *ll = delimword(lc, &lc); if (*ll == 0) fatalerror_in_file(fnm, lineno, /*Expecting station name*/28); ln = delimword(lc, &lc); if (*ln == 0) { /* One argument, look for point to switch at. */ for (p = headpoint.next; p != NULL; p = p->next) { for (s = p->stns; s; s = s->next) { if (strcmp(s->label, ll)==0) { /* TRANSLATORS: for extend: */ printf(msg(/*Swapping extend direction from station %s*/519),ll); putnl(); p->dir = ESWAP; goto loopend; } } } warning_in_file(fnm, lineno, /*Failed to find station %s*/510, ll); } else { /* Two arguments look for a specific leg */ for (l = headleg.next; l; l=l->next) { point * fr = l->fr; point * to = l->to; if (fr && to) { for (s=fr->stns; s; s=s->next) { int b = 0; if (strcmp(s->label,ll)==0 || (strcmp(s->label, ln)==0 && (b = 1)) ) { char * lr = (b ? ll : ln); for (t=to->stns; t; t=t->next) { if (strcmp(t->label,lr)==0) { /* TRANSLATORS: for extend: */ printf(msg(/*Swapping extend direction from leg %s → %s*/520), s->label, t->label); putnl(); l->dir = ESWAP; goto loopend; } } } } } } warning_in_file(fnm, lineno, /*Failed to find leg %s → %s*/511, ll, ln); } } else if (strcmp(ln, "*break")==0) { char *ll = delimword(lc, &lc); if (*ll == 0) fatalerror_in_file(fnm, lineno, /*Expecting station name*/28); ln = delimword(lc, &lc); if (*ln == 0) { /* One argument, look for point to break at. */ for (p = headpoint.next; p != NULL; p = p->next) { for (s = p->stns; s; s = s->next) { if (strcmp(s->label, ll)==0) { /* TRANSLATORS: for extend: */ printf(msg(/*Breaking survey loop at station %s*/517), ll); putnl(); p->fBroken = 1; goto loopend; } } } warning_in_file(fnm, lineno, /*Failed to find station %s*/510, ll); } else { /* Two arguments look for a specific leg */ for (l = headleg.next; l; l=l->next) { point * fr = l->fr; point * to = l->to; if (fr && to) { for (s=fr->stns; s; s=s->next) { int b = 0; if (strcmp(s->label,ll)==0 || (strcmp(s->label, ln)==0 && (b = 1)) ) { char * lr = (b ? ll : ln); for (t=to->stns; t; t=t->next) { if (strcmp(t->label,lr)==0) { /* TRANSLATORS: for extend: */ printf(msg(/*Breaking survey loop at leg %s → %s*/518), s->label, t->label); putnl(); l->broken = (b ? BREAK_TO : BREAK_FR); goto loopend; } } } } } } warning_in_file(fnm, lineno, /*Failed to find leg %s → %s*/511, ll, ln); } } else { fatalerror_in_file(fnm, lineno, /*Unknown command “%s”*/12, ln); } loopend: ln = delimword(lc, &lc); if (*ln != 0) { fatalerror_in_file(fnm, lineno, /*End of line not blank*/15); /* FIXME: give ln as context? */ } }