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
00031 #include <assert.h>
00032 #include <libgen.h>
00033 #include <stdio.h>
00034 #include <stdlib.h>
00035 #include <string.h>
00036 #include <sys/types.h>
00037 #include <sys/wait.h>
00038 #include <unistd.h>
00039 #include <errno.h>
00040 #include "../mytypes.h"
00041
00042 #include "os.h"
00043
00045 static char *ef_path;
00046
00047
00048
00049
00050
00051
00052
00053
00060 char *os_str_acat(const char *a, const char *b)
00061 {
00062 int a_len, b_len;
00063 char *str;
00064
00065 a_len = strlen(a);
00066 b_len = strlen(b);
00067
00068 str = malloc(a_len + b_len + 1);
00069 if (str == NULL) {
00070 printf("Memory allocation error.\n");
00071 exit(1);
00072 }
00073
00074 memcpy(str, a, a_len);
00075 memcpy(str + a_len, b, b_len);
00076 str[a_len + b_len] = '\0';
00077
00078 return str;
00079 }
00080
00093 char *os_str_aslice(const char *str, size_t start, size_t length)
00094 {
00095 char *slice;
00096
00097 assert(start + length <= strlen(str));
00098 slice = malloc(length + 1);
00099 if (slice == NULL) {
00100 printf("Memory allocation error.\n");
00101 exit(1);
00102 }
00103
00104 strncpy(slice, str + start, length);
00105 slice[length] = '\0';
00106
00107 return slice;
00108 }
00109
00116 int os_str_cmp(const char *a, const char *b)
00117 {
00118 return strcmp(a, b);
00119 }
00120
00126 size_t os_str_length(const char *str)
00127 {
00128 return strlen(str);
00129 }
00130
00136 char *os_str_dup(const char *str)
00137 {
00138 return strdup(str);
00139 }
00140
00149 int os_str_get_char(const char *str, int index, int *out_char)
00150 {
00151 size_t len;
00152
00153 len = strlen(str);
00154 if (index < 0 || (size_t) index >= len)
00155 return EINVAL;
00156
00157 *out_char = str[index];
00158 return EOK;
00159 }
00160
00166 char *os_chr_to_astr(wchar_t chr)
00167 {
00168 char *str;
00169
00170 str = malloc(2);
00171 if (str == NULL) {
00172 printf("Memory allocation error.\n");
00173 exit(1);
00174 }
00175
00176 str[0] = (char) chr;
00177 str[1] = '\0';
00178
00179 return str;
00180 }
00181
00182 #define OS_INPUT_BUFFER_SIZE 256
00183 static char os_input_buffer[OS_INPUT_BUFFER_SIZE];
00184
00186 void os_input_disp_help(void)
00187 {
00188 printf("Send ^C (SIGINT) to quit.\n");
00189 }
00190
00195 int os_input_line(char **ptr)
00196 {
00197 if (fgets(os_input_buffer, OS_INPUT_BUFFER_SIZE, stdin) == NULL)
00198 os_input_buffer[0] = '\0';
00199
00200 if (ferror(stdin)) {
00201 *ptr = NULL;
00202 return EIO;
00203 }
00204
00205 *ptr = strdup(os_input_buffer);
00206 return EOK;
00207 }
00208
00214 int os_exec(char *const cmd[])
00215 {
00216 pid_t pid;
00217 int status;
00218
00219 pid = vfork();
00220
00221 if (pid == 0) {
00222 execvp(cmd[0], cmd);
00223
00224 exit(1);
00225 } else if (pid == -1) {
00226
00227 return EBUSY;
00228 }
00229
00230 if (waitpid(pid, &status, 0) == -1) {
00231
00232 printf("Error: Waitpid failed.\n");
00233 exit(1);
00234 }
00235
00236 if (WIFEXITED(status) && WEXITSTATUS(status) != 0) {
00237 printf("Error: Exec failed or child returned non-zero "
00238 "exit status.\n");
00239 }
00240
00241 return EOK;
00242 }
00243
00248 void os_store_ef_path(char *path)
00249 {
00250 ef_path = path;
00251 }
00252
00257 char *os_get_lib_path(void)
00258 {
00259 return os_str_acat(dirname(ef_path), "/lib");
00260 }