diff options
Diffstat (limited to '')
-rw-r--r-- | lib/args.c | 111 | ||||
-rw-r--r-- | lib/args.h | 18 | ||||
-rw-r--r-- | lib/buffer.c | 60 | ||||
-rw-r--r-- | lib/buffer.h | 16 | ||||
-rw-r--r-- | lib/convert.c | 126 | ||||
-rw-r--r-- | lib/convert.h | 20 | ||||
-rw-r--r-- | lib/def.h | 31 | ||||
-rw-r--r-- | lib/error.c | 35 | ||||
-rw-r--r-- | lib/error.h | 13 | ||||
-rw-r--r-- | lib/file.c | 63 | ||||
-rw-r--r-- | lib/file.h | 14 | ||||
-rw-r--r-- | lib/lslib.h | 16 | ||||
-rw-r--r-- | lib/regex.c (renamed from src/util/regex.c) | 0 | ||||
-rw-r--r-- | lib/regex.h (renamed from src/util/regex.h) | 11 | ||||
-rw-r--r-- | lib/stack.c (renamed from src/util/stack.c) | 0 | ||||
-rw-r--r-- | lib/stack.h (renamed from src/util/stack.h) | 2 |
16 files changed, 524 insertions, 12 deletions
diff --git a/lib/args.c b/lib/args.c new file mode 100644 index 0000000..f907746 --- /dev/null +++ b/lib/args.c @@ -0,0 +1,111 @@ +#include "args.h" +#include "error.h" +#include "convert.h" + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#ifndef MAJOR +#define MAJOR 0 +#endif + +#ifndef MINOR +#define MINOR 0 +#endif + +#ifndef PATCH +#define PATCH 0 +#endif + +void check_arg (char* arg) { + if (arg == NULL) { + error("expected another argument after option"); + } +} + +void global_help(void (*help)(void)) { + printf("LazySphere v%d.%d.%d multi-call binary.\n\n", MAJOR, MINOR, PATCH); + help(); + exit(EXIT_SUCCESS); +} + +void parse_help(int argc, char** argv, void (*help)(void)) { + int i; + + if (argc < 1) return; + + for (i = 0; i < argc; i++) { + if (!prefix("-", argv[i]) || streql("-", argv[i])) break; + if (help != NULL && streql("--help", argv[i])) global_help(help); + } +} + +int parse_args(int argc, char** argv, void (*help)(void), int (*short_arg)(char, char*), int (*long_arg)(char*, char*)) { + int start, i, current; + char* next_arg; + + if (argc < 1) return 0; + + start = 0; + for (i = 0; i < argc; i++) { + + if (!prefix("-", argv[i]) || streql("-", argv[i])) break; + if (help != NULL && streql("--help", argv[i])) global_help(help); + + if (i + 1 == argc) { + next_arg = NULL; + } else { + next_arg = argv[i+1]; + } + + current = i; + + if (prefix("--", argv[i])) { + int r; + + if (long_arg == NULL) { + goto exit; + } + + r = long_arg(argv[current], next_arg); + + if (r == ARG_USED) { + i++; + start++; + } else if (r == ARG_IGNORE) { + goto exit; + } else if (r == ARG_INVALID) { + error("invalid argument %s", argv[current]); + + } + } else { + size_t j; + int r; + + if (short_arg == NULL) { + goto exit; + } + + for (j = 1; j < strlen(argv[current]); j++) { + + r = short_arg(argv[current][j], next_arg); + + if (r == ARG_USED) { + i++; + start++; + } else if (r == ARG_IGNORE) { + goto exit; + } else if (r == ARG_INVALID) { + error("invalid argument -%c", argv[current][j]); + } + } + } + + start++; + } + +exit: + + return start; +} diff --git a/lib/args.h b/lib/args.h new file mode 100644 index 0000000..0b89fca --- /dev/null +++ b/lib/args.h @@ -0,0 +1,18 @@ +#ifndef ARGS_H +#define ARGS_H + +#define UNUSED(x) (void)(x) +#define ARG_UNUSED 0 +#define ARG_USED 1 +#define ARG_IGNORE 2 +#define ARG_INVALID 3 + +void check_arg (char* arg); + +void global_help(void (*help)(void)); + +void parse_help (int argc, char** argv, void (*help)(void)); + +int parse_args (int argc, char** argv, void (*help)(void), int (*short_arg)(char, char*), int (*long_arg)(char*, char*)); + +#endif diff --git a/lib/buffer.c b/lib/buffer.c new file mode 100644 index 0000000..2bee94b --- /dev/null +++ b/lib/buffer.c @@ -0,0 +1,60 @@ +#include "buffer.h" +#include "convert.h" + +#include <limits.h> +#include <string.h> + +static int push_path_buffer_b(char* buf, int* index, const char* string) { + int save, string_len; + + save = *index; + if (*index > 1 || (*index == 1 && buf[0] != '/')) { + buf[(*index)++] = '/'; + } + + string_len = strlen(string); + memcpy(buf + *index, string, string_len + 1); + + *index += string_len; + + return save; +} + +static void pop_path_buffer_b(char* buf, int* index, int i) { + *index = i; + buf[*index] = '\0'; +} + +static char path_buffer[PATH_MAX + 1]; +static int path_buffer_index = 0; + +char* get_path_buffer(void) { + return path_buffer; +} + +int push_path_buffer(const char* string) { + return push_path_buffer_b(path_buffer, &path_buffer_index, string); +} + +void pop_path_buffer(int i) { + pop_path_buffer_b(path_buffer, &path_buffer_index, i); +} + +static char path_buffer_2[PATH_MAX + 1]; +static int path_buffer_index_2 = 0; + +char* get_path_buffer_2(void) { + return path_buffer_2; +} + +int push_path_buffer_2(const char* string) { + return push_path_buffer_b(path_buffer_2, &path_buffer_index_2, string); +} + +void pop_path_buffer_2(int i) { + pop_path_buffer_b(path_buffer_2, &path_buffer_index_2, i); +} + +bool is_dot_dir(const char* path) { + return streql(path, ".") || streql(path, ".."); +} diff --git a/lib/buffer.h b/lib/buffer.h new file mode 100644 index 0000000..fd47ee7 --- /dev/null +++ b/lib/buffer.h @@ -0,0 +1,16 @@ +#ifndef BUFFER_H +#define BUFFER_H + +#include "def.h" + +char* get_path_buffer(void); +int push_path_buffer(const char* string); +void pop_path_buffer(int i); + +char* get_path_buffer_2(void); +int push_path_buffer_2(const char* string); +void pop_path_buffer_2(int i); + +bool is_dot_dir(const char* path); + +#endif diff --git a/lib/convert.c b/lib/convert.c new file mode 100644 index 0000000..071268e --- /dev/null +++ b/lib/convert.c @@ -0,0 +1,126 @@ +#include "convert.h" +#include "error.h" + +#include <ctype.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> + +long int get_number(const char* text) { + char* end; + long int n = strtol(text, &end, 10); + if (text == end) { + error("%s is not a valid number", text); + } + return n; +} + +long int get_blkm(const char* text) { + char* end; + long int n = strtol(text, &end, 10); + if (text == end) { + error("%s is not a valid bkm", text); + } + if (*end == '\0') return n; + switch (*end) { + case 'K': + case 'k': + return n * 1024; + case 'B': + case 'b': + return n * 512; + case 'M': + case 'm': + return n * 1024 * 1204; + default: + error("invalid bkm type %c", *end); + } + + /* shouldnt get here anyways */ + return 0; +} + +mode_t get_mode(const char* next) { + char* end = NULL; + mode_t mode = (mode_t)strtol(next, &end, 8); + if (!end) return 0; + while(isspace(*end)) end++; + if (*end != '\0' || (unsigned) mode < 010000) { + error("invalid file mode: `%s`", next); + } + return mode; +} + +bool streql(const char* a, const char* b) { + int n = 0; + + if (*a != *b) return false; + + while (true) { + if (*(a+n) != *(b+n)) return false; + if (*(a+n) == '\0') return true; + ++n; + } +} + +bool prefix(const char* pre, const char* str) { + return strncmp(pre, str, strlen(pre)) == 0; +} + +static char fs_types[5] = {'K','M','G','T','P'}; +void print_file_size(size_t bytes, char buf[5]) { + int index, n; + float next; + + index = 0; + next = bytes; + + while (true) { + if (next < 1000) { + break; + } + + if (index == 5) { + printf("999P"); + return; + } + + next /= 1024; + index++; + } + + n = snprintf(buf, 4, "%u", (int)(next+.5)); + + if (index > 0) { + buf[n] = (fs_types[index - 1]); + n++; + } + + buf[n] = '\0'; +} + +static char* months[12] = + {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; +void print_date_time(time_t mills, char buf[13]) { + struct tm* info; + int n; + + info = localtime(&mills); + n = snprintf(buf, 5, "%s ", months[info->tm_mon]); + + if (info->tm_mday < 10) { + buf[n] = ' '; + n++; + } + + snprintf(buf + n, 13 - n, "%d %02d:%02d ", info->tm_mday, info->tm_hour, info->tm_sec); +} + +void print_file_path(char* path) { + if (streql("-", path)) { + printf("(standard input)"); + } else { + printf("%s", path); + } +} diff --git a/lib/convert.h b/lib/convert.h new file mode 100644 index 0000000..f07614b --- /dev/null +++ b/lib/convert.h @@ -0,0 +1,20 @@ +#ifndef CONVERT_H +#define CONVERT_H + +#include "def.h" + +#include <sys/stat.h> +#include <stddef.h> + +long int get_number(const char* text); +long int get_blkm(const char* text); +mode_t get_mode(const char* text); + +bool streql(const char* a, const char* b); +bool prefix(const char* pre, const char* str); + +void print_file_size(size_t bytes, char buf[5]); +void print_date_time(time_t mills, char buf[13]); +void print_file_path(char* path); + +#endif diff --git a/lib/def.h b/lib/def.h new file mode 100644 index 0000000..33a32a0 --- /dev/null +++ b/lib/def.h @@ -0,0 +1,31 @@ +#ifndef COLOR_H +#define COLOR_H + +#include <stdint.h> + +#define ANSCII "\x1b[" +#define NEXT ";" + +#define RESET "0" +#define BOLD "1" + +#define NORMAL "3" +#define BACKGROUND "4" +#define HIGHLIGHT "9" + +#define BLACK "0" +#define RED "1" +#define GREEN "2" +#define YELLOW "3" +#define BLUE "4" +#define MAGENTA "5" +#define TURQUOISE "6" +#define WHITE "7" + +#define COLOR "m" + +typedef uint8_t bool; +#define true 1 +#define false 0 + +#endif diff --git a/lib/error.c b/lib/error.c new file mode 100644 index 0000000..67828c9 --- /dev/null +++ b/lib/error.c @@ -0,0 +1,35 @@ +#include "error.h" + +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> + +extern char* cmd; + +void error_s(const char *format, ...) { + va_list list; + va_start(list, format); + + fprintf(stderr, "%s: ", cmd); + vfprintf(stderr, format, list); + fprintf(stderr, "\n"); +} + +void error(const char *format, ...) { + va_list list; + va_start(list, format); + + fprintf(stderr, "%s: ", cmd); + vfprintf(stderr, format, list); + fprintf(stderr, "\n"); + exit(EXIT_FAILURE); +} + +void output(const char *format, ...) { + va_list list; + va_start(list, format); + + fprintf(stdout, "%s: ", cmd); + vfprintf(stdout, format, list); + fprintf(stdout, "\n"); +} diff --git a/lib/error.h b/lib/error.h new file mode 100644 index 0000000..bae532e --- /dev/null +++ b/lib/error.h @@ -0,0 +1,13 @@ +#ifndef ERROR_H +#define ERROR_H + +__attribute__ ((__format__(printf, 1, 2))) +void error_s(const char* format, ...); + +__attribute__ ((__format__(printf, 1, 2))) +void error(const char* format, ...); + +__attribute__ ((__format__(printf, 1, 2))) +void output(const char* format, ...); + +#endif diff --git a/lib/file.c b/lib/file.c new file mode 100644 index 0000000..f89b489 --- /dev/null +++ b/lib/file.c @@ -0,0 +1,63 @@ +#include "file.h" +#include "error.h" +#include "convert.h" + +#include <paths.h> +#include <errno.h> +#include <stdlib.h> +#include <string.h> +#include <sys/stat.h> +#include <fcntl.h> + +FILE* get_file_s(const char* path, const char* type) { + struct stat s; + FILE* file; + + if (streql("-", path) && type[0] == 'r') { + clearerr(stdin); + fflush(stdin); + return stdin; + } + + if (lstat(path, &s) < 0) { + if (type[0] != 'r') goto read; + error_s("failed to read %s: %s", path, strerror(errno)); + return NULL; + } + + if (S_ISDIR(s.st_mode)) { + error_s("%s is a directory", path); + return NULL; + } + +read: + + file = fopen(path, type); + + if (file == NULL) { + error_s("failed to %s file %s: %s", type[0] == 'r' ? "read" : "write", path, strerror(errno)); + } + + return file; +} + +FILE* get_file(const char* path, const char* type) { + FILE* file = get_file_s(path, type); + if (file == NULL) exit(EXIT_FAILURE); + return file; +} + +int get_tty (void) { + int fd = open(_PATH_TTY, O_RDONLY); + if (fd < 0) error("failed to get tty: %s", strerror(errno)); + return fd; +} + +FILE* get_tty_stream(char* type) { + int fd = get_tty(); + FILE* file = fdopen(fd, type); + if (file == NULL) { + error("failed to open tty stream: %s", strerror(errno)); + } + return file; +} diff --git a/lib/file.h b/lib/file.h new file mode 100644 index 0000000..0bb5939 --- /dev/null +++ b/lib/file.h @@ -0,0 +1,14 @@ +#ifndef FILE_H +#define FILE_H + +#include <stdio.h> + +FILE* get_file_s(const char* path, const char* type); + +FILE* get_file(const char* path, const char* type); + +int get_tty(void); + +FILE* get_tty_stream(char* type); + +#endif diff --git a/lib/lslib.h b/lib/lslib.h new file mode 100644 index 0000000..dfa1202 --- /dev/null +++ b/lib/lslib.h @@ -0,0 +1,16 @@ +#ifndef SHARED_H +#define SHARED_H + +#include <stdint.h> +#include <stdio.h> + +#include "args.h" +#include "buffer.h" +#include "def.h" +#include "convert.h" +#include "error.h" +#include "file.h" +#include "regex.h" +#include "stack.h" + +#endif diff --git a/src/util/regex.c b/lib/regex.c index 0e0dc52..0e0dc52 100644 --- a/src/util/regex.c +++ b/lib/regex.c diff --git a/src/util/regex.h b/lib/regex.h index 69facc6..d4c61b6 100644 --- a/src/util/regex.h +++ b/lib/regex.h @@ -36,16 +36,9 @@ #define RE_DOT_MATCHES_NEWLINE 1 #endif -#ifdef __cplusplus -extern "C"{ -#endif - - - /* Typedef'd pointer to get abstract datatype. */ typedef struct regex_t* re_t; - /* Compile regex string pattern to a regex_t-array. */ re_t re_compile(const char* pattern); @@ -58,8 +51,4 @@ int re_matchp(re_t pattern, const char* text, int* matchlength); int re_match(const char* pattern, const char* text, int* matchlength); -#ifdef __cplusplus -} -#endif - #endif /* ifndef _TINY_REGEX_C */ diff --git a/src/util/stack.c b/lib/stack.c index acffc1a..acffc1a 100644 --- a/src/util/stack.c +++ b/lib/stack.c diff --git a/src/util/stack.h b/lib/stack.h index 8d6fc80..38fb185 100644 --- a/src/util/stack.h +++ b/lib/stack.h @@ -1,7 +1,7 @@ #ifndef STACK_H #define STACK_H -#include "shared.h" +#include "def.h" #include <stddef.h> |