int main( void ) { avr_init(); pulse_init(); puts( "$Id: tach.c,v 2.0 2002/09/22 02:10:18 tramm Exp $" ); putnl(); while( 1 ) { puthex( high_bits ); puthex( time() ); putc( ':' ); puthexs( pulse_0 ); putc( ' ' ); puthexs( pulse_1 ); putnl(); pulse_1 = pulse_0 = 0; msleep( 8192 ); } return 0; }
O#include "beagleboneblack.h" static void banner(void) { putcn('=', 65); putnl(); puts("SERT: System Environment for Real-Time, version "); putf(2015.11, 2); /* just for trying the floating-point unit */ puts("\nMarco Cesati, SPRG, DICII, University of Rome Tor Vergata\n"); putcn('=', 65); putnl(); }
static int tree_check(void) { size_t c = 0; char **names; size_t i; if (c_added) { names = osmalloc(c_added * ossizeof(char *)); for (i = 0; i < c_added; i++) { added *old; SVX_ASSERT(added_list); names[i] = added_list->name; old = added_list; added_list = old->next; osfree(old); } SVX_ASSERT(added_list == NULL); sort_separator = new_separator; qsort(names, c_added, sizeof(char *), cmp_pname); for (i = 0; i < c_added; i++) { printf(msg(/*Added: %s*/501), names[i]); putnl(); osfree(names[i]); } osfree(names); } for (i = 0; i < TREE_SIZE; i++) { station *p; for (p = htab[i]; p; p = p->next) c++; } if (c == 0) return fChanged; names = osmalloc(c * ossizeof(char *)); c = 0; for (i = 0; i < TREE_SIZE; i++) { station *p; for (p = htab[i]; p; p = p->next) names[c++] = p->name; } sort_separator = old_separator; qsort(names, c, sizeof(char *), cmp_pname); for (i = 0; i < c; i++) { printf(msg(/*Deleted: %s*/502), names[i]); putnl(); } return fTrue; }
/* * Newline + flush. */ void putNFL(void) { putnl(); flush(); }
void dump_long(char *str, uint32_t val) { putstr(str); puthex((val>>24)&0xff); puthex((val>>16)&0xff); puthex((val>>8)&0xff); puthex(val&0xff); putnl(); }
static void tree_remove(const char *name, const img_point *pt) { /* We need to handle duplicate labels - normal .3d files shouldn't have them * (though some older ones do due to a couple of bugs in earlier versions of * Survex) but extended .3d files repeat the label where a loop is broken, * and data read from foreign formats might repeat labels. */ int v = hash_string(name) & (TREE_SIZE - 1); station **prev; station *p; station **found = NULL; bool was_close_enough = fFalse; for (prev = &htab[v]; *prev; prev = &((*prev)->next)) { if (strcmp((*prev)->name, name) == 0) { /* Handle stations with the same name. Stations are inserted at the * start of the linked list, so pick the *last* matching station in * the list as then we match the first stations with the same name in * each file. */ if (close_enough(pt, &((*prev)->pt))) { found = prev; was_close_enough = fTrue; } else if (!was_close_enough) { found = prev; } } } if (!found) { added *add = osnew(added); add->name = osstrdup(name); add->next = added_list; added_list = add; c_added++; fChanged = fTrue; return; } if (!was_close_enough) { printf(msg(/*Moved by (%3.2f,%3.2f,%3.2f): %s*/500), pt->x - (*found)->pt.x, pt->y - (*found)->pt.y, pt->z - (*found)->pt.z, name); putnl(); fChanged = fTrue; } osfree((*found)->name); p = *found; *found = p->next; osfree(p); }
int main( void ) { int cycle_count = 0; uint8_t servo_pos = 0; avr_init(); adc_init( 0x70 ); puts( "$Id: sweep.c,v 2.0 2002/09/22 02:10:18 tramm Exp $" ); putnl(); while( 1 ) { accel_task( adc_task ); if( ++cycle_count % 32 ) continue; puthex( high_bits ); puthex( time() ); putc( ':' ); puts( " Ax=" ); puthex( a_x ); puts( " Ay=" ); puthex( a_y ); puts( " pos=" ); puthexs( servo_pos ); servo_set( 0, servo_pos ); servo_set( 1, servo_pos ); servo_set( 2, servo_pos ); servo_set( 3, servo_pos ); servo_set( 4, servo_pos ); servo_set( 5, servo_pos ); servo_set( 6, servo_pos ); servo_set( 7, servo_pos ); servo_pos += 8; putnl(); } return 0; }
static void do_stats(void) { long cLoops = cComponents + cLegs - cStns; putnl(); if (cStns == 1) { fputs(msg(/*Survey contains 1 survey station,*/172), stdout); } else { printf(msg(/*Survey contains %ld survey stations,*/173), cStns); } if (cLegs == 1) { fputs(msg(/* joined by 1 leg.*/174), stdout); } else { printf(msg(/* joined by %ld legs.*/175), cLegs); } putnl(); if (cLoops == 1) { fputs(msg(/*There is 1 loop.*/138), stdout); } else { printf(msg(/*There are %ld loops.*/139), cLoops); } putnl(); if (cComponents != 1) { printf(msg(/*Survey has %ld connected components.*/178), cComponents); putnl(); } printf(msg(/*Total length of survey legs = %7.2fm (%7.2fm adjusted)*/132), total, totadj); putnl(); printf(msg(/*Total plan length of survey legs = %7.2fm*/133), totplan); putnl(); printf(msg(/*Total vertical length of survey legs = %7.2fm*/134), totvert); putnl(); /* If there's no underground survey, we've no ranges */ if (pfxHi[0]) { do_range(2, /*Vertical range = %4.2fm (from %s at %4.2fm to %s at %4.2fm)*/135); do_range(1, /*North-South range = %4.2fm (from %s at %4.2fm to %s at %4.2fm)*/136); do_range(0, /*East-West range = %4.2fm (from %s at %4.2fm to %s at %4.2fm)*/137); } print_node_stats(); /* Also, could give: * # nodes stations (ie have other than two references or are fixed) * # fixed stations (list of?) */ }
static inline void input_task( void ) { static uint8_t phase; static uint8_t servo; static uint8_t high_bits; static uint8_t low_bits; uint8_t i = 4; uint8_t c = '-'; while( i-- && getc( &c ) ) { switch( phase ) { case 0: /* Wait for sync pulse */ if( c == 0xFF ) phase = 1; break; case 1: servo = c; phase = 2; break; case 2: high_bits = c; phase = 3; break; case 3: low_bits = c; if( servo > SERVO_MAX ) continue; command[ servo ] = 0 | ((int)low_bits) << 0 | ((int)high_bits) << 8; puts( "$SRV" ); put_uint8_t( servo ); putc( ',' ); put_uint16_t( command[ servo ] ); putnl(); /* Fall through */ default: phase = 0; } } }
void dump_buf(char *buf) { int i; for (i = 0; i< 512; i++) { puthex(buf[i]); putc(' '); if ((i & 15) == 15) { putnl(); }; }; }
static void do_range(int d, int msgno) { /* sprint_prefix uses a single buffer, so to report two stations in one * message we need to make a temporary copy of the string for one of them. */ char * pfx_hi = osstrdup(sprint_prefix(pfxHi[d])); char * pfx_lo = sprint_prefix(pfxLo[d]); printf(msg(msgno), max[d] - min[d], pfx_hi, max[d], pfx_lo, min[d]); osfree(pfx_hi); putnl(); }
int main( void ) { avr_init(); puts( "echo: Send me data" ); putnl(); while( 1 ) { uint8_t c; while( getchar( &c ) < 0 ) ; puthex( time() ); puts( ": read: " ); putc( c ); putnl(); } return 0; }
static void do_range(int d, int msgno, real length_factor, const char * units) { /* sprint_prefix uses a single buffer, so to report two stations in one * message we need to make a temporary copy of the string for one of them. */ char * pfx_hi = osstrdup(sprint_prefix(pfxHi[d])); char * pfx_lo = sprint_prefix(pfxLo[d]); real hi = max[d] * length_factor; real lo = min[d] * length_factor; printf(msg(msgno), hi - lo, units, pfx_hi, hi, units, pfx_lo, lo, units); osfree(pfx_hi); putnl(); }
int create_task(job_t job, void *arg, unsigned long period, unsigned long delay, unsigned long prio_dead, int type, const char *name) { int i; struct task *t; for (i = 1; i < MAX_NUM_TASKS; ++i) /* skip task 0 (idle task) */ if (!taskset[i].valid) break; if (i == MAX_NUM_TASKS) return -1; t = taskset + i; t->job = job; t->arg = (arg == NULL ? t : arg); t->name = name; t->period = period; t->releasetime = ticks + delay; if (type == EDF) { /* this is an EDF task * priority is set to the absolute deadline of the first job * a small absolute deadline yields a large priority */ if (prio_dead == 0) return -1; t->priority = prio_dead + t->releasetime; t->deadline = prio_dead; } else { /* this is a fixed-priority task * to be run in background if no other EDF job is pending */ t->priority = prio_dead; t->deadline = 0; } t->released = 0; init_task_context(t, i); __memory_barrier(); irq_disable(); ++num_tasks; t->valid = 1; irq_enable(); puts("Task "); puts(name); puts(" created, TID="); putu(i); putnl(); return i; }
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 do_stats(void) { long cLoops = cComponents + cLegs - cStns; int length_units = get_length_units(Q_LENGTH); const char * units = get_units_string(length_units); real length_factor = 1.0 / get_units_factor(length_units); putnl(); if (cStns == 1) { fputs(msg(/*Survey contains 1 survey station,*/172), stdout); } else { printf(msg(/*Survey contains %ld survey stations,*/173), cStns); } if (cLegs == 1) { fputs(msg(/* joined by 1 leg.*/174), stdout); } else { printf(msg(/* joined by %ld legs.*/175), cLegs); } putnl(); if (cLoops == 1) { fputs(msg(/*There is 1 loop.*/138), stdout); } else { printf(msg(/*There are %ld loops.*/139), cLoops); } putnl(); if (cComponents != 1) { /* TRANSLATORS: "Connected component" in the graph theory sense - it * means there are %ld bits of survey with no connections between them. * This message is only used if there are more than 1. */ printf(msg(/*Survey has %ld connected components.*/178), cComponents); putnl(); } printf(msg(/*Total length of survey legs = %7.2f%s (%7.2f%s adjusted)*/132), total * length_factor, units, totadj * length_factor, units); putnl(); printf(msg(/*Total plan length of survey legs = %7.2f%s*/133), totplan * length_factor, units); putnl(); printf(msg(/*Total vertical length of survey legs = %7.2f%s*/134), totvert * length_factor, units); putnl(); /* If there's no underground survey, we've no ranges */ if (pfxHi[0]) { /* TRANSLATORS: numbers are altitudes of highest and lowest stations */ do_range(2, /*Vertical range = %4.2f%s (from %s at %4.2f%s to %s at %4.2f%s)*/135, length_factor, units); /* TRANSLATORS: c.f. previous message */ do_range(1, /*North-South range = %4.2f%s (from %s at %4.2f%s to %s at %4.2f%s)*/136, length_factor, units); /* TRANSLATORS: c.f. previous two messages */ do_range(0, /*East-West range = %4.2f%s (from %s at %4.2f%s to %s at %4.2f%s)*/137, length_factor, units); } print_node_stats(); /* Also, could give: * # nodes stations (ie have other than two references or are fixed) * # fixed stations (list of?) */ }
extern CDECL int main(int argc, char **argv) { int d; time_t tmUserStart = time(NULL); clock_t tmCPUStart = clock(); { /* FIXME: localtime? */ struct tm * t = localtime(&tmUserStart); int y = t->tm_year + 1900; current_days_since_1900 = days_since_1900(y, t->tm_mon + 1, t->tm_mday); } /* Always buffer by line for aven's benefit. */ setvbuf(stdout, NULL, _IOLBF, 0); msg_init(argv); #if OS_WIN32 || OS_UNIX_MACOSX pj_set_finder(msg_proj_finder); #endif pcs = osnew(settings); pcs->next = NULL; pcs->Translate = ((short*) osmalloc(ossizeof(short) * 257)) + 1; pcs->meta = NULL; pcs->proj = NULL; pcs->declination = HUGE_REAL; pcs->convergence = 0.0; /* Set up root of prefix hierarchy */ root = osnew(prefix); root->up = root->right = root->down = NULL; root->stn = NULL; root->pos = NULL; root->ident = NULL; root->min_export = root->max_export = 0; root->sflags = BIT(SFLAGS_SURVEY); root->filename = NULL; nosurveyhead = NULL; stnlist = NULL; cLegs = cStns = cComponents = 0; totadj = total = totplan = totvert = 0.0; for (d = 0; d <= 2; d++) { min[d] = HUGE_REAL; max[d] = -HUGE_REAL; pfxHi[d] = pfxLo[d] = NULL; } /* at least one argument must be given */ cmdline_init(argc, argv, short_opts, long_opts, NULL, help, 1, -1); while (1) { int opt = cmdline_getopt(); if (opt == EOF) break; switch (opt) { case 'p': /* Ignore for compatibility with older versions. */ break; case 'o': { osfree(fnm_output_base); /* in case of multiple -o options */ /* can be a directory (in which case use basename of leaf input) * or a file (in which case just trim the extension off) */ if (fDirectory(optarg)) { /* this is a little tricky - we need to note the path here, * and then add the leaf later on (in datain.c) */ fnm_output_base = base_from_fnm(optarg); fnm_output_base_is_dir = 1; } else { fnm_output_base = base_from_fnm(optarg); } break; } case 'q': if (fQuiet) fMute = 1; fQuiet = 1; break; case 's': fSuppress = 1; break; case 'v': { int v = atoi(optarg); if (v < IMG_VERSION_MIN || v > IMG_VERSION_MAX) fatalerror(/*3d file format versions %d to %d supported*/88, IMG_VERSION_MIN, IMG_VERSION_MAX); img_output_version = v; break; } case 'w': f_warnings_are_errors = 1; break; case 'z': { /* Control which network optimisations are used (development tool) */ static int first_opt_z = 1; char c; if (first_opt_z) { optimize = 0; first_opt_z = 0; } /* Lollipops, Parallel legs, Iterate mx, Delta* */ while ((c = *optarg++) != '\0') if (islower((unsigned char)c)) optimize |= BITA(c); break; case 1: fLog = fTrue; break; #if OS_WIN32 case 2: atexit(pause_on_exit); break; #endif } } } if (fLog) { char *fnm; if (!fnm_output_base) { char *p; p = baseleaf_from_fnm(argv[optind]); fnm = add_ext(p, EXT_LOG); osfree(p); } else if (fnm_output_base_is_dir) { char *p; fnm = baseleaf_from_fnm(argv[optind]); p = use_path(fnm_output_base, fnm); osfree(fnm); fnm = add_ext(p, EXT_LOG); osfree(p); } else { fnm = add_ext(fnm_output_base, EXT_LOG); } if (!freopen(fnm, "w", stdout)) fatalerror(/*Failed to open output file “%s”*/47, fnm); osfree(fnm); } if (!fMute) { const char *p = COPYRIGHT_MSG; puts(PRETTYPACKAGE" "VERSION); while (1) { const char *q = p; p = strstr(p, "(C)"); if (p == NULL) { puts(q); break; } fwrite(q, 1, p - q, stdout); fputs(msg(/*©*/0), stdout); p += 3; } } atexit(delete_output_on_error); /* end of options, now process data files */ while (argv[optind]) { const char *fnm = argv[optind]; if (!fExplicitTitle) { char *lf; lf = baseleaf_from_fnm(fnm); if (survey_title) s_catchar(&survey_title, &survey_title_len, ' '); s_cat(&survey_title, &survey_title_len, lf); osfree(lf); } /* Select defaults settings */ default_all(pcs); data_file(NULL, fnm); /* first argument is current path */ optind++; } validate(); solve_network(/*stnlist*/); /* Find coordinates of all points */ validate(); /* close .3d file */ if (!img_close(pimg)) { char *fnm = add_ext(fnm_output_base, EXT_SVX_3D); fatalerror(img_error2msg(img_error()), fnm); } if (fhErrStat) safe_fclose(fhErrStat); out_current_action(msg(/*Calculating statistics*/120)); if (!fMute) do_stats(); if (!fQuiet) { /* clock() typically wraps after 72 minutes, but there doesn't seem * to be a better way. Still 72 minutes means some cave! * We detect if clock() could have wrapped and suppress CPU time * printing in this case. */ double tmUser = difftime(time(NULL), tmUserStart); double tmCPU; clock_t now = clock(); #define CLOCK_T_WRAP \ (sizeof(clock_t)<sizeof(long)?(1ul << (CHAR_BIT * sizeof(clock_t))):0) tmCPU = (now - (unsigned long)tmCPUStart) / (double)CLOCKS_PER_SEC; if (now < tmCPUStart) tmCPU += CLOCK_T_WRAP / (double)CLOCKS_PER_SEC; if (tmUser >= tmCPU + CLOCK_T_WRAP / (double)CLOCKS_PER_SEC) tmCPU = 0; /* tmUser is integer, tmCPU not - equivalent to (ceil(tmCPU) >= tmUser) */ if (tmCPU + 1 > tmUser) { printf(msg(/*CPU time used %5.2fs*/140), tmCPU); } else if (tmCPU == 0) { if (tmUser != 0.0) { printf(msg(/*Time used %5.2fs*/141), tmUser); } else { fputs(msg(/*Time used unavailable*/142), stdout); } } else { printf(msg(/*Time used %5.2fs (%5.2fs CPU time)*/143), tmUser, tmCPU); } putnl(); } if (msg_warnings || msg_errors) { if (msg_errors || (f_warnings_are_errors && msg_warnings)) { printf(msg(/*There were %d warning(s) and %d error(s) - no output files produced.*/113), msg_warnings, msg_errors); putnl(); return EXIT_FAILURE; } printf(msg(/*There were %d warning(s).*/16), msg_warnings); putnl(); } return EXIT_SUCCESS; }
/* * Main loop for command mode command decoding. * A few commands are executed here, but main function * is to strip command addresses, do a little address oriented * processing and call command routines to do the real work. */ void commands(bool noprompt, bool exitoneof) { register line *addr; register int c; register int lchng; int given; int seensemi; int cnt; bool hadpr; resetflav(); nochng(); for (;;) { /* * If dot at last command * ended up at zero, advance to one if there is a such. */ if (dot <= zero) { dot = zero; if (dol > zero) dot = one; } shudclob = 0; /* * If autoprint or trailing print flags, * print the line at the specified offset * before the next command. */ if (pflag || (lchng != chng && value(AUTOPRINT) && !inglobal && !inopen && endline)) { pflag = 0; nochng(); if (dol != zero) { addr1 = addr2 = dot + poffset; if (addr1 < one || addr1 > dol) error("Offset out-of-bounds|Offset after command too large"); setdot1(); goto print; } } nochng(); /* * Print prompt if appropriate. * If not in global flush output first to prevent * going into pfast mode unreasonably. */ if (inglobal == 0) { flush(); if (!hush && value(PROMPT) && !globp && !noprompt && endline) { ex_putchar(':'); hadpr = 1; } TSYNC(); } /* * Gobble up the address. * Degenerate addresses yield ".". */ addr2 = 0; given = seensemi = 0; do { addr1 = addr2; addr = address(0); c = getcd(); if (addr == 0) { if (c == ',') addr = dot; else if (addr1 != 0) { addr2 = dot; break; } else break; } addr2 = addr; given++; if (c == ';') { c = ','; dot = addr; seensemi = 1; } } while (c == ','); if (c == '%') { /* %: same as 1,$ */ addr1 = one; addr2 = dol; given = 2; c = ex_getchar(); } if (addr1 == 0) addr1 = addr2; if (c == ':') c = ex_getchar(); /* * Set command name for special character commands. */ tailspec(c); /* * If called via : escape from open or visual, limit * the set of available commands here to save work below. */ if (inopen) { if (c=='\n' || c=='\r' || c==CTRL('d') || c==EOF) { if (addr2) dot = addr2; if (c == EOF) return; continue; } if (any(c, "o")) notinvis: tailprim(Command, 1, 1); } switch (c) { case 'a': switch(peekchar()) { case 'b': /* abbreviate */ tail("abbreviate"); setnoaddr(); mapcmd(0, 1); anyabbrs = 1; continue; case 'r': /* args */ tail("args"); setnoaddr(); eol(); pargs(); continue; } /* append */ if (inopen) goto notinvis; tail("append"); setdot(); aiflag = exclam(); ex_newline(); vmacchng(0); deletenone(); setin(addr2); inappend = 1; ignore(append(gettty, addr2)); inappend = 0; nochng(); continue; case 'c': switch (peekchar()) { /* copy */ case 'o': tail("copy"); vmacchng(0); move(); continue; #ifdef CHDIR /* cd */ case 'd': tail("cd"); goto changdir; /* chdir */ case 'h': ignchar(); if (peekchar() == 'd') { register char *p; tail2of("chdir"); changdir: if (savedfile[0] == '/' || !value(WARN)) ignore(exclam()); else ignore(quickly()); if (skipend()) { p = getenv("HOME"); if (p == NULL) error("Home directory unknown"); } else getone(), p = file; eol(); if (chdir(p) < 0) filioerr(p); if (savedfile[0] != '/') edited = 0; continue; } if (inopen) tailprim("change", 2, 1); tail2of("change"); break; #endif default: if (inopen) goto notinvis; tail("change"); break; } /* change */ aiflag = exclam(); setCNL(); vmacchng(0); setin(addr1); delete(0); inappend = 1; ignore(append(gettty, addr1 - 1)); inappend = 0; nochng(); continue; /* delete */ case 'd': /* * Caution: dp and dl have special meaning already. */ tail("delete"); c = cmdreg(); setCNL(); vmacchng(0); if (c) YANKreg(c); delete(0); appendnone(); continue; /* edit */ /* ex */ case 'e': tail(peekchar() == 'x' ? "ex" : "edit"); editcmd: if (!exclam() && chng) c = 'E'; filename(c); if (c == 'E') { ungetchar(lastchar()); ignore(quickly()); } setnoaddr(); doecmd: init(); addr2 = zero; laste++; ex_sync(); rop(c); nochng(); continue; /* file */ case 'f': tail("file"); setnoaddr(); filename(c); noonl(); /* synctmp(); */ continue; /* global */ case 'g': tail("global"); global(!exclam()); nochng(); continue; /* insert */ case 'i': if (inopen) goto notinvis; tail("insert"); setdot(); nonzero(); aiflag = exclam(); ex_newline(); vmacchng(0); deletenone(); setin(addr2); inappend = 1; ignore(append(gettty, addr2 - 1)); inappend = 0; if (dot == zero && dol > zero) dot = one; nochng(); continue; /* join */ case 'j': tail("join"); c = exclam(); setcount(); nonzero(); ex_newline(); vmacchng(0); if (given < 2 && addr2 != dol) addr2++; join(c); continue; /* k */ case 'k': casek: pastwh(); c = ex_getchar(); if (endcmd(c)) serror("Mark what?|%s requires following letter", Command); ex_newline(); if (!islower(c)) error("Bad mark|Mark must specify a letter"); setdot(); nonzero(); names[c - 'a'] = *addr2 &~ 01; anymarks = 1; continue; /* list */ case 'l': tail("list"); setCNL(); ignorf(setlist(1)); pflag = 0; goto print; case 'm': if (peekchar() == 'a') { ignchar(); if (peekchar() == 'p') { /* map */ tail2of("map"); setnoaddr(); mapcmd(0, 0); continue; } /* mark */ tail2of("mark"); goto casek; } /* move */ tail("move"); vmacchng(0); move(); continue; case 'n': if (peekchar() == 'u') { tail("number"); goto numberit; } /* next */ tail("next"); setnoaddr(); ckaw(); ignore(quickly()); if (getargs()) makargs(); next(); c = 'e'; filename(c); goto doecmd; /* open */ case 'o': tail("open"); oop(); pflag = 0; nochng(); continue; case 'p': case 'P': switch (peekchar()) { /* put */ case 'u': tail("put"); setdot(); c = cmdreg(); eol(); vmacchng(0); if (c) putreg(c); else put(); continue; case 'r': ignchar(); if (peekchar() == 'e') { /* preserve */ tail2of("preserve"); eol(); if (preserve() == 0) error("Preserve failed!"); else error("File preserved."); } tail2of("print"); break; default: tail("print"); break; } /* print */ setCNL(); pflag = 0; print: nonzero(); if (CL && span() > EX_LINES) { flush1(); vclear(); } plines(addr1, addr2, 1); continue; /* quit */ case 'q': tail("quit"); setnoaddr(); c = quickly(); eol(); if (!c) quit: nomore(); if (inopen) { vgoto(WECHO, 0); if (!ateopr()) vnfl(); else { tostop(); } flush(); setty(normf); } cleanup(1); ex_exit(0); case 'r': if (peekchar() == 'e') { ignchar(); switch (peekchar()) { /* rewind */ case 'w': tail2of("rewind"); setnoaddr(); if (!exclam()) { ckaw(); if (chng && dol > zero) error("No write@since last chage (:rewind! overrides)"); } eol(); erewind(); next(); c = 'e'; ungetchar(lastchar()); filename(c); goto doecmd; /* recover */ case 'c': tail2of("recover"); setnoaddr(); c = 'e'; if (!exclam() && chng) c = 'E'; filename(c); if (c == 'E') { ungetchar(lastchar()); ignore(quickly()); } init(); addr2 = zero; laste++; ex_sync(); recover(); rop2(); revocer(); if (status == 0) rop3(c); if (dol != zero) change(); nochng(); continue; } tail2of("read"); } else tail("read"); /* read */ if (savedfile[0] == 0 && dol == zero) c = 'e'; pastwh(); vmacchng(0); if (peekchar() == '!') { setdot(); ignchar(); unix0(0); filter(0); continue; } filename(c); rop(c); nochng(); if (inopen && endline && addr1 > zero && addr1 < dol) dot = addr1 + 1; continue; case 's': switch (peekchar()) { /* * Caution: 2nd char cannot be c, g, or r * because these have meaning to substitute. */ /* set */ case 'e': tail("set"); setnoaddr(); set(); continue; /* shell */ case 'h': tail("shell"); setNAEOL(); vnfl(); putpad(TE); flush(); unixwt(1, unixex("-i", (char *) 0, 0, 0)); vcontin(0); continue; /* source */ case 'o': #ifdef notdef if (inopen) goto notinvis; #endif tail("source"); setnoaddr(); getone(); eol(); source(file, 0); continue; #ifdef SIGTSTP /* stop, suspend */ case 't': tail("stop"); goto suspend; case 'u': tail("suspend"); suspend: if (!dosusp) error("Old tty driver|Not using new tty driver/shell"); c = exclam(); eol(); if (!c) ckaw(); onsusp(0); continue; #endif } /* fall into ... */ /* & */ /* ~ */ /* substitute */ case '&': case '~': Command = "substitute"; if (c == 's') tail(Command); vmacchng(0); if (!substitute(c)) pflag = 0; continue; /* t */ case 't': if (peekchar() == 'a') { tail("tag"); tagfind(exclam()); if (!inopen) lchng = chng - 1; else nochng(); continue; } tail("t"); vmacchng(0); move(); continue; case 'u': if (peekchar() == 'n') { ignchar(); switch(peekchar()) { /* unmap */ case 'm': tail2of("unmap"); setnoaddr(); mapcmd(1, 0); continue; /* unabbreviate */ case 'a': tail2of("unabbreviate"); setnoaddr(); mapcmd(1, 1); anyabbrs = 1; continue; } /* undo */ tail2of("undo"); } else tail("undo"); setnoaddr(); markDOT(); c = exclam(); ex_newline(); undo(c); continue; case 'v': switch (peekchar()) { case 'e': /* version */ tail("version"); setNAEOL(); ex_printf("@(#) Version 3.6, 11/3/80" " (4.0BSD). git " "160803 14:24" +5); noonl(); continue; /* visual */ case 'i': tail("visual"); if (inopen) { c = 'e'; goto editcmd; } vop(); pflag = 0; nochng(); continue; } /* v */ tail("v"); global(0); nochng(); continue; /* write */ case 'w': c = peekchar(); tail(c == 'q' ? "wq" : "write"); wq: if (skipwh() && peekchar() == '!') { pofix(); ignchar(); setall(); unix0(0); filter(1); } else { setall(); wop(1); nochng(); } if (c == 'q') goto quit; continue; /* xit */ case 'x': tail("xit"); if (!chng) goto quit; c = 'q'; goto wq; /* yank */ case 'y': tail("yank"); c = cmdreg(); setcount(); eol(); vmacchng(0); if (c) YANKreg(c); else yank(); continue; /* z */ case 'z': zop(0); pflag = 0; continue; /* * */ /* @ */ case '*': case '@': c = ex_getchar(); if (c=='\n' || c=='\r') ungetchar(c); if (any(c, "@*\n\r")) c = lastmac; if (isupper(c)) c = tolower(c); if (!islower(c)) error("Bad register"); ex_newline(); setdot(); cmdmac(c); continue; /* | */ case '|': endline = 0; goto caseline; /* \n */ case '\n': endline = 1; caseline: notempty(); if (addr2 == 0) { if (UP != NOSTR && c == '\n' && !inglobal) c = CTRL('k'); if (inglobal) addr1 = addr2 = dot; else { if (dot == dol) error("At EOF|At end-of-file"); addr1 = addr2 = dot + 1; } } setdot(); nonzero(); if (seensemi) addr1 = addr2; ex_getline(*addr1); if (c == CTRL('k')) { flush1(); destline--; if (hadpr) shudclob = 1; } plines(addr1, addr2, 1); continue; /* " */ case '"': comment(); continue; /* # */ case '#': numberit: setCNL(); ignorf(setnumb(1)); pflag = 0; goto print; /* = */ case '=': ex_newline(); setall(); if (inglobal == 2) pofix(); ex_printf("%d", lineno(addr2)); noonl(); continue; /* ! */ case '!': if (addr2 != 0) { vmacchng(0); unix0(0); setdot(); filter(2); } else { unix0(1); pofix(); putpad(TE); flush(); unixwt(1, unixex("-c", uxb, 0, 0)); vclrech(1); /* vcontin(0); */ nochng(); } continue; /* < */ /* > */ case '<': case '>': for (cnt = 1; peekchar() == c; cnt++) ignchar(); setCNL(); vmacchng(0); shift(c, cnt); continue; /* ^D */ /* EOF */ case CTRL('d'): case EOF: if (exitoneof) { if (addr2 != 0) dot = addr2; return; } if (!isatty(0)) { if (intty) /* * Chtty sys call at UCB may cause a * input which was a tty to suddenly be * turned into /dev/null. */ onhup(0); return; } if (addr2 != 0) { setlastchar('\n'); putnl(); } if (dol == zero) { if (addr2 == 0) putnl(); notempty(); } ungetchar(EOF); zop(hadpr); continue; default: if (!isalpha(c)) break; ungetchar(c); tailprim("", 0, 0); } ierror("What?|Unknown command character '%c'", c); } }
int fatfindfile(char *fname) { int rc, i, j; putstr("--MBR--\n"); rc = readblock(DOSBBSECTOR, buf); if (dos_partition(0)->dp_typ != 6) { putstr("bad partition type\n"); return -1; }; start = getulong(dos_partition(0)->dp_start); dump_long("start ", start); putstr("--BOOT--\n"); rc = readblock(start, buf); if (getushort(bootsector->bpbBytesPerSec) != 512) { putstr("bad sector size\n"); return -1; }; cluster_size = bootsector->bpbSecPerClust; dump_long("cluster_size ", cluster_size); start_fat = start + getushort(bootsector->bpbResSectors); dump_long("start_fat ", start_fat); root_size = getushort(bootsector->bpbRootDirEnts); root_size = (root_size * 32+511)/512; dump_long("root_size ", root_size); dump_long("FATsecs ", getushort(bootsector->bpbFATsecs)); dump_long("FATs ", bootsector->bpbFATs); start_root = start_fat + bootsector->bpbFATs * getushort(bootsector->bpbFATsecs); start = start_root + root_size - 2 * cluster_size; /* first data sector for 0-based clusters */ dump_long("start_root ", start_root); current_cluster = 0; putstr("--ROOT--\n"); for(j = 0; j<root_size; j++) { rc = readblock(start_root + j, buf); for(i = 0; i<16; i++) { rc = (direntry(i)->deName)[0]; if (rc == SLOT_EMPTY || rc == SLOT_DELETED) continue; rc = direntry(i)->deAttributes & (ATTR_VOLUME|ATTR_DIRECTORY); if (rc) continue; current_cluster = getushort(direntry(i)->deStartCluster); bytes_left = getulong(direntry(i)->deFileSize); putstr(direntry(i)->deName); putnl(); /* printf("%12s %02x %ld %ld\n", direntry(i)->deName, direntry(i)->deAttributes & 0x18, current_cluster, bytes_left ); */ if (!strncmp(direntry(i)->deName, fname, 11)) { break; }; current_cluster = 0; }; if (current_cluster) break; }; if (!current_cluster) { putstr("file not found\n"); return -1; }; current_sector = 0; putstr("File ok\n"); return 0; }
/* * Do a z operation. * Code here is rather long, and very uninteresting. */ void vzop(int hadcnt, int cnt, register int c) { register line *addr; if (state != VISUAL) { /* * Z from open; always like a z=. * This code is a mess and should be cleaned up. */ vmoveitup(1, 1); vgoto(outline, 0); ostop(normf); setoutt(); addr2 = dot; vclear(); destline = WECHO; zop2(Xhadcnt ? Xcnt : value(WINDOW) - 1, '='); if (state == CRTOPEN) putnl(); putNFL(); termreset(); Outchar = vputchar; ignore(ostart()); vcnt = 0; outline = destline = 0; vjumpto(dot, cursor, 0); return; } if (hadcnt) { addr = zero + cnt; if (addr < one) addr = one; if (addr > dol) addr = dol; markit(addr); } else switch (c) { case '+': addr = dot + vcnt - vcline; break; case '^': addr = dot - vcline - 1; forbid (addr < one); c = '-'; break; default: addr = dot; break; } switch (c) { case '.': case '-': break; case '^': forbid (addr <= one); break; case '+': forbid (addr >= dol); /* fall into ... */ case CR: case NL: c = CR; break; default: beep(); return; } vmoving = 0; vjumpto(addr, NOSTR, c); }
extern void articulate(void) { node *stn, *stnStart; int i; long cFixed; component_list = NULL; articulation_list = NULL; artlist = NULL; fixedlist = NULL; /* find articulation points and components */ colour = 0; stnStart = NULL; cMaxVisits = 0; FOR_EACH_STN(stn, stnlist) { if (fixed(stn)) { remove_stn_from_list(&stnlist, stn); add_stn_to_list(&fixedlist, stn); colour++; stn->colour = -colour; #ifdef DEBUG_ARTIC printf("Putting stn "); print_prefix(stn->name); printf(" on fixedlist\n"); #endif } else { cMaxVisits++; stn->colour = 0; } } dirn_stack = osmalloc(cMaxVisits); min_stack = osmalloc(cMaxVisits * sizeof(long)); /* fixedlist can be NULL here if we've had a *solve followed by survey * which is all hanging. */ cFixed = colour; while (fixedlist) { int c; stnStart = fixedlist; stn = stnStart; /* see if this is a fresh component - it may not be, we may be * processing the other way from a fixed point cut-line */ if (stn->colour < 0) { #ifdef DEBUG_ARTIC printf("new component\n"); #endif stn->colour = -stn->colour; /* fixed points are negative until we colour from them */ cComponents++; /* FIXME: logic to count components isn't the same as the logic * to start a new one - we should start a new one for a fixed point * cut-line (see below) */ if (artlist) { component *comp; articulation *art; art = osnew(articulation); art->stnlist = artlist; art->next = articulation_list; articulation_list = art; artlist = NULL; comp = osnew(component); comp->next = component_list; comp->artic = articulation_list; component_list = comp; articulation_list = NULL; } #ifdef DEBUG_ARTIC print_prefix(stn->name); printf(" [%p] is root of component %ld\n", stn, cComponents); printf(" and colour = %d/%d\n", stn->colour, cFixed); #endif } c = 0; for (i = 0; i <= 2 && stn->leg[i]; i++) { node *stn2 = stn->leg[i]->l.to; if (stn2->colour < 0) { stn2->colour = -stn2->colour; } else if (stn2->colour == 0) { /* Special case to check if start station is an articulation point * which it is iff we have to colour from it in more than one dirn * * We're looking for articulation legs - these are those where * colouring from here doesn't reach a fixed point (including * stn - the fixed point we've started from) * * FIXME: this is a "fixed point cut-line" case where we could * start a new component. */ long col = visit(stn2, reverse_leg_dirn(stn->leg[i])); #ifdef DEBUG_ARTIC print_prefix(stn->name); printf(" -> "); print_prefix(stn2->name); printf(" col %d cFixed %d\n", col, cFixed); #endif if (col > cFixed) { /* start new articulation - FIXME - overeager */ articulation *art = osnew(articulation); art->stnlist = artlist; art->next = articulation_list; articulation_list = art; artlist = NULL; c |= 1 << i; } } } switch (c) { /* had to colour in 2 or 3 directions from start point */ case 3: case 5: case 6: case 7: #ifdef DEBUG_ARTIC print_prefix(stn->name); printf(" is a special case start articulation point [%d]\n", c); #endif for (i = 0; i <= 2 && stn->leg[i]; i++) { if (TSTBIT(c, i)) { /* flag leg as an articulation for loop error reporting */ stn->leg[i]->l.reverse |= FLAG_ARTICULATION; #ifdef DEBUG_ARTIC print_prefix(stn->leg[i]->l.to->name); putnl(); #endif reverse_leg(stn->leg[i])->l.reverse |= FLAG_ARTICULATION; } } } #ifdef DEBUG_ARTIC printf("Putting FIXED stn "); print_prefix(stn->name); printf(" on artlist\n"); #endif remove_stn_from_list(&fixedlist, stn); add_stn_to_list(&artlist, stn); if (stnStart->colour == 1) { #ifdef DEBUG_ARTIC printf("%ld components\n",cComponents); #endif break; } } osfree(dirn_stack); dirn_stack = NULL; osfree(min_stack); min_stack = NULL; if (artlist) { articulation *art = osnew(articulation); art->stnlist = artlist; art->next = articulation_list; articulation_list = art; artlist = NULL; } if (articulation_list) { component *comp = osnew(component); comp->next = component_list; comp->artic = articulation_list; component_list = comp; articulation_list = NULL; } if (stnlist) { /* Any stations still in stnlist are unfixed, which is means we have * one or more hanging surveys. * * The cause of the problem is pretty likely to be a typo, so run the * checks which report errors and warnings about issues which such a * typo is likely to result in. */ check_node_stats(); /* Actually this error is fatal, but we want to list the survey * stations which aren't connected, so we report it as an error * and die after listing them... */ bool fNotAttached = fFalse; error(/*Survey not all connected to fixed stations*/45); FOR_EACH_STN(stn, stnlist) { /* Anonymous stations must be at the end of a trailing traverse (since * the same anonymous station can't be referred to more than once), * and trailing traverses have been removed at this point. */ SVX_ASSERT(!TSTBIT(stn->name->sflags, SFLAGS_ANON)); if (stn->name->ident) { if (!fNotAttached) { fNotAttached = fTrue; puts(msg(/*The following survey stations are not attached to a fixed point:*/71)); } puts(sprint_prefix(stn->name)); } } exit(EXIT_FAILURE); }
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? */ } }