locfile.h -> locfile.h + locfile.c
clean up includes of a few files
This commit is contained in:
1 parent
7fb5d8c973
commit
40378a18f7
5 files changed
+75
-61
No files matched your search
+1
-1
@@ -5,7 +5,7 @@ JQ_INCS = jq_parser.h builtin.h bytecode.h compile.h execute.h \
|
|||||||
jv_parse.h jv_unicode.h locfile.h opcode.h opcode_list.h parser.y \
|
jv_parse.h jv_unicode.h locfile.h opcode.h opcode_list.h parser.y \
|
||||||
jv_utf8_tables.h lexer.l
|
jv_utf8_tables.h lexer.l
|
||||||
|
|
||||||
JQ_SRC = opcode.c bytecode.c compile.c execute.c builtin.c jv.c \
|
JQ_SRC = locfile.c opcode.c bytecode.c compile.c execute.c builtin.c jv.c \
|
||||||
jv_parse.c jv_print.c jv_dtoa.c jv_unicode.c jv_aux.c jv_alloc.c \
|
jv_parse.c jv_print.c jv_dtoa.c jv_unicode.c jv_aux.c jv_alloc.c \
|
||||||
jq_test.c ${JQ_INCS}
|
jq_test.c ${JQ_INCS}
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "builtin.h"
|
#include "builtin.h"
|
||||||
#include "compile.h"
|
#include "compile.h"
|
||||||
|
|||||||
@@ -0,0 +1,68 @@
|
|||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include "jv_alloc.h"
|
||||||
|
#include "locfile.h"
|
||||||
|
|
||||||
|
|
||||||
|
void locfile_init(struct locfile* l, const char* data, int length) {
|
||||||
|
l->data = data;
|
||||||
|
l->length = length;
|
||||||
|
l->nlines = 1;
|
||||||
|
for (int i=0; i<length; i++) {
|
||||||
|
if (data[i] == '\n') l->nlines++;
|
||||||
|
}
|
||||||
|
l->linemap = jv_mem_alloc(sizeof(int) * (l->nlines + 1));
|
||||||
|
l->linemap[0] = 0;
|
||||||
|
int line = 1;
|
||||||
|
for (int i=0; i<length; i++) {
|
||||||
|
if (data[i] == '\n') {
|
||||||
|
l->linemap[line] = i;
|
||||||
|
line++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
l->linemap[l->nlines] = length;
|
||||||
|
}
|
||||||
|
|
||||||
|
void locfile_free(struct locfile* l) {
|
||||||
|
jv_mem_free(l->linemap);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int locfile_get_line(struct locfile* l, int pos) {
|
||||||
|
assert(pos < l->length);
|
||||||
|
int line = 0;
|
||||||
|
while (l->linemap[line+1] < pos) line++;
|
||||||
|
assert(line < l->nlines);
|
||||||
|
return line;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int locfile_line_length(struct locfile* l, int line) {
|
||||||
|
assert(line < l->nlines);
|
||||||
|
return l->linemap[line+1] - l->linemap[line];
|
||||||
|
}
|
||||||
|
|
||||||
|
void locfile_locate(struct locfile* l, location loc, const char* fmt, ...) {
|
||||||
|
va_list fmtargs;
|
||||||
|
va_start(fmtargs, fmt);
|
||||||
|
vfprintf(stderr, fmt, fmtargs);
|
||||||
|
va_end(fmtargs);
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
if (loc.start == -1) {
|
||||||
|
fprintf(stderr, "<unknown location>\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int startline = locfile_get_line(l, loc.start);
|
||||||
|
int offset = l->linemap[startline];
|
||||||
|
fprintf(stderr, "HERE1\n%.*s\n", locfile_line_length(l, startline)-(startline!=0), l->data + offset +(startline!=0)); // if not first line, this starts at the '\n' in l
|
||||||
|
fprintf(stderr, "HERE2\n%*s", loc.start - offset -(startline!=0), ""); // space padding. If not first line, offset is the '\n' at beginning of line, and one too many
|
||||||
|
/* ASIDE: because all this code is in locfile.h instead of locfile.c, it recompiles everything, and takes forever */
|
||||||
|
/* I've separated it out, into locfile.h; removed static */
|
||||||
|
/* Problem: a few files include locfile.h to get the *.h it includes... this seems bad to me */
|
||||||
|
for (int i = loc.start;
|
||||||
|
i < loc.end && i < offset + locfile_line_length(l, startline);
|
||||||
|
i++){
|
||||||
|
fprintf(stderr, "^");
|
||||||
|
}
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
}
|
||||||
@@ -1,10 +1,6 @@
|
|||||||
#ifndef _LOCFILE_H
|
#ifndef _LOCFILE_H
|
||||||
#define _LOCFILE_H
|
#define _LOCFILE_H
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include "jv_alloc.h"
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int start, end;
|
int start, end;
|
||||||
} location;
|
} location;
|
||||||
@@ -18,62 +14,10 @@ struct locfile {
|
|||||||
int nlines;
|
int nlines;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void locfile_init(struct locfile* l, const char* data, int length) {
|
void locfile_init(struct locfile* l, const char* data, int length);
|
||||||
l->data = data;
|
|
||||||
l->length = length;
|
|
||||||
l->nlines = 1;
|
|
||||||
for (int i=0; i<length; i++) {
|
|
||||||
if (data[i] == '\n') l->nlines++;
|
|
||||||
}
|
|
||||||
l->linemap = jv_mem_alloc(sizeof(int) * (l->nlines + 1));
|
|
||||||
l->linemap[0] = 0;
|
|
||||||
int line = 1;
|
|
||||||
for (int i=0; i<length; i++) {
|
|
||||||
if (data[i] == '\n') {
|
|
||||||
l->linemap[line] = i;
|
|
||||||
line++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
l->linemap[l->nlines] = length;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void locfile_free(struct locfile* l) {
|
void locfile_free(struct locfile* l);
|
||||||
jv_mem_free(l->linemap);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int locfile_get_line(struct locfile* l, int pos) {
|
void locfile_locate(struct locfile* l, location loc, const char* fmt, ...);
|
||||||
assert(pos < l->length);
|
|
||||||
int line = 0;
|
|
||||||
while (l->linemap[line+1] < pos) line++;
|
|
||||||
assert(line < l->nlines);
|
|
||||||
return line;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int locfile_line_length(struct locfile* l, int line) {
|
|
||||||
assert(line < l->nlines);
|
|
||||||
return l->linemap[line+1] - l->linemap[line];
|
|
||||||
}
|
|
||||||
|
|
||||||
static void locfile_locate(struct locfile* l, location loc, const char* fmt, ...) {
|
|
||||||
va_list fmtargs;
|
|
||||||
va_start(fmtargs, fmt);
|
|
||||||
vfprintf(stderr, fmt, fmtargs);
|
|
||||||
va_end(fmtargs);
|
|
||||||
fprintf(stderr, "\n");
|
|
||||||
if (loc.start == -1) {
|
|
||||||
fprintf(stderr, "<unknown location>\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
int startline = locfile_get_line(l, loc.start);
|
|
||||||
int offset = l->linemap[startline];
|
|
||||||
fprintf(stderr, "%.*s\n", locfile_line_length(l, startline)-(startline!=0), l->data + offset +(startline!=0));
|
|
||||||
fprintf(stderr, "%*s", loc.start - offset -(startline!=0), "");
|
|
||||||
for (int i = loc.start;
|
|
||||||
i < loc.end && i < offset + locfile_line_length(l, startline);
|
|
||||||
i++){
|
|
||||||
fprintf(stderr, "^");
|
|
||||||
}
|
|
||||||
fprintf(stderr, "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
Reference in new issue
Block a user