mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-01-18 16:27:34 +01:00
152 lines
3.3 KiB
C++
152 lines
3.3 KiB
C++
#include "utility.h"
|
|
|
|
#include <string.h>
|
|
|
|
#ifndef DEVICE
|
|
#include <stdio.h>
|
|
#include <dirent.h>
|
|
#include <sys/stat.h>
|
|
#endif
|
|
|
|
namespace Reader
|
|
{
|
|
|
|
bool stringEndsWith(const char* str, const char* pattern) {
|
|
int strLength = strlen(str);
|
|
int patternLength = strlen(pattern);
|
|
if (patternLength > strLength) {
|
|
return false;
|
|
}
|
|
|
|
const char* strIter = str + strlen(str);
|
|
const char* patternIter = pattern + strlen(pattern);
|
|
|
|
while(*strIter == *patternIter) {
|
|
if(patternIter == pattern) {
|
|
return true;
|
|
}
|
|
strIter--;
|
|
patternIter--;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void stringNCopy(char* dest, int max, const char* src, int len) {
|
|
while(len>0 && max >1 && *src)
|
|
{
|
|
*dest = *src;
|
|
dest++;
|
|
src++;
|
|
len--;
|
|
max--;
|
|
}
|
|
*dest=0;
|
|
}
|
|
|
|
|
|
#ifdef DEVICE
|
|
|
|
int filesWithExtension(const char* extension, External::Archive::File* files, int filesSize) {
|
|
size_t nbTotalFiles = External::Archive::numberOfFiles();
|
|
int nbFiles = 0;
|
|
for(size_t i=0; i < nbTotalFiles; ++i) {
|
|
External::Archive::File file;
|
|
External::Archive::fileAtIndex(i, file);
|
|
if(stringEndsWith(file.name, extension)) {
|
|
files[nbFiles] = file;
|
|
nbFiles++;
|
|
if(nbFiles == filesSize)
|
|
break;
|
|
}
|
|
}
|
|
return nbFiles;
|
|
}
|
|
#else
|
|
|
|
static void fillFileData(External::Archive::File& file) {
|
|
file.data = nullptr;
|
|
file.dataLength = 0;
|
|
|
|
struct stat info;
|
|
if (stat(file.name, &info) != 0) {
|
|
return;
|
|
}
|
|
|
|
unsigned char* content = new unsigned char[info.st_size];
|
|
if (content == NULL) {
|
|
return;
|
|
}
|
|
FILE *fp = fopen(file.name, "rb");
|
|
if (fp == NULL) {
|
|
return ;
|
|
}
|
|
|
|
fread(content, info.st_size, 1, fp);
|
|
fclose(fp);
|
|
file.data = content;
|
|
file.dataLength = info.st_size;
|
|
}
|
|
|
|
int filesWithExtension(const char* extension, External::Archive::File* files, int filesSize) {
|
|
dirent *file;
|
|
DIR *d = opendir(".");
|
|
int nb = 0;
|
|
if (d) {
|
|
while ((file = readdir(d)) != NULL) {
|
|
if(stringEndsWith(file->d_name, extension)) {
|
|
files[nb].name = strdup(file->d_name);//will probably leak
|
|
fillFileData(files[nb]);
|
|
nb++;
|
|
if(nb == filesSize) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
closedir(d);
|
|
}
|
|
return nb;
|
|
}
|
|
#endif
|
|
|
|
const char * EndOfPrintableWord(const char * word, const char * end) {
|
|
if (word >= end) {
|
|
return word;
|
|
}
|
|
UTF8Decoder decoder(word);
|
|
CodePoint codePoint = decoder.nextCodePoint();
|
|
const char * result = word;
|
|
while (codePoint != '\n' && codePoint != ' ' && codePoint != '%' && codePoint != '$' && codePoint != '\\') {
|
|
result = decoder.stringPosition();
|
|
if (result >= end) {
|
|
break;
|
|
}
|
|
codePoint = decoder.nextCodePoint();
|
|
}
|
|
return result;
|
|
}
|
|
|
|
const char * StartOfPrintableWord(const char * word, const char * start) {
|
|
if (word <= start) {
|
|
return word;
|
|
}
|
|
// Go to start of code point with some code points dark magic
|
|
if (!((*word & 0x80) == 0)) {
|
|
word--;
|
|
while (!(*word & 0x80 && *word & 0x40)) {
|
|
word--;
|
|
}
|
|
}
|
|
UTF8Decoder decoder(start, word);
|
|
CodePoint codePoint = decoder.previousCodePoint();
|
|
const char * result = word;
|
|
while (codePoint != '\n' && codePoint != ' ' && codePoint != '%' && codePoint != '$') {
|
|
result = decoder.stringPosition();
|
|
if (result <= start) {
|
|
break;
|
|
}
|
|
codePoint = decoder.previousCodePoint();
|
|
}
|
|
return result;
|
|
}
|
|
|
|
} |