1 /* ISC license. */
2
3 #include <string.h>
4 #include <stdlib.h>
5 #include <skalibs/sgetopt.h>
6 #include <skalibs/buffer.h>
7 #include <skalibs/strerr2.h>
8 #include <skalibs/djbunix.h>
9 #include <skalibs/types.h>
10 #include <skalibs/netstring.h>
11
12 #define USAGE "dollarat [ -n ] [ -0 | -d delimchar ]"
13
main(int argc,char const * const * argv)14 int main (int argc, char const *const *argv)
15 {
16 unsigned int n, i = 0 ;
17 char const *x ;
18 char delim = '\n' ;
19 int zero = 0 ;
20 int nl = 1 ;
21 PROG = "dollarat" ;
22 {
23 subgetopt_t l = SUBGETOPT_ZERO ;
24 for (;;)
25 {
26 int opt = subgetopt_r(argc, argv, "nd:0", &l) ;
27 if (opt == -1) break ;
28 switch (opt)
29 {
30 case 'n' : nl = 0 ; break ;
31 case 'd' : delim = *l.arg ; zero = 0 ; break ;
32 case '0' : zero = 1 ; break ;
33 default : strerr_dieusage(100, USAGE) ;
34 }
35 }
36 argc -= l.ind ; argv += l.ind ;
37 }
38 if (zero) delim = 0 ;
39 x = getenv("#") ;
40 if (!x) strerr_dienotset(100, "#") ;
41 if (!uint0_scan(x, &n)) strerr_dieinvalid(100, "#") ;
42 for (; i < n ; i++)
43 {
44 char fmt[UINT_FMT] ;
45 fmt[uint_fmt(fmt, i+1)] = 0 ;
46 x = getenv(fmt) ;
47 if (!x) strerr_dienotset(100, fmt) ;
48 if (delim || zero)
49 {
50 if ((buffer_puts(buffer_1, x) < 0)
51 || (((i < n-1) || nl) && (buffer_put(buffer_1, &delim, 1) < 0)))
52 strerr_diefu1sys(111, "write to stdout") ;
53 }
54 else
55 {
56 size_t written = 0 ;
57 if (!netstring_put(buffer_1, x, strlen(x), &written))
58 strerr_diefu1sys(111, "write a netstring to stdout") ;
59 }
60 }
61 if (!buffer_flush(buffer_1))
62 strerr_diefu1sys(111, "write to stdout") ;
63 return 0 ;
64 }
65