Centralize/simplify file-reading.
Handle comments at the token level.
This commit is contained in:
parent
f458b52a17
commit
04b7e7b64a
|
@ -589,6 +589,31 @@ Object typeCheck(const char* funcName, Object* params, int length,
|
||||||
|
|
||||||
#ifdef STANDALONE
|
#ifdef STANDALONE
|
||||||
|
|
||||||
|
char* readFileToString(FILE* input)
|
||||||
|
{
|
||||||
|
size_t capacity = 128;
|
||||||
|
char* string = malloc(sizeof(char) * (capacity + 1));
|
||||||
|
string[0] = 1; // Set refCount
|
||||||
|
|
||||||
|
int c;
|
||||||
|
int i = 1; // Skip refCount
|
||||||
|
|
||||||
|
while ((c = fgetc(input)) != EOF) {
|
||||||
|
string[i] = c;
|
||||||
|
i++;
|
||||||
|
if (i == capacity) {
|
||||||
|
char* prev = string;
|
||||||
|
capacity *= 2;
|
||||||
|
string = malloc(sizeof(char) * capacity);
|
||||||
|
memcpy(string, prev, sizeof(char) * (capacity / 2));
|
||||||
|
free(prev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
string[i] = '\0';
|
||||||
|
|
||||||
|
return string + 1; // Offset past refCount
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns 1 if the file could not be opened. Otherwise, 0
|
/// Returns 1 if the file could not be opened. Otherwise, 0
|
||||||
int readFile(const char* filename, struct Environment* env)
|
int readFile(const char* filename, struct Environment* env)
|
||||||
{
|
{
|
||||||
|
@ -602,43 +627,11 @@ int readFile(const char* filename, struct Environment* env)
|
||||||
|
|
||||||
int _readFile(FILE* input, struct Environment* env)
|
int _readFile(FILE* input, struct Environment* env)
|
||||||
{
|
{
|
||||||
Object r = numberObject(0);
|
char* fileText = readFileToString(input);
|
||||||
char page[4096] = "";
|
fclose(input);
|
||||||
const int LINE_MAX = 256;
|
Object r = parseEval(fileText, env);
|
||||||
char line[LINE_MAX];
|
|
||||||
if (fgets(line, LINE_MAX, input)) {
|
|
||||||
if (line[0] != '#' || line[1] != '!') {
|
|
||||||
strcat(page, line);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
int isQuote = 0;
|
|
||||||
while (fgets(line, LINE_MAX, input)) {
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < LINE_MAX; i++) {
|
|
||||||
if (line[i] != ' ') {
|
|
||||||
if (line[i] == ';') {
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
int j;
|
|
||||||
for (j = i; j < LINE_MAX; j++) {
|
|
||||||
if (line[j] == '"') {
|
|
||||||
isQuote = !isQuote;
|
|
||||||
} else if (line[j] == '\0' || (!isQuote && line[j] == ';')) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
strncat(page, line, j);
|
|
||||||
strcat(page, " ");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
r = parseEval(page, env);
|
|
||||||
cleanObject(&r);
|
cleanObject(&r);
|
||||||
|
|
||||||
fclose(input);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -102,6 +102,8 @@ if (FAILED) { \
|
||||||
|
|
||||||
#ifdef STANDALONE
|
#ifdef STANDALONE
|
||||||
|
|
||||||
|
char* readFileToString(FILE* input);
|
||||||
|
|
||||||
int _readFile(FILE* input, struct Environment* env);
|
int _readFile(FILE* input, struct Environment* env);
|
||||||
|
|
||||||
int readFile(const char* filename, struct Environment* env);
|
int readFile(const char* filename, struct Environment* env);
|
||||||
|
|
24
src/plfunc.c
24
src/plfunc.c
|
@ -518,30 +518,6 @@ Object systemCall(Object* params, unused int length, unused struct Environment*
|
||||||
return numberObject(255);
|
return numberObject(255);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* readFileToString(FILE* input)
|
|
||||||
{
|
|
||||||
size_t capacity = 128;
|
|
||||||
char* string = malloc(sizeof(char) * capacity);
|
|
||||||
int c;
|
|
||||||
int i = 1; // Skip refCount
|
|
||||||
|
|
||||||
string[0] = 1; // Set refCount
|
|
||||||
while ((c = fgetc(input)) != EOF) {
|
|
||||||
string[i] = c;
|
|
||||||
i++;
|
|
||||||
if (i == capacity) {
|
|
||||||
char* prev = string;
|
|
||||||
capacity *= 2;
|
|
||||||
string = malloc(sizeof(char) * capacity);
|
|
||||||
memcpy(string, prev, sizeof(char) * (capacity / 2));
|
|
||||||
free(prev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
string[i] = '\0';
|
|
||||||
|
|
||||||
return string + 1; // Offset past refCount
|
|
||||||
}
|
|
||||||
|
|
||||||
Object readFileToObject(Object* params, unused int length, unused struct Environment* env)
|
Object readFileToObject(Object* params, unused int length, unused struct Environment* env)
|
||||||
{
|
{
|
||||||
checkTypes(readFileToObject)
|
checkTypes(readFileToObject)
|
||||||
|
|
|
@ -88,6 +88,11 @@ struct Slice* nf_tokenize(const char* input, struct Error* err)
|
||||||
|
|
||||||
if (isSingle(input[i])) {
|
if (isSingle(input[i])) {
|
||||||
i++;
|
i++;
|
||||||
|
} else if (input[i] == ';') {
|
||||||
|
while (input[i] && input[i] != '\n') {
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
} else if (input[i] == '"') {
|
} else if (input[i] == '"') {
|
||||||
if (input[i + 1] == '"' && input[i + 2] == '"') {
|
if (input[i + 1] == '"' && input[i + 2] == '"') {
|
||||||
// Triple-quoted block
|
// Triple-quoted block
|
||||||
|
|
Loading…
Reference in New Issue