164 lines
3.5 KiB
C
164 lines
3.5 KiB
C
#include "include/conf.h"
|
|
|
|
#include <time.h>
|
|
#include <ctype.h>
|
|
|
|
#include <stdio.h>
|
|
#include <errno.h>
|
|
#include <string.h>
|
|
#include <stdarg.h>
|
|
|
|
#include "include/def.h"
|
|
|
|
static inline void sh_print_timestamp(void) {
|
|
time_t now = time(NULL);
|
|
struct tm *tm_now = localtime(&now);
|
|
|
|
if (tm_now == NULL) {
|
|
(void)fputs("0000-00-00 00:00:00 | ", stderr);
|
|
return;
|
|
}
|
|
|
|
char buf[32] = {0}; /* YYYY-MM-DD HH:MM:SS */
|
|
(void)strftime(buf, sizeof(buf), "%F %T", tm_now);
|
|
(void)fputs(buf, stderr);
|
|
(void)fputs(" | ", stderr);
|
|
}
|
|
|
|
void sh_print_error(const char *msg) {
|
|
sh_print_timestamp();
|
|
(void)fputs("Error: ", stderr);
|
|
(void)fputs(msg, stderr);
|
|
(void)fputc('\n', stderr);
|
|
}
|
|
|
|
void sh_print_errorf(const char *fmt, ...) {
|
|
va_list args;
|
|
sh_print_timestamp();
|
|
(void)fprintf(stderr, "Error: ");
|
|
va_start(args, fmt);
|
|
(void)vfprintf(stderr, fmt, args);
|
|
va_end(args);
|
|
(void)fputc('\n', stderr);
|
|
}
|
|
|
|
void sh_print_warn(const char *msg) {
|
|
sh_print_timestamp();
|
|
(void)fputs("Warning: ", stderr);
|
|
(void)fputs(msg, stderr);
|
|
(void)fputc('\n', stderr);
|
|
}
|
|
|
|
void sh_print_warnf(const char *fmt, ...) {
|
|
va_list args;
|
|
sh_print_timestamp();
|
|
(void)fprintf(stderr, "Warning: ");
|
|
va_start(args, fmt);
|
|
(void)vfprintf(stderr, fmt, args);
|
|
va_end(args);
|
|
(void)fputc('\n', stderr);
|
|
}
|
|
|
|
void sh_print_info(const char *msg) {
|
|
sh_print_timestamp();
|
|
(void)fputs("Info: ", stderr);
|
|
(void)fputs(msg, stderr);
|
|
(void)fputc('\n', stderr);
|
|
}
|
|
|
|
void sh_print_infof(const char *fmt, ...) {
|
|
va_list args;
|
|
sh_print_timestamp();
|
|
(void)fprintf(stderr, "Info: ");
|
|
va_start(args, fmt);
|
|
(void)vfprintf(stderr, fmt, args);
|
|
va_end(args);
|
|
(void)fputc('\n', stderr);
|
|
}
|
|
|
|
void sh_print_perror(const char *msg) {
|
|
sh_print_timestamp();
|
|
perror(msg);
|
|
}
|
|
|
|
void sh_print_perrorf(const char *fmt, ...) {
|
|
va_list args;
|
|
const int errnum = errno;
|
|
sh_print_timestamp();
|
|
(void)fprintf(stderr, "Error: ");
|
|
va_start(args, fmt);
|
|
(void)vfprintf(stderr, fmt, args);
|
|
va_end(args);
|
|
(void)fprintf(stderr, ": %s (errno %d)\n", strerror(errnum), errnum);
|
|
}
|
|
|
|
char *sh_strndup(const char *src, size_t length) {
|
|
if (!src) {
|
|
return NULL;
|
|
}
|
|
char *duplicate_str = SH_MALLOC(length + 1);
|
|
if (duplicate_str) {
|
|
memcpy(duplicate_str, src, length + 1);
|
|
}
|
|
return duplicate_str;
|
|
}
|
|
|
|
bool sh_str_lstrip(const char **ptr) {
|
|
if (!ptr || !*ptr) {
|
|
return false;
|
|
}
|
|
|
|
const char *cur = *ptr;
|
|
while (*cur == ' ' || *cur == '\t') {
|
|
++cur;
|
|
}
|
|
*ptr = cur;
|
|
|
|
return true;
|
|
}
|
|
|
|
bool sh_is_valid_identifier(const char *str, size_t length) {
|
|
if (!str || !*str || length == 0) {
|
|
return false;
|
|
}
|
|
|
|
for (size_t idx = 0; idx < length && str[idx]; ++idx) {
|
|
if (!isalnum((unsigned char)str[idx]) && str[idx] != '_') {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool sh_is_lowstr(const char *str) {
|
|
if (!str) {
|
|
return false;
|
|
}
|
|
|
|
for (const char *ptr = str; ptr < str; ++ptr) {
|
|
if (!islower(*ptr)) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
const char *sh_strnchr(const char *str, char chr, size_t length) {
|
|
if (!str || length == 0) {
|
|
return NULL;
|
|
}
|
|
|
|
for (size_t idx = 0; idx < length; ++idx) {
|
|
if (str[idx] == chr) {
|
|
return &str[idx];
|
|
}
|
|
|
|
if (str[idx] == '\0') {
|
|
break;
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|