Categories
FreeBSD

AWKA – The AWK Compiler

I found this really cool tool in the FreeBSD ports today that can compile AWK code into an executable binary file.

I haven’t tried anything too complicated, but it managed to compile an AWK program with an internal pipe, but it cannot compile a daisy chain of awk programs piped together in a shell. I think this could be done in stages by producing ‘-c’ function code output for each stage then calling those functions from your own hand made main().

Example AWK Program

This is an awk program to get a list of full names from /etc/passwd
The filename is test.awk

BEGIN {
FS = ":"
}

{
print $5 | "sort -u"
}

AWKA Command

Run awk program: -f test.awk
Output binary: -o test
Data file: -a /etc/passwd

awka -X -f test.awk -o test -a /etc/passwd

The C Code Output

test.c

/* This file generated by AWKA */

#include
#include

int _split_req = 0, _split_max = INT_MAX;

extern int _dol0_used;
extern char _dol0_only;
extern char _env_used;
extern int _max_base_gc, _max_fn_gc;
extern struct awka_fn_struct *_awkafn;
extern int _int_argc;
extern char ** _int_argv;
jmp_buf context;

struct gvar_struct *_gvar;

a_VAR **_lvar;
a_VAR *_lits0_awka=NULL, *_lits1_awka=NULL;
void BEGIN();
void MAIN();

void
BEGIN()
{
awka_strcpy(a_bivar[a_FS], ":");

}


void
MAIN()
{
int i, _curfile;
if (*(awka_gets(a_bivar[a_FILENAME])) == '\0')
awka_strcpy(a_bivar[a_FILENAME], "");
i = setjmp(context);
while (awka_getline(a_TEMP, awka_dol0(0), awka_gets(a_bivar[a_FILENAME]), FALSE, TRUE)->dval > 0 && awka_setNF())
{
awka_print("sort -u", 0, 1, awka_arg1(a_TEMP, awka_doln(5, 0)));
nextrec:;
}
}

int
main(int argc, char *argv[])
{
_max_base_gc = 2;
_max_fn_gc = 2;


awka_varinit(_lits0_awka); awka_strcpy(_lits0_awka, ":");
awka_varinit(_lits1_awka); awka_strcpy(_lits1_awka, "sort -u");

if (!_lvar) {
malloc( &_lvar, 3 * sizeof(a_VAR *) );
_lvar[0] = _lits0_awka;
_lvar[1] = _lits1_awka;
_lvar[2] = NULL;
}

malloc( &_gvar, 1 * sizeof(struct gvar_struct) );
_gvar[0].name = NULL;
_gvar[0].var = NULL;

malloc( &_awkafn, 1 * sizeof(struct awka_fn_struct) );
_awkafn[0].name = NULL;
_awkafn[0].fn = NULL;

_int_argc = 1;
malloc( &_int_argv, 1 * sizeof(char *));
_int_argv[0] = "/etc/passwd";

awka_init(argc, argv, "0.7.5", "12 July 2001");

_split_max = 5;
_split_req = 1;
_dol0_used = 1;

BEGIN();
MAIN();

free(_lits0_awka->ptr); free(_lits0_awka);
free(_lits1_awka->ptr); free(_lits1_awka);

awka_exit(0);
}

Example Output

Auditdistd unprivileged user
Avahi Daemon User
Binaries Commands and Source
Bind Sandbox
Bourne-again Superuser
Charlie &
colord color management daemon
Cups Owner
D-BUS Daemon User
...

Privacy Preference Center

Necessary

Advertising

Analytics

Other