116 lines
3.2 KiB
C
116 lines
3.2 KiB
C
|
|
#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;
|
||
|
|
}
|