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