void mux(mux_ctx_t ctx) { /* init reader, we use prchunk here */ ctx->rdr = init_prchunk(ctx->infd); /* main loop */ while (fetch_lines(ctx)) { read_lines(ctx); } /* free prchunk resources */ free_prchunk(ctx->rdr); return; }
static void proc_lines(const char *const *fmt, size_t nfmt, const char *ofmt, int quietp) { size_t lno = 0; void *pctx; /* using the prchunk reader now */ if ((pctx = init_prchunk(STDIN_FILENO)) == NULL) { serror("Error: could not open stdin"); return; } while (prchunk_fill(pctx) >= 0) { for (char *line; prchunk_haslinep(pctx); lno++) { (void)prchunk_getline(pctx, &line); /* check if line matches */ proc_line(line, fmt, nfmt, ofmt, quietp); } } /* get rid of resources */ free_prchunk(pctx); return; }
int main(int argc, char *argv[]) { yuck_t argi[1U]; struct dt_dt_s d; struct __strpdtdur_st_s st = __strpdtdur_st_initialiser(); const char *ofmt; char **fmt; size_t nfmt; int rc = 0; bool dt_given_p = false; zif_t fromz = NULL; zif_t z = NULL; zif_t hackz = NULL; if (yuck_parse(argi, argc, argv)) { rc = 1; goto out; } else if (argi->nargs == 0) { error("Error: DATE or DURATION must be specified\n"); yuck_auto_help(argi); rc = 1; goto out; } /* init and unescape sequences, maybe */ ofmt = argi->format_arg; fmt = argi->input_format_args; nfmt = argi->input_format_nargs; if (argi->backslash_escapes_flag) { dt_io_unescape(argi->format_arg); for (size_t i = 0; i < nfmt; i++) { dt_io_unescape(fmt[i]); } } /* try and read the from and to time zones */ if (argi->from_zone_arg) { fromz = dt_io_zone(argi->from_zone_arg); } if (argi->zone_arg) { z = dt_io_zone(argi->zone_arg); } if (argi->base_arg) { struct dt_dt_s base = dt_strpdt(argi->base_arg, NULL, NULL); dt_set_base(base); } /* sanity checks, decide whether we're a mass date adder * or a mass duration adder, or both, a date and durations are * present on the command line */ with (const char *inp = argi->args[0U]) { /* date parsing needed postponing as we need to find out * about the durations */ if (!dt_unk_p(dt_io_strpdt(inp, fmt, nfmt, NULL))) { dt_given_p = true; } } /* check first arg, if it's a date the rest of the arguments are * durations, if not, dates must be read from stdin */ for (size_t i = dt_given_p; i < argi->nargs; i++) { const char *inp = argi->args[i]; do { if (dt_io_strpdtdur(&st, inp) < 0) { serror("Error: \ cannot parse duration string `%s'", st.istr); rc = 1; goto dur_out; } } while (__strpdtdur_more_p(&st)); } /* check if there's only d durations */ hackz = durs_only_d_p(st.durs, st.ndurs) ? NULL : fromz; /* read the first argument again in light of a completely parsed * duration sequence */ if (dt_given_p) { const char *inp = argi->args[0U]; if (dt_unk_p(d = dt_io_strpdt(inp, fmt, nfmt, hackz))) { error("\ Error: cannot interpret date/time string `%s'", inp); rc = 1; goto dur_out; } } /* start the actual work */ if (dt_given_p && st.ndurs) { if (!dt_unk_p(d = dadd_add(d, st.durs, st.ndurs))) { if (UNLIKELY(d.fix) && !argi->quiet_flag) { rc = 2; } if (hackz == NULL && fromz != NULL) { /* fixup zone */ d = dtz_forgetz(d, fromz); } dt_io_write(d, ofmt, z, '\n'); } else { rc = 1; } } else if (st.ndurs) { /* read dates from stdin */ struct grep_atom_s __nstk[16], *needle = __nstk; size_t nneedle = countof(__nstk); struct grep_atom_soa_s ndlsoa; struct mass_add_clo_s clo[1]; void *pctx; /* no threads reading this stream */ __io_setlocking_bycaller(stdout); /* lest we overflow the stack */ if (nfmt >= nneedle) { /* round to the nearest 8-multiple */ nneedle = (nfmt | 7) + 1; needle = calloc(nneedle, sizeof(*needle)); } /* and now build the needle */ ndlsoa = build_needle(needle, nneedle, fmt, nfmt); /* using the prchunk reader now */ if ((pctx = init_prchunk(STDIN_FILENO)) == NULL) { serror("could not open stdin"); goto ndl_free; } /* build the clo and then loop */ clo->pctx = pctx; clo->gra = &ndlsoa; clo->st = st; clo->fromz = fromz; clo->hackz = hackz; clo->z = z; clo->ofmt = ofmt; clo->sed_mode_p = argi->sed_mode_flag; clo->quietp = argi->quiet_flag; while (prchunk_fill(pctx) >= 0) { rc |= mass_add_dur(clo); } /* get rid of resources */ free_prchunk(pctx); ndl_free: if (needle != __nstk) { free(needle); } } else { /* mass-adding durations to reference date */ struct mass_add_clo_s clo[1]; void *pctx; /* no threads reading this stream */ __io_setlocking_bycaller(stdout); /* using the prchunk reader now */ if ((pctx = init_prchunk(STDIN_FILENO)) == NULL) { serror("could not open stdin"); goto dur_out; } /* build the clo and then loop */ clo->pctx = pctx; clo->rd = d; clo->fromz = fromz; clo->hackz = hackz; clo->z = z; clo->ofmt = ofmt; clo->sed_mode_p = argi->sed_mode_flag; clo->quietp = argi->quiet_flag; while (prchunk_fill(pctx) >= 0) { rc |= mass_add_d(clo); } /* get rid of resources */ free_prchunk(pctx); } dur_out: /* free the strpdur status */ __strpdtdur_free(&st); dt_io_clear_zones(); out: yuck_free(argi); return rc; }
int main(int argc, char *argv[]) { struct gengetopt_args_info argi[1]; const char *ofmt; char **fmt; size_t nfmt; int res = 0; zif_t fromz = NULL; zif_t z = NULL; if (cmdline_parser(argc, argv, argi)) { res = 1; goto out; } /* init and unescape sequences, maybe */ ofmt = argi->format_arg; fmt = argi->input_format_arg; nfmt = argi->input_format_given; if (argi->backslash_escapes_given) { dt_io_unescape(argi->format_arg); for (size_t i = 0; i < nfmt; i++) { dt_io_unescape(fmt[i]); } } /* try and read the from and to time zones */ if (argi->from_zone_given) { fromz = zif_open(argi->from_zone_arg); } if (argi->zone_given) { z = zif_open(argi->zone_arg); } if (argi->default_given) { struct dt_dt_s dflt = dt_strpdt(argi->default_arg, NULL, NULL); dt_set_default(dflt); } if (argi->inputs_num) { for (size_t i = 0; i < argi->inputs_num; i++) { const char *inp = argi->inputs[i]; struct dt_dt_s d = dt_io_strpdt(inp, fmt, nfmt, fromz); if (!dt_unk_p(d)) { dt_io_write(d, ofmt, z, '\n'); } else if (!argi->quiet_given) { dt_io_warn_strpdt(inp); } } } else { /* read from stdin */ size_t lno = 0; struct grep_atom_s __nstk[16], *needle = __nstk; size_t nneedle = countof(__nstk); struct grep_atom_soa_s ndlsoa; void *pctx; struct prln_ctx_s prln = { .ndl = &ndlsoa, .ofmt = ofmt, .fromz = fromz, .outz = z, .sed_mode_p = argi->sed_mode_given, .quietp = argi->quiet_given, }; /* no threads reading this stream */ __io_setlocking_bycaller(stdout); /* lest we overflow the stack */ if (nfmt >= nneedle) { /* round to the nearest 8-multiple */ nneedle = (nfmt | 7) + 1; needle = calloc(nneedle, sizeof(*needle)); } /* and now build the needles */ ndlsoa = build_needle(needle, nneedle, fmt, nfmt); /* using the prchunk reader now */ if ((pctx = init_prchunk(STDIN_FILENO)) == NULL) { error(errno, "Error: could not open stdin"); goto ndl_free; } while (prchunk_fill(pctx) >= 0) { for (char *line; prchunk_haslinep(pctx); lno++) { size_t llen = prchunk_getline(pctx, &line); proc_line(prln, line, llen); } } /* get rid of resources */ free_prchunk(pctx); ndl_free: if (needle != __nstk) { free(needle); } } if (argi->from_zone_given) { zif_close(fromz); } if (argi->zone_given) { zif_close(z); } out: cmdline_parser_free(argi); return res; }