標籤:
函數分別位於glibc源碼中的../glibc-version/string/argz-extract.c和../glibc-version/string/argz-stringify.c中。
函式宣告如下:
// argz.h/* Puts pointers to each string in ARGZ into ARGV, which must be large enough to hold them all. */extern void __argz_extract (__const char *__restrict __argz, size_t __len, char **__restrict __argv) __THROW;extern void argz_extract (__const char *__restrict __argz, size_t __len, char **__restrict __argv) __THROW; /* Make ‘\0‘ separated arg vector ARGZ printable by converting all the ‘\0‘s except the last into the character SEP. */extern void __argz_stringify (char *__argz, size_t __len, int __sep) __THROW;extern void argz_stringify (char *__argz, size_t __len, int __sep) __THROW;
argz_extract()函數是將argz vector中的元素轉存到argv中,以此實現一維到二維的轉換。注意,argv最後要有一個元素為NULL,以"this is a test"為例,轉換結果如:
argz_stringify()函數是將argz vecotr變成一個正常的字串,以給定的delim字元去替換argz vector中的\0,在上例中假如再給定字元‘,‘那麼得到的結果如:
函數的實現如下:
/* Puts pointers to each string in ARGZ, plus a terminating 0 element, into ARGV, which must be large enough to hold them all. */void__argz_extract (const char *argz, size_t len, char **argv){ while (len > 0) { size_t part_len = strlen (argz); *argv++ = (char *) argz; argz += part_len + 1; len -= part_len + 1; } *argv = 0;}weak_alias (__argz_extract, argz_extract) /* Make ‘\0‘ separated arg vector ARGZ printable by converting all the ‘\0‘s except the last into the character SEP. */void__argz_stringify (char *argz, size_t len, int sep){ if (len > 0) while (1) { size_t part_len = __strnlen (argz, len); argz += part_len; len -= part_len; if (len-- <= 1) /* includes final ‘\0‘ we want to stop at */ break; *argz++ = sep; }}libc_hidden_def (__argz_stringify)weak_alias (__argz_stringify, argz_stringify)
argz_extract()函數,argz_stringify()函數