root/maint/gnulib/tests/test-argv-iter.c

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. write_nul_delimited_argv
  2. main

   1 /* Test argv iterator
   2    Copyright (C) 2008-2021 Free Software Foundation, Inc.
   3 
   4    This program is free software: you can redistribute it and/or modify
   5    it under the terms of the GNU General Public License as published by
   6    the Free Software Foundation; either version 3 of the License, or
   7    (at your option) any later version.
   8 
   9    This program is distributed in the hope that it will be useful,
  10    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12    GNU General Public License for more details.
  13 
  14    You should have received a copy of the GNU General Public License
  15    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
  16 
  17 /* Written by Jim Meyering.  */
  18 
  19 #include <config.h>
  20 
  21 #include "argv-iter.h"
  22 
  23 #include <stdio.h>
  24 #include <string.h>
  25 
  26 #include "macros.h"
  27 
  28 #define ARRAY_CARDINALITY(Array) (sizeof (Array) / sizeof *(Array))
  29 #define STREQ(a, b) (strcmp (a, b) == 0)
  30 
  31 static FILE *
  32 write_nul_delimited_argv (char **argv)
     /* [previous][next][first][last][top][bottom][index][help] */
  33 {
  34   FILE *fp = tmpfile ();
  35   ASSERT (fp);
  36   while (*argv)
  37     {
  38       size_t len = strlen (*argv) + 1;
  39       ASSERT (fwrite (*argv, len, 1, fp) == 1);
  40       argv++;
  41     }
  42   ASSERT (fflush (fp) == 0);
  43   rewind (fp);
  44   return fp;
  45 }
  46 
  47 int
  48 main (void)
     /* [previous][next][first][last][top][bottom][index][help] */
  49 {
  50   static char one[] = "1";
  51   static char two[] = "2";
  52   static char three[] = "3";
  53   static char *av[][4] = {
  54     {NULL},
  55     {one, NULL},
  56     {one, two, NULL},
  57     {one, two, three, NULL}
  58   };
  59 
  60   int use_stream;
  61   for (use_stream = 0; use_stream < 2; use_stream++)
  62     {
  63       size_t i;
  64       for (i = 0; i < ARRAY_CARDINALITY (av); i++)
  65         {
  66           FILE *fp;
  67           struct argv_iterator *ai;
  68           size_t n_found = 0;
  69           if (use_stream)
  70             {
  71               /* Generate an identical list to be read via FP.  */
  72               ASSERT ((fp = write_nul_delimited_argv (av[i])) != NULL);
  73               ai = argv_iter_init_stream (fp);
  74             }
  75           else
  76             {
  77               fp = NULL;
  78               ai = argv_iter_init_argv (av[i]);
  79             }
  80           ASSERT (ai);
  81 
  82           while (1)
  83             {
  84               enum argv_iter_err ai_err;
  85               char *s = argv_iter (ai, &ai_err);
  86               ASSERT ((i == n_found) == (ai_err == AI_ERR_EOF));
  87               ASSERT ((s == NULL) ^ (ai_err == AI_ERR_OK));
  88               ASSERT (ai_err == AI_ERR_OK || ai_err == AI_ERR_EOF);
  89               if (ai_err == AI_ERR_OK)
  90                 ++n_found;
  91               if (ai_err == AI_ERR_EOF)
  92                 break;
  93               /* In stream mode, the strings are equal, but
  94                  in argv mode the actual pointers are equal.  */
  95               ASSERT (use_stream
  96                       ? STREQ (s, av[i][n_found - 1])
  97                       : s == av[i][n_found - 1]);
  98             }
  99           ASSERT (argv_iter_n_args (ai) == i);
 100           argv_iter_free (ai);
 101           if (fp)
 102             ASSERT (fclose (fp) == 0);
 103         }
 104     }
 105 
 106   return 0;
 107 }

/* [previous][next][first][last][top][bottom][index][help] */