#include #include #include #include #include #include "misc.h" char *read_file(const char *filename, long *size) { /* Open the file. */ FILE *fp = fopen(filename, "r"); /* Size of the file, in bytes. */ long filesize = 0; /* Buffer of the file contents. */ char *buf; /* Return NULL, if we couldn't open the file. */ if (fp == NULL) { return NULL; } /* Return NULL, if we couldn't seek to the end of the file. */ if (fseek(fp, 0L, SEEK_END)) { fclose(fp); return NULL; } /* Get the size of the file, in bytes. */ filesize = ftell(fp); /* Return NULL, if the returned size is negative. */ if (filesize < 0) { fclose(fp); return NULL; } /* Allocate enough space for the entire file, plus one. */ buf = calloc(filesize+1, sizeof(char)); /* Return NULL, if the buffer wasn't allocated. */ if (buf == NULL) { fclose(fp); return NULL; } /* Seek back to the start of the file. */ rewind(fp); /* Read the entire file contents into the buffer. */ fread(buf, sizeof(char), filesize, fp); /* Close the file. */ fclose(fp); /* Return the filesize, in bytes. */ *size = filesize; /* Return the buffer. */ return buf; } char *get_line(char **str) { char *s; size_t i; char *tmp = *str; for (i = 0; tmp[i] != '\n' && tmp[i] != '\0'; i++); s = calloc(i+1, sizeof(char)); memcpy(s, *str, i); *str += (i+1); return s; } char *make_str(const char *str) { const size_t length = strlen(str); char *s = calloc(length+1, sizeof(char)); memcpy(s, str, length+1); return s; } char *dir_path_num(const char *root, int num) { /* Get the length of the path. */ int len = snprintf(NULL, 0, "%s/%i", root, num); /* Create the directory path. */ char *dir = calloc(len+1, sizeof(char)); sprintf(dir, "%s/%i", root, num); return dir; } char *dir_path_name(const char *root, char *name) { /* Get the length of the path. */ int len = snprintf(NULL, 0, "%s/%s", root, name); /* Create the directory path. */ char *dir = calloc(len+1, sizeof(char)); sprintf(dir, "%s/%s", root, name); return dir; } int delm_span(char *str, const char delm) { int i; for (i = 0; str[i] == delm; i++); return i; } int sanitize_strlen(char *str) { int len = 0; while (*str != '\0') { const int tok_span = strcspn(str, " ."); const int tok_len = (tok_span) ? tok_span : 1; const char delm = (tok_span) ? str[tok_len] : '\0'; const int span_len = (delm != '\0') ? delm_span(&str[tok_len+1], delm) : 0; str += (tok_len + span_len); len += tok_len; } return len; } char *sanitize_str(char *str) { const int len = sanitize_strlen(str); char *san_str = calloc(len+1, sizeof(char)); char *tmp = san_str; while (*str != '\0' && tmp < &san_str[len]) { const int tok_span = strcspn(str, " ."); const int tok_len = (tok_span) ? tok_span : 1; const char delm = (tok_span) ? str[tok_len] : '\0'; const int span_len = (delm != '\0') ? delm_span(&str[tok_len+1], delm) : 0; memcpy(tmp, str, tok_len); tmp += tok_len; str += (tok_len + span_len); *tmp = (delm == ' ') ? '-' : delm; } return san_str; } char *sanitized_dir_path_name(const char *root, char *name) { char *san_name = sanitize_str(name); char *dir = dir_path_name(root, san_name); free(san_name); return dir; } char *find_alpha(const char *str) { for (; !isalpha(*str); str++); return (char *)str; } char *create_num_str(const char *str, int num) { char *name; int lead_num = strtol(str, &name, 10); const char *sep = (*name != '-') ? "-" : ""; const char *s = find_alpha(name); name = calloc(format_len("%04d%s%s", num, sep, s), sizeof(char)); sprintf(name, "%04d%s%s", num, sep, str); return name; } int format_len(const char *fmt, ...) { int len = 0; va_list args; va_start(args, fmt); len = vsnprintf(NULL, 0, fmt, args); va_end(args); return len; }