archeus/src/std/string.c

116 lines
3.2 KiB
C
Raw Normal View History

2022-10-27 15:16:54 -06:00
#include "arc/std/string.h"
#include "arc/std/errno.h"
#include <string.h>
#include <stdlib.h>
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;
}