/* * Since working awk is not present on every supported platform * (notably Solaris), and nawk is not the same on Solaris and Linux, * this program is a replacement for it to extract test parameter from the. * string specified in the command line. */ #include #include #include #include static void usage(const char *progname) { fprintf(stderr, "Search PARAM=VALUE pattern in the given string\n"); fprintf(stderr, "Usage: %s \n", progname); } static const char * search(const char *param, const char *haystack) { const char *p = strstr(haystack, param); if(p && p[strlen(param)] == '=') { const char *param_begin = &p[strlen(param) + 1]; const char *param_end = param_begin; for(param_end = param_begin; param_end; param_end++) { switch(*param_end) { case '0' ... '9': continue; default: break; } break; } static char static_buf[64]; if((param_end - param_begin) <= 0) { fprintf(stderr, "Parameter %s is malformed after '='\n", param); return NULL; } if((param_end - param_begin) >= (ssize_t)sizeof(static_buf)) { fprintf(stderr, "Parameter %s value exceeds buffer size %zu\n", param, sizeof(static_buf)); return NULL; } memcpy(static_buf, param_begin, param_end - param_begin); static_buf[param_end - param_begin] = '\0'; return static_buf; } else if(p) { fprintf(stderr, "Parameter %s should contain '='\n", param); return NULL; } return NULL; } int main(int ac, char **av) { if(ac != 4) { usage(av[0]); exit(EX_USAGE); } const char *value = search(av[1], av[3]); if(value) { printf("%s\n", value); } else { printf("%s\n", av[2]); } }