int main (int argc, char **argv) { int i; mu_stream_t in, out; mu_stream_t cvt; const char *args[5] = { "iconv" }; if (argc < 3 || argc > 4) { fprintf (stderr, "usage: %s from-code to-code [err]\n", argv[0]); return 1; } MU_ASSERT (mu_stdio_stream_create (&in, MU_STDIN_FD, 0)); args[1] = argv[1]; args[2] = argv[2]; i = 3; if (argc == 4) args[i++] = argv[3]; args[i] = NULL; MU_ASSERT (mu_filter_create_args (&cvt, in, args[0], i, args, MU_FILTER_DECODE, MU_FILTER_READ)); mu_stream_unref (in); MU_ASSERT (mu_stdio_stream_create (&out, MU_STDOUT_FD, 0)); MU_ASSERT (mu_stream_copy (out, cvt, 0, NULL)); mu_stream_unref (cvt); mu_stream_flush (out); return 0; }
static int _mh_prop_read_stream (mu_header_t *phdr, mu_stream_t stream) { int rc; mu_stream_t flt; const char *argv[4]; mu_off_t size; size_t total; char *blurb; rc = mu_stream_size (stream, &size); if (rc) return rc; argv[0] = "INLINE-COMMENT"; argv[1] = "#"; argv[2] = "-r"; argv[3] = NULL; rc = mu_filter_create_args (&flt, stream, argv[0], 3, argv, MU_FILTER_DECODE, MU_STREAM_READ); if (rc) { mu_error (_("cannot open filter stream: %s"), mu_strerror (rc)); return rc; } blurb = malloc (size + 1); if (!blurb) { mu_stream_destroy (&flt); return ENOMEM; } total = 0; while (1) { size_t n; rc = mu_stream_read (flt, blurb + total, size - total, &n); if (rc) break; if (n == 0) break; total += n; } mu_stream_destroy (&flt); if (rc) { free (blurb); return rc; } rc = mu_header_create (phdr, blurb, total); free (blurb); return rc; }
static int set_strerr_flt () { mu_stream_t flt, trans[2]; int rc; rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_TOPSTREAM, MU_IOCTL_OP_GET, trans); if (rc == 0) { char sessidstr[10]; char *argv[] = { "inline-comment", NULL, "-S", NULL }; snprintf (sessidstr, sizeof sessidstr, "%08lx:", mu_session_id); argv[1] = sessidstr; rc = mu_filter_create_args (&flt, trans[0], "inline-comment", 3, (const char **)argv, MU_FILTER_ENCODE, MU_STREAM_WRITE); mu_stream_unref (trans[0]); if (rc == 0) { mu_stream_set_buffer (flt, mu_buffer_line, 0); trans[0] = flt; trans[1] = NULL; rc = mu_stream_ioctl (mu_strerr, MU_IOCTL_TOPSTREAM, MU_IOCTL_OP_SET, trans); mu_stream_unref (trans[0]); if (rc) mu_error (_("%s failed: %s"), "MU_IOCTL_SET_STREAM", mu_stream_strerror (mu_strerr, rc)); } else mu_error (_("cannot create log filter stream: %s"), mu_strerror (rc)); } else { mu_error (_("%s failed: %s"), "MU_IOCTL_GET_STREAM", mu_stream_strerror (mu_strerr, rc)); } return rc; }
int mutool_filter (int argc, char **argv) { int rc, index; mu_stream_t flt, prev_stream; const char *fltname; int mode; if (argp_parse (&filter_argp, argc, argv, ARGP_IN_ORDER, &index, NULL)) return 1; argc -= index; argv += index; if (list_option) { if (argc) { mu_error (_("excess arguments")); return 1; } return list_filters (); } if (argc == 0) { mu_error (_("what filter do you want?")); return 1; } prev_stream = mu_strin; mu_stream_ref (mu_strin); do { int i; fltname = argv[0]; if (fltname[0] == '~') { mode = negate_filter_mode (filter_mode); fltname++; } else mode = filter_mode; for (i = 1; i < argc; i++) if (strcmp (argv[i], "+") == 0) break; rc = mu_filter_create_args (&flt, prev_stream, fltname, i, (const char **)argv, mode, MU_STREAM_READ); mu_stream_unref (prev_stream); if (rc) { mu_error (_("cannot open filter stream: %s"), mu_strerror (rc)); return 1; } prev_stream = flt; argc -= i; argv += i; if (argc) { argc--; argv++; } } while (argc); rc = mu_stream_copy (mu_strout, flt, 0, NULL); if (rc) { mu_error ("%s", mu_strerror (rc)); return 1; } if (newline_option) mu_stream_write (mu_strout, "\n", 1, NULL); mu_stream_destroy (&flt); mu_stream_flush (mu_strout); return 0; }
int main (int argc, char * argv []) { mu_stream_t in, out, flt; int i; int mode = MU_FILTER_ENCODE; int flags = MU_STREAM_READ; char *fltname; mu_off_t shift = 0; int newline_option = 0; size_t bufsize = 0; if (argc == 1) usage (NULL); if (argc < 4) usage ("not enough arguments"); fltname = argv[1]; if (strcmp (argv[2], "encode") == 0) mode = MU_FILTER_ENCODE; else if (strcmp (argv[2], "decode") == 0) mode = MU_FILTER_DECODE; else usage ("2nd arg is wrong"); if (strcmp (argv[3], "read") == 0) flags = MU_STREAM_READ; else if (strcmp (argv[3], "write") == 0) flags = MU_STREAM_WRITE; else usage ("3rd arg is wrong"); for (i = 4; i < argc; i++) { if (strncmp (argv[i], "shift=", 6) == 0) shift = strtoul (argv[i] + 6, NULL, 0); else if (strncmp (argv[i], "bufsize=", 8) == 0) bufsize = strtoul (argv[i] + 8, NULL, 0); else if (strcmp (argv[i], "verbose") == 0) verbose++; else if (strcmp (argv[i], "printable") == 0) printable++; else if (strcmp (argv[i], "nl") == 0) newline_option++; else if (strcmp (argv[i], "--") == 0) { argv[i] = fltname; break; } else usage ("wrong option"); } argc -= i; argv += i; MU_ASSERT (mu_stdio_stream_create (&in, MU_STDIN_FD, 0)); if (bufsize) mu_stream_set_buffer (in, mu_buffer_full, bufsize); MU_ASSERT (mu_stdio_stream_create (&out, MU_STDOUT_FD, 0)); if (flags == MU_STREAM_READ) { MU_ASSERT (mu_filter_create_args (&flt, in, fltname, argc, (const char **)argv, mode, MU_STREAM_READ|MU_STREAM_SEEK)); mu_stream_unref (in); if (bufsize) mu_stream_set_buffer (flt, mu_buffer_full, bufsize); if (shift) MU_ASSERT (mu_stream_seek (flt, shift, MU_SEEK_SET, NULL)); c_copy (out, flt); } else { MU_ASSERT (mu_filter_create_args (&flt, out, fltname, argc, (const char **)argv, mode, MU_STREAM_WRITE)); if (bufsize) mu_stream_set_buffer (flt, mu_buffer_full, bufsize); if (shift) MU_ASSERT (mu_stream_seek (in, shift, MU_SEEK_SET, NULL)); c_copy (flt, in); mu_stream_close (in); mu_stream_destroy (&in); } mu_stream_close (flt); mu_stream_destroy (&flt); if (newline_option) mu_stream_write (out, "\n", 1, NULL); mu_stream_close (out); mu_stream_destroy (&out); if (verbose) { fprintf (stderr, "\nInput stream stats:\n"); fprintf (stderr, "Bytes in: %lu\n", (unsigned long) instat[MU_STREAM_STAT_IN]); fprintf (stderr, "Bytes out: %lu\n", (unsigned long) instat[MU_STREAM_STAT_OUT]); fprintf (stderr, "Reads: %lu\n", (unsigned long) instat[MU_STREAM_STAT_READS]); fprintf (stderr, "Seeks: %lu\n", (unsigned long) instat[MU_STREAM_STAT_SEEKS]); fprintf (stderr, "\nOutput stream stats:\n"); fprintf (stderr, "Bytes in: %lu\n", (unsigned long) outstat[MU_STREAM_STAT_IN]); fprintf (stderr, "Bytes out: %lu\n", (unsigned long) outstat[MU_STREAM_STAT_OUT]); fprintf (stderr, "Writes: %lu\n", (unsigned long) outstat[MU_STREAM_STAT_WRITES]); fprintf (stderr, "Seeks: %lu\n", (unsigned long) outstat[MU_STREAM_STAT_SEEKS]); } return 0; }