diff --git a/qse/include/qse/cmn/opt.h b/qse/include/qse/cmn/opt.h index 82e1ded2..98013236 100644 --- a/qse/include/qse/cmn/opt.h +++ b/qse/include/qse/cmn/opt.h @@ -69,11 +69,15 @@ struct qse_opt_t #define QSE_CLI_OPTNAME (1 << 0) #define QSE_CLI_OPTVAL (1 << 1) -#define QSE_CLI_ERROR_INVALID_OPTNAME 1 -#define QSE_CLI_ERROR_MISSING_OPTNAME 2 -#define QSE_CLI_ERROR_REDUNDANT_OPTVAL 3 -#define QSE_CLI_ERROR_MISSING_OPTVAL 4 -#define QSE_CLI_ERROR_MEMORY 5 +enum qse_cli_error_code_t +{ + QSE_CLI_ERROR_INVALID_OPTNAME = 1, + QSE_CLI_ERROR_MISSING_OPTNAME = 2, + QSE_CLI_ERROR_REDUNDANT_OPTVAL = 3, + QSE_CLI_ERROR_MISSING_OPTVAL = 4, + QSE_CLI_ERROR_MEMORY = 5 +}; +typedef enum qse_cli_error_code_t qse_cli_error_code_t; typedef struct qse_cli_opt_t qse_cli_opt_t; typedef struct qse_cli_t qse_cli_t; @@ -89,10 +93,10 @@ struct qse_cli_opt_t }; typedef int (*qse_cli_errcb_t) ( - qse_cli_t* cli, - int code, - const qse_char_t* qname, - const qse_char_t* qval + qse_cli_t* cli, + qse_cli_error_code_t code, + const qse_char_t* qname, + const qse_char_t* qval ); struct qse_cli_data_t diff --git a/qse/include/qse/cmn/time.h b/qse/include/qse/cmn/time.h index 28a75fca..79c320f4 100644 --- a/qse/include/qse/cmn/time.h +++ b/qse/include/qse/cmn/time.h @@ -221,6 +221,28 @@ QSE_EXPORT void qse_subtime ( qse_ntime_t* z ); + +/** + * The qse_strtontime() function converts a numeric text to the numeric time. + * seconds.nanoseconds + * 10.231 + */ +QSE_EXPORT int qse_mbs_to_ntime ( + const qse_mchar_t* text, + qse_ntime_t* ntime +); + +QSE_EXPORT int qse_wcs_to_ntime ( + const qse_wchar_t* text, + qse_ntime_t* ntime +); + +#if defined(QSE_CHAR_IS_MCHAR) +# define qse_str_to_ntime(text,ntime) qse_mbs_to_ntime(text,ntime) +#else +# define qse_str_to_ntime(text,ntime) qse_wcs_to_ntime(text,ntime) +#endif + #if defined(__cplusplus) } #endif diff --git a/qse/lib/cmn/time.c b/qse/lib/cmn/time.c index 98a26f35..cd964c91 100644 --- a/qse/lib/cmn/time.c +++ b/qse/lib/cmn/time.c @@ -25,6 +25,8 @@ */ #include + +#include #include "mem-prv.h" #if defined(_WIN32) @@ -613,3 +615,103 @@ void qse_subtime (const qse_ntime_t* x, const qse_ntime_t* y, qse_ntime_t* z) z->nsec = z->nsec + QSE_NSECS_PER_SEC; } } + + + +int qse_mbs_to_ntime (const qse_mchar_t* text, qse_ntime_t* ntime) +{ + const qse_mchar_t* p = text, * cp; + qse_ntime_t tv = { 0, 0 }; + int neg = 0; + + if (*p == QSE_MT('-')) + { + neg = 1; + p++; + } + else if (*p == QSE_MT('+')) + { + p++; + } + + cp = p; + while (QSE_ISMDIGIT(*p)) + { + qse_long_t oldsec = tv.sec; + tv.sec = tv.sec * 10 + (*p - QSE_MT('0')); + if (tv.sec < oldsec) return -1; /* overflow? */ + p++; + } + if (cp == p) return -1; + + if (*p == QSE_MT('.')) + { + qse_int32_t base = QSE_SEC_TO_NSEC(1); /* 1000000000 */ + + p++; + base /= 10; /* the max value is 999999999. 9 digits ony */ + + while (*p && QSE_ISMDIGIT(*p) && base > 0) + { + tv.nsec += (*p - QSE_MT('0')) * base; + base /= 10; + p++; + } + } + + if (*p != QSE_MT('\0')) return -1; + + if (neg) tv.sec *= -1; + *ntime = tv; + + return 0; +} + +int qse_wcs_to_ntime (const qse_wchar_t* text, qse_ntime_t* ntime) +{ + const qse_wchar_t* p = text, * cp; + qse_ntime_t tv = { 0, 0 }; + int neg = 0; + + if (*p == QSE_WT('-')) + { + neg = 1; + p++; + } + else if (*p == QSE_WT('+')) + { + p++; + } + + cp = p; + while (QSE_ISWDIGIT(*p)) + { + qse_long_t oldsec = tv.sec; + tv.sec = tv.sec * 10 + (*p - QSE_WT('0')); + if (tv.sec < oldsec) return -1; /* overflow? */ + p++; + } + if (cp == p) return -1; + + if (*p == QSE_WT('.')) + { + qse_int32_t base = QSE_SEC_TO_NSEC(1); /* 1000000000 */ + + p++; + base /= 10; /* the max value is 999999999. 9 digits ony */ + + while (*p && QSE_ISWDIGIT(*p) && base > 0) + { + tv.nsec += (*p - QSE_WT('0')) * base; + base /= 10; + p++; + } + } + + if (*p != QSE_WT('\0')) return -1; + + if (neg) tv.sec *= -1; + *ntime = tv; + + return 0; +}