int str_path_isabs(const char *str) { int abs = 1; if (str_isempty(str)) return 0; if (*str != '/') return 0; strtok_t _st, *st = &_st, *p; if (!strtok_init_str(st, str, "/", 0)) return -1; strtok_for_each(st, p) { if (str_equal(p->token, ".") || str_equal(p->token, "..") || !str_isgraph(p->token)) { abs = 0; break; } } strtok_free(st); return abs; }
int exec_replace(const char *fmt, ...) { va_list ap; va_start(ap, fmt); char *cmd; if (_lucid_vasprintf(&cmd, fmt, ap) == -1) { va_end(ap); return -1; } va_end(ap); strtok_t _st, *st = &_st; if (!strtok_init_str(st, cmd, " ", 0)) { free(cmd); return -1; } free(cmd); int argc = strtok_count(st); char **argv = malloc((argc + 1) * sizeof(char *)); if (!argv) { strtok_free(st); return -1; } if (strtok_toargv(st, argv) < 1) { free(argv); strtok_free(st); return -1; } execvp(argv[0], argv); /* never get here */ free(argv); strtok_free(st); return -1; }
/** * Free string token parsing object and nullify its pointer. */ void strtok_free_null(strtok_t **s_ptr) { strtok_t *s = *s_ptr; if (s != NULL) { strtok_free(s); *s_ptr = NULL; } }
/** * Does a string, delimited by the supplied token separators, contain * the given string, with a case-insensitive (ASCII) comparison? * Leading and trailing whitespaces are ignored in tokens. * * @param string the string to tokenize * @param delim the token delimitors * @param what the token to look for, case-insensitively */ bool strtok_case_has(const char *string, const char *delim, const char *what) { strtok_t *st; bool found = FALSE; st = strtok_make(string, TRUE, TRUE); while ( strtok_next_internal(st, delim, TRUE, TRUE, NULL, what, TRUE, &found) ) { if (found) break; } strtok_free(st); return found; }
int str_path_isdot(const char *str) { int found = 0; if (str_isempty(str)) return 0; strtok_t _st, *st = &_st, *p; if (!strtok_init_str(st, str, "/", 0)) return 0; strtok_for_each(st, p) { if (str_equal(p->token, ".") || str_equal(p->token, "..")) { found = 1; break; } } strtok_free(st); return found; }
int exec_fork(const char *fmt, ...) { va_list ap; va_start(ap, fmt); char *cmd; if (_lucid_vasprintf(&cmd, fmt, ap) == -1) { va_end(ap); return -1; } va_end(ap); strtok_t _st, *st = &_st; if (!strtok_init_str(st, cmd, " ", 0)) { free(cmd); return -1; } free(cmd); int argc = strtok_count(st); char **argv = malloc((argc + 1) * sizeof(char *)); if (!argv) { strtok_free(st); return -1; } if (strtok_toargv(st, argv) < 1) { free(argv); strtok_free(st); return -1; } pid_t pid; int status; switch ((pid = fork())) { case -1: return -1; case 0: usleep(200); execvp(argv[0], argv); /* never get here */ exit(1); default: free(argv); strtok_free(st); if (waitpid(pid, &status, 0) == -1) return -1; } return status; }