1*cf5a6c84SAndroid Build Coastguard Worker /* tac.c - output lines in reverse order 2*cf5a6c84SAndroid Build Coastguard Worker * 3*cf5a6c84SAndroid Build Coastguard Worker * Copyright 2012 Rob Landley <[email protected]> 4*cf5a6c84SAndroid Build Coastguard Worker 5*cf5a6c84SAndroid Build Coastguard Worker USE_TAC(NEWTOY(tac, NULL, TOYFLAG_USR|TOYFLAG_BIN)) 6*cf5a6c84SAndroid Build Coastguard Worker 7*cf5a6c84SAndroid Build Coastguard Worker config TAC 8*cf5a6c84SAndroid Build Coastguard Worker bool "tac" 9*cf5a6c84SAndroid Build Coastguard Worker default y 10*cf5a6c84SAndroid Build Coastguard Worker help 11*cf5a6c84SAndroid Build Coastguard Worker usage: tac [FILE...] 12*cf5a6c84SAndroid Build Coastguard Worker 13*cf5a6c84SAndroid Build Coastguard Worker Output lines in reverse order. 14*cf5a6c84SAndroid Build Coastguard Worker */ 15*cf5a6c84SAndroid Build Coastguard Worker 16*cf5a6c84SAndroid Build Coastguard Worker #define FOR_tac 17*cf5a6c84SAndroid Build Coastguard Worker #include "toys.h" 18*cf5a6c84SAndroid Build Coastguard Worker GLOBALS(struct double_list * dl;)19*cf5a6c84SAndroid Build Coastguard WorkerGLOBALS( 20*cf5a6c84SAndroid Build Coastguard Worker struct double_list *dl; 21*cf5a6c84SAndroid Build Coastguard Worker ) 22*cf5a6c84SAndroid Build Coastguard Worker 23*cf5a6c84SAndroid Build Coastguard Worker static void do_tac(char **pline, long len) 24*cf5a6c84SAndroid Build Coastguard Worker { 25*cf5a6c84SAndroid Build Coastguard Worker if (pline) { 26*cf5a6c84SAndroid Build Coastguard Worker dlist_add(&TT.dl, *pline); 27*cf5a6c84SAndroid Build Coastguard Worker *pline = 0; 28*cf5a6c84SAndroid Build Coastguard Worker } else while (TT.dl) { 29*cf5a6c84SAndroid Build Coastguard Worker struct double_list *dl = dlist_lpop(&TT.dl); 30*cf5a6c84SAndroid Build Coastguard Worker 31*cf5a6c84SAndroid Build Coastguard Worker xprintf("%s", dl->data); 32*cf5a6c84SAndroid Build Coastguard Worker free(dl->data); 33*cf5a6c84SAndroid Build Coastguard Worker free(dl); 34*cf5a6c84SAndroid Build Coastguard Worker } 35*cf5a6c84SAndroid Build Coastguard Worker } 36*cf5a6c84SAndroid Build Coastguard Worker tac_main(void)37*cf5a6c84SAndroid Build Coastguard Workervoid tac_main(void) 38*cf5a6c84SAndroid Build Coastguard Worker { 39*cf5a6c84SAndroid Build Coastguard Worker loopfiles_lines(toys.optargs, do_tac); 40*cf5a6c84SAndroid Build Coastguard Worker } 41