static int mass_add_d(const struct mass_add_clo_s *clo) { /* read lines from stdin * interpret as durations * add to reference date * output */ size_t lno = 0; struct dt_dt_s d; struct __strpdtdur_st_s st = __strpdtdur_st_initialiser(); int rc = 0; for (char *line; prchunk_haslinep(clo->pctx); lno++) { size_t llen; int has_dur_p = 1; llen = prchunk_getline(clo->pctx, &line); /* check for durations on this line */ do { if (dt_io_strpdtdur(&st, line) < 0) { has_dur_p = 0; } } while (__strpdtdur_more_p(&st)); /* finish with newline again */ line[llen] = '\n'; if (has_dur_p) { if (UNLIKELY(clo->rd.fix) && !clo->quietp) { rc = 2; } /* perform addition now */ d = dadd_add(clo->rd, st.durs, st.ndurs); if (clo->hackz == NULL && clo->fromz != NULL) { /* fixup zone */ d = dtz_forgetz(d, clo->fromz); } /* no sed mode here */ dt_io_write(d, clo->ofmt, clo->z, '\n'); } else if (clo->sed_mode_p) { __io_write(line, llen + 1, stdout); } else if (!clo->quietp) { line[llen] = '\0'; dt_io_warn_strpdt(line); rc = 2; } /* just reset the ndurs slot */ st.ndurs = 0; } /* free associated duration resources */ __strpdtdur_free(&st); return rc; }
static bool read_line(mux_ctx_t ctx, ff_msg_t msg) { static const char cmd_pmsg[] = "PRIVMSG"; static const size_t cmd_pmsg_sz = sizeof(cmd_pmsg) - 1; char *line; size_t llen; const char *cursor; char *p; llen = prchunk_getline(ctx->rdr, &line); /* we parse the line in 3 steps, receive time stamp, symbol, values */ cursor = line; msg->chan = NULL; msg->json = NULL; msg->msglen = 0UL; /* receive time stamp, always first on line */ if (UNLIKELY(parse_rcv_stmp(msg, &cursor) < 0)) { goto bugger; } /* parse the rest */ llen -= cursor - line; /* message types */ if ((p = xmemmem(cursor, llen, cmd_pmsg, cmd_pmsg_sz))) { msg->ty = FF_MSG_JSON; msg->chan = p + cmd_pmsg_sz + 1; if ((p = strchr(msg->chan, ' '))) { *p++ = '\0'; if (*p++ == ':') { /* ah a normal channel message */ llen -= p - cursor; msg->json = p; msg->msglen = llen; p[llen] = '\0'; return true; } } } return false; bugger: /* declare the line f****d */ fputs("line b0rked\n> ", stderr); fputs(line, stderr); fputc('\n', stderr); return false; }
static void mass_add_dur(const struct mass_add_clo_s *clo) { /* read lines from stdin * interpret as dates * add to reference duration * output */ size_t lno = 0; for (char *line; prchunk_haslinep(clo->pctx); lno++) { size_t llen = prchunk_getline(clo->pctx, &line); proc_line(clo, line, llen); } 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[]) { 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; }