1*3db7c0f6Sdjm /* $OpenBSD: test_argv.c,v 1.1 2021/03/19 04:23:50 djm Exp $ */ 2*3db7c0f6Sdjm /* 3*3db7c0f6Sdjm * Regress test for misc argv handling functions. 4*3db7c0f6Sdjm * 5*3db7c0f6Sdjm * Placed in the public domain. 6*3db7c0f6Sdjm */ 7*3db7c0f6Sdjm 8*3db7c0f6Sdjm #include <sys/types.h> 9*3db7c0f6Sdjm #include <sys/param.h> 10*3db7c0f6Sdjm #include <stdio.h> 11*3db7c0f6Sdjm #include <stdint.h> 12*3db7c0f6Sdjm #include <stdlib.h> 13*3db7c0f6Sdjm #include <string.h> 14*3db7c0f6Sdjm 15*3db7c0f6Sdjm #include "test_helper.h" 16*3db7c0f6Sdjm 17*3db7c0f6Sdjm #include "log.h" 18*3db7c0f6Sdjm #include "misc.h" 19*3db7c0f6Sdjm 20*3db7c0f6Sdjm void test_argv(void); 21*3db7c0f6Sdjm 22*3db7c0f6Sdjm static void 23*3db7c0f6Sdjm free_argv(char **av, int ac) 24*3db7c0f6Sdjm { 25*3db7c0f6Sdjm int i; 26*3db7c0f6Sdjm 27*3db7c0f6Sdjm for (i = 0; i < ac; i++) 28*3db7c0f6Sdjm free(av[i]); 29*3db7c0f6Sdjm free(av); 30*3db7c0f6Sdjm } 31*3db7c0f6Sdjm 32*3db7c0f6Sdjm void 33*3db7c0f6Sdjm test_argv(void) 34*3db7c0f6Sdjm { 35*3db7c0f6Sdjm char **av = NULL; 36*3db7c0f6Sdjm int ac = 0; 37*3db7c0f6Sdjm 38*3db7c0f6Sdjm #define RESET_ARGV() \ 39*3db7c0f6Sdjm do { \ 40*3db7c0f6Sdjm free_argv(av, ac); \ 41*3db7c0f6Sdjm av = NULL; \ 42*3db7c0f6Sdjm ac = -1; \ 43*3db7c0f6Sdjm } while (0) 44*3db7c0f6Sdjm 45*3db7c0f6Sdjm TEST_START("empty args"); 46*3db7c0f6Sdjm RESET_ARGV(); 47*3db7c0f6Sdjm ASSERT_INT_EQ(argv_split("", &ac, &av), 0); 48*3db7c0f6Sdjm ASSERT_INT_EQ(ac, 0); 49*3db7c0f6Sdjm ASSERT_PTR_NE(av, NULL); 50*3db7c0f6Sdjm ASSERT_PTR_EQ(av[0], NULL); 51*3db7c0f6Sdjm RESET_ARGV(); 52*3db7c0f6Sdjm ASSERT_INT_EQ(argv_split(" ", &ac, &av), 0); 53*3db7c0f6Sdjm ASSERT_INT_EQ(ac, 0); 54*3db7c0f6Sdjm ASSERT_PTR_NE(av, NULL); 55*3db7c0f6Sdjm ASSERT_PTR_EQ(av[0], NULL); 56*3db7c0f6Sdjm TEST_DONE(); 57*3db7c0f6Sdjm 58*3db7c0f6Sdjm TEST_START("trivial args"); 59*3db7c0f6Sdjm RESET_ARGV(); 60*3db7c0f6Sdjm ASSERT_INT_EQ(argv_split("leamas", &ac, &av), 0); 61*3db7c0f6Sdjm ASSERT_INT_EQ(ac, 1); 62*3db7c0f6Sdjm ASSERT_PTR_NE(av, NULL); 63*3db7c0f6Sdjm ASSERT_STRING_EQ(av[0], "leamas"); 64*3db7c0f6Sdjm ASSERT_PTR_EQ(av[1], NULL); 65*3db7c0f6Sdjm RESET_ARGV(); 66*3db7c0f6Sdjm ASSERT_INT_EQ(argv_split("smiley leamas", &ac, &av), 0); 67*3db7c0f6Sdjm ASSERT_INT_EQ(ac, 2); 68*3db7c0f6Sdjm ASSERT_PTR_NE(av, NULL); 69*3db7c0f6Sdjm ASSERT_STRING_EQ(av[0], "smiley"); 70*3db7c0f6Sdjm ASSERT_STRING_EQ(av[1], "leamas"); 71*3db7c0f6Sdjm ASSERT_PTR_EQ(av[2], NULL); 72*3db7c0f6Sdjm TEST_DONE(); 73*3db7c0f6Sdjm 74*3db7c0f6Sdjm TEST_START("quoted"); 75*3db7c0f6Sdjm RESET_ARGV(); 76*3db7c0f6Sdjm ASSERT_INT_EQ(argv_split("\"smiley\"", &ac, &av), 0); 77*3db7c0f6Sdjm ASSERT_INT_EQ(ac, 1); 78*3db7c0f6Sdjm ASSERT_PTR_NE(av, NULL); 79*3db7c0f6Sdjm ASSERT_STRING_EQ(av[0], "smiley"); 80*3db7c0f6Sdjm ASSERT_PTR_EQ(av[1], NULL); 81*3db7c0f6Sdjm RESET_ARGV(); 82*3db7c0f6Sdjm ASSERT_INT_EQ(argv_split("leamas \" smiley \"", &ac, &av), 0); 83*3db7c0f6Sdjm ASSERT_INT_EQ(ac, 2); 84*3db7c0f6Sdjm ASSERT_PTR_NE(av, NULL); 85*3db7c0f6Sdjm ASSERT_STRING_EQ(av[0], "leamas"); 86*3db7c0f6Sdjm ASSERT_STRING_EQ(av[1], " smiley "); 87*3db7c0f6Sdjm ASSERT_PTR_EQ(av[2], NULL); 88*3db7c0f6Sdjm RESET_ARGV(); 89*3db7c0f6Sdjm ASSERT_INT_EQ(argv_split("\"smiley leamas\"", &ac, &av), 0); 90*3db7c0f6Sdjm ASSERT_INT_EQ(ac, 1); 91*3db7c0f6Sdjm ASSERT_PTR_NE(av, NULL); 92*3db7c0f6Sdjm ASSERT_STRING_EQ(av[0], "smiley leamas"); 93*3db7c0f6Sdjm ASSERT_PTR_EQ(av[1], NULL); 94*3db7c0f6Sdjm RESET_ARGV(); 95*3db7c0f6Sdjm ASSERT_INT_EQ(argv_split("smiley\" leamas\" liz", &ac, &av), 0); 96*3db7c0f6Sdjm ASSERT_INT_EQ(ac, 2); 97*3db7c0f6Sdjm ASSERT_PTR_NE(av, NULL); 98*3db7c0f6Sdjm ASSERT_STRING_EQ(av[0], "smiley leamas"); 99*3db7c0f6Sdjm ASSERT_STRING_EQ(av[1], "liz"); 100*3db7c0f6Sdjm ASSERT_PTR_EQ(av[2], NULL); 101*3db7c0f6Sdjm TEST_DONE(); 102*3db7c0f6Sdjm 103*3db7c0f6Sdjm TEST_START("escaped"); 104*3db7c0f6Sdjm RESET_ARGV(); 105*3db7c0f6Sdjm ASSERT_INT_EQ(argv_split("\\\"smiley\\'", &ac, &av), 0); 106*3db7c0f6Sdjm ASSERT_INT_EQ(ac, 1); 107*3db7c0f6Sdjm ASSERT_PTR_NE(av, NULL); 108*3db7c0f6Sdjm ASSERT_STRING_EQ(av[0], "\"smiley'"); 109*3db7c0f6Sdjm ASSERT_PTR_EQ(av[1], NULL); 110*3db7c0f6Sdjm RESET_ARGV(); 111*3db7c0f6Sdjm ASSERT_INT_EQ(argv_split("'\\'smiley\\\"'", &ac, &av), 0); 112*3db7c0f6Sdjm ASSERT_INT_EQ(ac, 1); 113*3db7c0f6Sdjm ASSERT_PTR_NE(av, NULL); 114*3db7c0f6Sdjm ASSERT_STRING_EQ(av[0], "'smiley\""); 115*3db7c0f6Sdjm ASSERT_PTR_EQ(av[1], NULL); 116*3db7c0f6Sdjm RESET_ARGV(); 117*3db7c0f6Sdjm ASSERT_INT_EQ(argv_split("smiley\\'s leamas\\'", &ac, &av), 0); 118*3db7c0f6Sdjm ASSERT_INT_EQ(ac, 2); 119*3db7c0f6Sdjm ASSERT_PTR_NE(av, NULL); 120*3db7c0f6Sdjm ASSERT_STRING_EQ(av[0], "smiley's"); 121*3db7c0f6Sdjm ASSERT_STRING_EQ(av[1], "leamas'"); 122*3db7c0f6Sdjm ASSERT_PTR_EQ(av[2], NULL); 123*3db7c0f6Sdjm RESET_ARGV(); 124*3db7c0f6Sdjm ASSERT_INT_EQ(argv_split("leamas\\\\smiley", &ac, &av), 0); 125*3db7c0f6Sdjm ASSERT_INT_EQ(ac, 1); 126*3db7c0f6Sdjm ASSERT_PTR_NE(av, NULL); 127*3db7c0f6Sdjm ASSERT_STRING_EQ(av[0], "leamas\\smiley"); 128*3db7c0f6Sdjm ASSERT_PTR_EQ(av[1], NULL); 129*3db7c0f6Sdjm RESET_ARGV(); 130*3db7c0f6Sdjm ASSERT_INT_EQ(argv_split("leamas\\\\ \\\\smiley", &ac, &av), 0); 131*3db7c0f6Sdjm ASSERT_INT_EQ(ac, 2); 132*3db7c0f6Sdjm ASSERT_PTR_NE(av, NULL); 133*3db7c0f6Sdjm ASSERT_STRING_EQ(av[0], "leamas\\"); 134*3db7c0f6Sdjm ASSERT_STRING_EQ(av[1], "\\smiley"); 135*3db7c0f6Sdjm ASSERT_PTR_EQ(av[2], NULL); 136*3db7c0f6Sdjm TEST_DONE(); 137*3db7c0f6Sdjm 138*3db7c0f6Sdjm /* XXX test char *argv_assemble(int argc, char **argv) */ 139*3db7c0f6Sdjm } 140