#include "arc/std/string.h" #include "arc/std/errno.h" #include #include uint8_t ARC_String_Alpha(char *val, uint64_t length){ for(; length; length--){ if(val[length - 1] >= 'a' && val[length - 1] <= 'z'){ continue; } if(val[length - 1] >= 'A' && val[length - 1] <= 'Z'){ continue; } return 1; } return 0; } uint64_t ARC_String_ToUint64_t(const char *data, ARC_StringSubstr *substr){ char temp[substr->length + 1]; strncpy(temp, data + substr->index, substr->length); temp[substr->length] = '\0'; return (uint64_t) strtoul(temp, NULL, 10); } int32_t ARC_String_Find(char *data, char *substr, uint64_t *index){ if(!data || !substr){ return ARC_ERRNO_NULL; } uint64_t max = strlen(data); uint64_t sub = strlen(substr); if(!max || !sub || sub > max){ return ARC_ERRNO_DATA; } max -= sub - 1; for(uint64_t i = 0; max; i++, max--){ if(!strncmp(data + i, substr, sub)){ *index = i; return 0; } } *index = ~((uint64_t)0); return 0; } int32_t ARC_String_FindBack(char *data, char *substr, uint64_t *index){ if(!data || !substr){ return ARC_ERRNO_NULL; } uint64_t max = strlen(data); uint64_t sub = strlen(substr); if(!max || !sub || sub > max){ return ARC_ERRNO_DATA; } max -= sub - 1; for(; max; max--){ if(!strncmp(data + (max - 1), substr, sub)){ *index = max; return 0; } } *index = ~((uint64_t)0); return 0; } int32_t ARC_StringSubstr_StripEnds(char *data, char *substr, ARC_StringSubstr *subdata){ if(!subdata){ return ARC_ERRNO_NULL; } if(!substr){ substr = (char *)" "; } subdata->length = (subdata->length)? subdata->length : strlen(data); uint64_t max = subdata->length; uint64_t sub = strlen(substr); if(!max || !sub || sub > max){ return ARC_ERRNO_DATA; } max -= sub - 1; for(; max; max--){ if(strncmp(data + subdata->index + (max - 1), substr, sub)){ subdata->length = max; break; } } max = subdata->length - (sub - 1); for(uint64_t i = 0; max; i++, max--){ if(strncmp(data + subdata->index + i, substr, sub)){ subdata->index += i; subdata->length -= i; return 0; } } return 0; } int32_t ARC_StringSubstr_StripWhitespaceEnds(char *data, ARC_StringSubstr *subdata){ if(!subdata){ return ARC_ERRNO_NULL; } subdata->length = (subdata->length)? subdata->length : strlen(data); uint64_t max = subdata->length; if(!max){ return ARC_ERRNO_DATA; } for(; max; max--){ if(data[subdata->index + (max - 1)] != ' ' && data[subdata->index + (max - 1)] != '\n' && data[subdata->index + (max - 1)] != '\t' && data[subdata->index + (max - 1)] != '\r'){ subdata->length = max; break; } } max = subdata->length; for(uint64_t i = 0; max; i++, max--){ if(data[subdata->index + i] != ' ' && data[subdata->index + i] != '\n' && data[subdata->index + i] != '\t' && data[subdata->index + i] != '\r'){ subdata->index += i; subdata->length -= i; return 0; } } return 0; }