xref: /aosp_15_r20/external/toybox/toys/other/rev.c (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
1*cf5a6c84SAndroid Build Coastguard Worker /* rev.c - reverse lines of a set of given input files
2*cf5a6c84SAndroid Build Coastguard Worker  *
3*cf5a6c84SAndroid Build Coastguard Worker  * Copyright 2012 Elie De Brauwer <[email protected]>
4*cf5a6c84SAndroid Build Coastguard Worker 
5*cf5a6c84SAndroid Build Coastguard Worker USE_REV(NEWTOY(rev, NULL, TOYFLAG_USR|TOYFLAG_BIN))
6*cf5a6c84SAndroid Build Coastguard Worker 
7*cf5a6c84SAndroid Build Coastguard Worker config REV
8*cf5a6c84SAndroid Build Coastguard Worker   bool "rev"
9*cf5a6c84SAndroid Build Coastguard Worker   default y
10*cf5a6c84SAndroid Build Coastguard Worker   help
11*cf5a6c84SAndroid Build Coastguard Worker     usage: rev [FILE...]
12*cf5a6c84SAndroid Build Coastguard Worker 
13*cf5a6c84SAndroid Build Coastguard Worker     Output each line reversed, when no files are given stdin is used.
14*cf5a6c84SAndroid Build Coastguard Worker */
15*cf5a6c84SAndroid Build Coastguard Worker 
16*cf5a6c84SAndroid Build Coastguard Worker #include "toys.h"
17*cf5a6c84SAndroid Build Coastguard Worker 
rev_line(char ** pline,long len)18*cf5a6c84SAndroid Build Coastguard Worker static void rev_line(char **pline, long len)
19*cf5a6c84SAndroid Build Coastguard Worker {
20*cf5a6c84SAndroid Build Coastguard Worker   char *line;
21*cf5a6c84SAndroid Build Coastguard Worker   long i;
22*cf5a6c84SAndroid Build Coastguard Worker 
23*cf5a6c84SAndroid Build Coastguard Worker   if (!pline) return;
24*cf5a6c84SAndroid Build Coastguard Worker   line = *pline;
25*cf5a6c84SAndroid Build Coastguard Worker   if (len && line[len-1]=='\n') line[--len] = 0;
26*cf5a6c84SAndroid Build Coastguard Worker 
27*cf5a6c84SAndroid Build Coastguard Worker   if (len--) for (i = 0; i <= len/2; i++) {
28*cf5a6c84SAndroid Build Coastguard Worker     char tmp = line[i];
29*cf5a6c84SAndroid Build Coastguard Worker 
30*cf5a6c84SAndroid Build Coastguard Worker     line[i] = line[len-i];
31*cf5a6c84SAndroid Build Coastguard Worker     line[len-i] = tmp;
32*cf5a6c84SAndroid Build Coastguard Worker   }
33*cf5a6c84SAndroid Build Coastguard Worker   xputs(line);
34*cf5a6c84SAndroid Build Coastguard Worker }
35*cf5a6c84SAndroid Build Coastguard Worker 
rev_main(void)36*cf5a6c84SAndroid Build Coastguard Worker void rev_main(void)
37*cf5a6c84SAndroid Build Coastguard Worker {
38*cf5a6c84SAndroid Build Coastguard Worker   loopfiles_lines(toys.optargs, rev_line);
39*cf5a6c84SAndroid Build Coastguard Worker }
40