f0x.at1/stm32l4a6zg-f0x.at1/Core/Src/helper.c

159 lines
3.2 KiB
C

/*
* helper.c
*
* Created on: Jul 14, 2022
* Author: tom
*/
#include <string.h>
#include <ctype.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h> /* sscanf */
#include <at1_defines.h> /* include my defines from a global view, else */
#ifndef DATE_COMPILE_CENTURY
#define DATE_COMPILE_CENTURY (20)
#define DATE_COMPILE_YEAR (24)
#endif
#if !defined _SYS_ERRNO_H_ && !defined __ERRNO_H__ && !defined __AT1_ERROR_NUMBERS__
#include <errno.h>
#endif
/* do not use the #include <time.h> library */
#include "helper.h"
#include <errno.h>
char *ltrim(char *s)
{
while(isspace((int)*s)) s++;
return s;
}
char *rtrim(char *s)
{
char* back = s + strlen(s);
while(isspace((int)*--back));
*(back+1) = '\0';
return s;
}
char *trim(char *s)
{
return rtrim(ltrim(s));
}
/* string to uint32_t */
int strtouint32 (char *s, uint32_t * uint32) {
int rv = 0;
*uint32 = strtoul(s, &s, 10);
if (errno != 0)
return errno;
return rv;
}
/* this is ISO 8601 2018-12-31 with separator == '-' */
int strtotime (char *s, struct _tm_ *tp) {
int rv = 0;
uint32_t tmp;
struct _tm_ tm = {0};
do {
/* Check for the day and/or year */
tmp = strtoul(s, &s, 10); /* base 10 */
/* Check of plausibility: Year must be within compilation year and max 10 centuries from now on, i.e. 3000 */
if (tmp >= (DATE_COMPILE_CENTURY * 100 + DATE_COMPILE_YEAR) && tmp < ((DATE_COMPILE_CENTURY + 10) * 100)) {
tm.year = (uint8_t)(tmp % 100UL);
} else {
rv = -EINVAL;
break;
}
rv = sscanf(s, "-%hu-%hu %hu:%hu:%hu", &tm.mon, &tm.day, &tm.hour, &tm.min, &tm.sec);
if (rv >= 3)
*tp = tm;
else
rv = -EINVAL;
} while(0);
return rv;
}
#if 0
while (*str == ' ') {
str++;
};
*args = str;
return CMD_OK;
} else {
separator = '/';
if (tmp > 0 && tmp < 32)
timeinfo.tm_mday = tmp;
else
goto error;
}
str++;
/* Read the month */
tmp = strtoul(str, &str, 10);
if (*str != separator || tmp == 0 || tmp > 12)
goto error;
timeinfo.tm_mon = tmp - 1; /* the month is interpreted from 0..11 */
str++;
/* Check either the day or the four-digit year */
tmp = strtoul(str, &str, 10);
/* there should either spaces or a T between date and time info */
if ((toupper(*str) != 'T' && *str != ' ') || tmp == 0 || tmp >= 2106)
goto error;
if (separator == '-') {
timeinfo.tm_mday = tmp;
} else if (tmp >= FW_VERSION_YEAR) {
timeinfo.tm_year = tmp - 1900;
} else {
goto error;
}
do {
str++;
} while (*str == ' ');
/* the hour have to be 0..23 */
tmp = strtoul(str, &str, 10);
if (*str != ':' || tmp > 23)
goto error;
timeinfo.tm_hour = tmp;
str++;
/* the minute have to be 0..59 */
tmp = strtoul(str, &str, 10);
if (tmp > 59)
goto error;
timeinfo.tm_min = tmp;
if (*str == ':') {
str++;
tmp = strtoul(str, &str, 10);
} else {
tmp = 0;
}
if (tmp > 59)
goto error;
timeinfo.tm_sec = tmp;
while (*str == ' ')
str++;
if (*str != '\0' && (flags & ARG_LAST))
goto error;
/* Try to create the time stamp */
{
time_t tmp_unixtime = mktime(&timeinfo);
if (tmp_unixtime == (unsigned)-1) {
goto error;
}
*args = str;
*unixtime = tmp_unixtime;
}
return CMD_OK;
error:
*args = str;
return CMD_ERROR_PARAMETERS;
}
#endif