Codebase list libmawk / a8c8f483-bda4-4dcb-b181-d7b9964ade2c/main src / example_apps / 31_out_pipes_manual / app.c
a8c8f483-bda4-4dcb-b181-d7b9964ade2c/main

Tree @a8c8f483-bda4-4dcb-b181-d7b9964ade2c/main (Download .tar.gz)

app.c @a8c8f483-bda4-4dcb-b181-d7b9964ade2c/mainraw · history · blame

#include <stdio.h>
#include <libmawk.h>

/*
	Purpose: wire stdout to a pipe and process the output of the script and
	         hijack output file "log". Manual setup.
	Run: ./app -f test.awk
*/

void print_pipe_pending(mawk_state_t *m, mawk_vio_t *vf, char *sep)
{
	for(;;) {
		int len;
		char buf[1024];
		len = mawk_vio_fifo_read_app(m, vf, buf, sizeof(buf)-1);
		if (len <= 0)
			return;
		buf[len] = '\0';
		printf("<%s>\n%s</%s>\n", sep, buf, sep);
	}
}

int main(int argc, char **argv)
{
	mawk_state_t *m;
	mawk_vio_t *vf_stdin, *vf_stdout, *vf_log;

	/* init a context in stages */
	m = libmawk_initialize_stage1();              /* alloc context */

	/* set up all pipes */
	mawk_vio_orig_setup_stdio(m, 0, 0, 1); /* whether bind to the app's stdio: 0,0,1=stdin,stdout,stderr; let stderr bind */
	vf_stdin  = mawk_vio_fifo_open(m, NULL, MAWK_VIO_I);        /* create a pipe for stdin */
	vf_stdout = mawk_vio_fifo_open(m, NULL, MAWK_VIO_O_APPEND); /* create a pipe for stdout */
	vf_log    = mawk_vio_fifo_open(m, NULL, MAWK_VIO_O_APPEND); /* create a pipe for logging */
	mawk_file_register(m, "/dev/stdin",  F_IN,  vf_stdin);      /* register /dev/stdin */
	mawk_file_register(m, "/dev/stdout", F_APPEND, vf_stdout);  /* register /dev/stdout */
	mawk_file_register(m, "log",         F_APPEND, vf_log);     /* register a regular open file named "log" */
	m->vio_init = mawk_vio_orig_init; /* file operation is handled by the orig vio */

	m = libmawk_initialize_stage2(m, argc, argv); /* set up with CLI arguments */
	m = libmawk_initialize_stage3(m);             /* execute BEGIN */

	if (m == NULL) {
		fprintf(stderr, "libmawk_initialize failed, exiting\n");
		return 1;
	}

	/* libmawk_append_input() operates on "/dev/stdin" as registered, if it is
	   a pipe, so it is compatible with manual setup */
	libmawk_append_input(m, "Hello world!\n");
	libmawk_run_main(m);


	/* print all the stdout the script produced so far */
	print_pipe_pending(m, vf_stdout, "stdout");
	print_pipe_pending(m, vf_log,    "log");

	/* run END and free the context */
	libmawk_uninitialize(m);

	return 0;
}