00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00033 #include <stdlib.h>
00034 #include <str.h>
00035
00036 #include "util.h"
00037
00038 char *get_abs_path(const char *base_path, const char *name, const char *ext)
00039 {
00040 char *res;
00041 int base_len = str_size(base_path);
00042 int size = base_len + 2 * str_size(name) + str_size(ext) + 3;
00043
00044 res = malloc(size);
00045
00046 if (res) {
00047 str_cpy(res, size, base_path);
00048 if (base_path[base_len - 1] != '/')
00049 str_append(res, size, "/");
00050 str_append(res, size, name);
00051 str_append(res, size, "/");
00052 str_append(res, size, name);
00053 if (ext[0] != '.')
00054 str_append(res, size, ".");
00055 str_append(res, size, ext);
00056 }
00057
00058 return res;
00059 }
00060
00061 char *get_path_elem_end(char *path)
00062 {
00063 while (*path != '\0' && *path != '/')
00064 path++;
00065 return path;
00066 }
00067
00068 bool skip_spaces(char **buf)
00069 {
00070 while (isspace(**buf))
00071 (*buf)++;
00072 return *buf != 0;
00073 }
00074
00075 size_t get_nonspace_len(const char *str)
00076 {
00077 size_t len = 0;
00078
00079 while(*str != '\0' && !isspace(*str)) {
00080 len++;
00081 str++;
00082 }
00083
00084 return len;
00085 }
00086
00087 void free_not_null(const void *ptr)
00088 {
00089 if (ptr != NULL)
00090 free(ptr);
00091 }
00092
00093 char *clone_string(const char *s)
00094 {
00095 size_t size = str_size(s) + 1;
00096 char *str;
00097
00098 str = (char *) malloc(size);
00099 if (str != NULL)
00100 str_cpy(str, size, s);
00101 return str;
00102 }
00103
00104 void replace_char(char *str, char orig, char repl)
00105 {
00106 while (*str) {
00107 if (*str == orig)
00108 *str = repl;
00109 str++;
00110 }
00111 }
00112
00113 ssize_t safe_read(int fd, void *buffer, size_t size)
00114 {
00115 if (size == 0) {
00116 return 0;
00117 }
00118
00119 uint8_t *buf_ptr = (uint8_t *) buffer;
00120
00121 size_t total_read = 0;
00122 while (total_read < size) {
00123 ssize_t bytes_read = read(fd, buf_ptr, size - total_read);
00124 if (bytes_read < 0) {
00125
00126 return bytes_read;
00127 } else if (bytes_read == 0) {
00128
00129 break;
00130 } else {
00131
00132 buf_ptr += bytes_read;
00133 total_read += bytes_read;
00134 }
00135 }
00136
00137 return (ssize_t) total_read;
00138 }
00139