From 234fd065b88e21bc7a65a4bf55fa3f9de7a9372d Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Thu, 3 Sep 2020 10:38:12 -0500 Subject: [PATCH] added ability to output a tag file --- core/js/webgl.js | 14 +++++++++ core/js/webgl.onyx | 11 +++++-- core/stdio.onyx | 2 ++ core/string.onyx | 3 -- docs/cli | 21 +++++++++++++ docs/plan | 13 ++++++-- include/onyxdoc.h | 13 ++++++-- onyx | Bin 588872 -> 590456 bytes progs/poly_test.onyx | 4 +-- src/onyx.c | 13 +++++++- src/onyxdoc.c | 72 +++++++++++++++++++++++++++++++++++++++++-- src/onyxerrors.c | 7 +++++ 12 files changed, 158 insertions(+), 15 deletions(-) create mode 100644 docs/cli diff --git a/core/js/webgl.js b/core/js/webgl.js index 16b971e2..1199e896 100644 --- a/core/js/webgl.js +++ b/core/js/webgl.js @@ -11,6 +11,7 @@ WebGl_Wasm = { this.renderbuffers = []; this.textures = []; this.uniformlocs = []; + this.vertexArrays = []; this.canvas = document.getElementById(canvasname); if (this.canvas == null) return 0; @@ -34,6 +35,8 @@ WebGl_Wasm = { bindFramebuffer(target, framebuffer) { this.gl.bindFramebuffer(target, this.framebuffers[framebuffer]); }, bindRenderbuffer(target, renderbuffer) { this.gl.bindRenderbuffer(target, this.renderbuffers[renderbuffer]); }, bindTexture(target, texture) { this.gl.bindTexture(target, this.textures[texture]); }, + bindVertexArray(vertexArray) { this.gl.bindVertexArray(this.vertexArrays[vertexArray]); }, + blendColor(red, green, blue, alpha) { this.gl.blendColor(red, green, blue, alpha); }, blendEquation(mode) { this.gl.blendEquation(mode); }, blendEquationSeparate(modeRGB, modeAlpha) { this.gl.blendEquationSeparate(modeRGB, modeAlpha); }, @@ -118,6 +121,13 @@ WebGl_Wasm = { this.textures.push(texture); return this.textures.length - 1; }, + createVertexArray() { + const vao = this.gl.createVertexArray(); + if (vao == null) return -1; + + this.vertexArrays.push(vao); + return this.vertexArrays.length - 1; + }, cullFace(mode) { this.gl.cullFace(mode); }, deleteBuffer(buffer) { this.gl.deleteBuffer(this.buffers[buffer]); }, deleteFramebuffer(framebuffer) { this.gl.deleteFramebuffer(this.framebuffers[framebuffer]); }, @@ -125,6 +135,7 @@ WebGl_Wasm = { deleteRenderbuffer(renderbuffer) { this.gl.deleteRenderbuffer(this.renderbuffers[renderbuffer]); }, deleteShader(shader) { this.gl.deleteShader(this.shaders[shader]); }, deleteTexture(texture) { this.gl.deleteTexture(this.textures[texture]); }, + deleteVertexArray(vertexArray) { this.gl.deleteVertexArray(this.vertexArrays[vertexArray]); }, depthFunc(func) { this.gl.depthFunc(func); }, depthMask(flag) { this.gl.depthMask(flag); }, depthRange(znear, zfar) { this.gl.depthRange(znear, zfar); }, @@ -132,7 +143,9 @@ WebGl_Wasm = { disable(cap) { this.gl.disable(cap); }, disableVertexAttribArray(index) { this.gl.disableVertexAttribArray(index); }, drawArrays(mode, first, count) { this.gl.drawArrays(mode, first, count); }, + drawArraysInstanced(mode, first, count, instanceCount) { this.gl.drawArraysInstanced(mode, first, count, instanceCount); }, drawElements(mode, count, type, offset) { this.gl.drawElements(mode, count, type, offset); }, + drawElementsInstanced(mode, count, type, offset, instanceCount) { this.gl.drawElementsInstanced(mode, count, type, offset, instanceCount); }, enable(cap) { this.gl.enable(cap); }, enableVertexAttribArray(index) { this.gl.enableVertexAttribArray(index); }, finish() { this.gl.finish(); }, @@ -261,6 +274,7 @@ WebGl_Wasm = { vertexAttrib3f(idx, x, y, z) { this.gl.vertexAttrib3f(idx, x, y, z); }, vertexAttrib4f(idx, x, y, z, w) { this.gl.vertexAttrib4f(idx, x, y, z, w); }, vertexAttribPointer(idx, size, type, normalized, stride, offset) { this.gl.vertexAttribPointer(idx, size, type, normalized, stride, offset); }, + vertexAttribDivisor(idx, divisor) { this.gl.vertexAttribDivisor(idx, divisor); }, viewport(x, y, width, height) { this.gl.viewport(x, y, width, height); }, }; diff --git a/core/js/webgl.onyx b/core/js/webgl.onyx index d738253c..a4d2afea 100644 --- a/core/js/webgl.onyx +++ b/core/js/webgl.onyx @@ -1,6 +1,6 @@ package gl // To be used with the corresponding gl.js - +// There are many things that are missing but this suffices for me. // ClearBufferMask @@ -708,6 +708,7 @@ GLRenderbuffer :: #type i32 GLTexture :: #type i32 GLBuffer :: #type i32 GLUniformLocation :: #type i32 +GLVertexArrayObject :: #type i32 GLActiveInfo :: struct { size : GLint; @@ -728,6 +729,7 @@ bindBuffer :: proc (target: GLenum, buffer: GLBuffer) #forei bindFramebuffer :: proc (target: GLenum, framebuffer: GLFramebuffer) #foreign "gl" "bindFramebuffer" --- bindRenderbuffer :: proc (target: GLenum, renderbuffer: GLRenderbuffer) #foreign "gl" "bindRenderbuffer" --- bindTexture :: proc (target: GLenum, texture: GLTexture) #foreign "gl" "bindTexture" --- +bindVertexArray :: proc (vertexArray: GLVertexArrayObject) #foreign "gl" "bindVertexArray" --- blendColor :: proc (red: GLclampf, green: GLclampf, blue: GLclampf, alpha: GLclampf) #foreign "gl" "blendColor" --- blendEquation :: proc (mode: GLenum) #foreign "gl" "blendEquation" --- blendEquationSeparate :: proc (modeRGB: GLenum, modeAlpha: GLenum) #foreign "gl" "blendEquationSeparate" --- @@ -737,7 +739,7 @@ blitFramebuffer :: proc (sx0: GLint, sy0: GLint, sx1: GLint, sy1: bufferDataWithData :: proc (target: GLenum, buffer: Buffer, usage: GLenum) #foreign "gl" "bufferDataWithData" --- bufferDataNoData :: proc (target: GLenum, size: GLsizeiptr, usage: GLenum) #foreign "gl" "bufferDataNoData" --- bufferData :: proc #overloaded { bufferDataWithData, bufferDataNoData } -bufferSubData :: proc (target: GLenum, offset: GLintptr, data: string) #foreign "gl" "bufferSubData" --- +bufferSubData :: proc (target: GLenum, offset: GLsizei, data: Buffer) #foreign "gl" "bufferSubData" --- checkFrameBufferStatus :: proc (target: GLenum) -> GLenum #foreign "gl" "checkFrameBufferStatus" --- clear :: proc (mask: GLbitfield) #foreign "gl" "clear" --- clearColor :: proc (red: GLclampf, green: GLclampf, blue: GLclampf, alpha: GLclampf) #foreign "gl" "clearColor" --- @@ -756,6 +758,7 @@ createProgram :: proc -> GLProgram #foreign "gl" "createProgram createRenderbuffer :: proc -> GLRenderbuffer #foreign "gl" "createRenderbuffer" --- createShader :: proc (type: GLenum) -> GLShader #foreign "gl" "createShader" --- createTexture :: proc -> GLTexture #foreign "gl" "createTexture" --- +createVertexArray :: proc -> GLVertexArrayObject #foreign "gl" "createVertexArray" --- cullFace :: proc (mode: GLenum) #foreign "gl" "cullFace" --- deleteBuffer :: proc (buffer: GLBuffer) #foreign "gl" "deleteBuffer" --- deleteFramebuffer :: proc (framebuffer: GLFramebuffer) #foreign "gl" "deleteFramebuffer" --- @@ -763,6 +766,7 @@ deleteProgram :: proc (program: GLProgram) #foreign "gl" "delet deleteRenderbuffer :: proc (renderbuffer: GLRenderbuffer) #foreign "gl" "deleteRenderbuffer" --- deleteShader :: proc (shader: GLShader) #foreign "gl" "deleteShader" --- deleteTexture :: proc (texture: GLTexture) #foreign "gl" "deleteTexture" --- +deleteVertexArray :: proc (vertexArray: GLVertexArrayObject) #foreign "gl" "deleteVertexArray" --- depthFunc :: proc (func: GLenum) #foreign "gl" "depthFunc" --- depthMask :: proc (flag: GLboolean) #foreign "gl" "depthMask" --- depthRange :: proc (zNear: GLclampf, zFar: GLclampf) #foreign "gl" "depthRange" --- @@ -770,7 +774,9 @@ detachShader :: proc (program: GLProgram, shader: GLShader) #f disable :: proc (cap: GLenum) #foreign "gl" "disable" --- disableVertexAttribArray :: proc (index: GLuint) #foreign "gl" "disableVertexAttribArray" --- drawArrays :: proc (mode: GLenum, first: GLint, count: GLsizei) #foreign "gl" "drawArrays" --- +drawArraysInstanced :: proc (mode: GLenum, first: GLint, count: GLsizei, instanceCount: GLsizei) #foreign "gl" "drawArraysInstanced" --- drawElements :: proc (mode: GLenum, count: GLsizei, type: GLenum, offset: GLint) #foreign "gl" "drawElements" --- +drawElementsInstanced :: proc (mode: GLenum, count: GLsizei, type: GLenum, offset: GLint, instanceCount: GLsizei) #foreign "gl" "drawElementsInstanced" --- enable :: proc (cap: GLenum) #foreign "gl" "enable" --- enableVertexAttribArray :: proc (index: GLuint) #foreign "gl" "enableVertexAttribArray" --- finish :: proc #foreign "gl" "finish" --- @@ -838,4 +844,5 @@ vertexAttrib2f :: proc (idx: GLuint, x: GLfloat, y: GLfloat) #fo vertexAttrib3f :: proc (idx: GLuint, x: GLfloat, y: GLfloat, z: GLfloat) #foreign "gl" "vertexAttrib3f" --- vertexAttrib4f :: proc (idx: GLuint, x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat) #foreign "gl" "vertexAttrib4f" --- vertexAttribPointer :: proc (idx: GLuint, size: GLint, type: GLenum, normalized: GLboolean, stride: GLsizei, offset: GLint) #foreign "gl" "vertexAttribPointer" --- +vertexAttribDivisor :: proc (idx: GLuint, divisor: GLuint) #foreign "gl" "vertexAttribDivisor" --- viewport :: proc (x: GLint, y: GLint, width: GLsizei, height: GLsizei) #foreign "gl" "viewport" --- diff --git a/core/stdio.onyx b/core/stdio.onyx index a0f0794b..3d2fc0f5 100644 --- a/core/stdio.onyx +++ b/core/stdio.onyx @@ -39,6 +39,8 @@ print_array :: proc (arr: $T, sep := " ") { } print_buffer_flush :: proc { + if print_buffer.len == 0 do return; + ^print_buffer |> string_builder_to_string() |> system.output_string(); diff --git a/core/string.onyx b/core/string.onyx index 3804ea35..9dac85d4 100644 --- a/core/string.onyx +++ b/core/string.onyx @@ -26,9 +26,6 @@ string_length :: proc #overloaded { }, } -#private -string_length_string :: proc (s: string) -> u32 do return s.count; - string_concat :: proc (s1: string, s2: string) -> string { len1 :: string_length(s1); len2 :: string_length(s2); diff --git a/docs/cli b/docs/cli new file mode 100644 index 00000000..e372cc09 --- /dev/null +++ b/docs/cli @@ -0,0 +1,21 @@ +Thoughts about the CLI for Onyx +------------------------------- + +Right now, unless a specific argument is recognized, it is treated as a file to add to the compilation. +This has worked well, but as the amount of functionality that is being added to the compiler is increasing, +the need for a better CLI system is imminent. + +Here are all the things the compiler should be able to do: + * Compile a file or a set of files + * Validate a file or set of files + - Everything done in compilations + - No outputting to final WASM file + * Generate documentation for a compilation + - In Human, Tags, or Html format + * Print a help menu + + + + $ onyx compile progs/poly_test.onyx -I other_folder + + $ onyx doc progs/poly_test.onyx --format tag diff --git a/docs/plan b/docs/plan index 60b058bf..ba6b114e 100644 --- a/docs/plan +++ b/docs/plan @@ -174,7 +174,7 @@ HOW: X All members specified means names not required X Named member initialization X Default values on structs so they don't have to be named - + [X] #union on structs [X] #align on structs @@ -201,7 +201,7 @@ HOW: [X] Add slices - Arrays without a size - - Converted to a struct that looks like: + - Converted to a struct that looks like: []T :: struct { data : ^T; count : u32; @@ -226,8 +226,17 @@ HOW: [X] #file and #line directives - string and u32 respectively that represent the current file and line number where the directive is + [X] Generate a tags file + - This looks very simple + - I think all the infrastructure is there for this + [ ] data structure based iteration + [ ] baked parameters + - Compile time known parameters + - Removes the argument from the list and replaces the function with the + baked function + [ ] Put type info in data section so it is runtime accessible - type name - size diff --git a/include/onyxdoc.h b/include/onyxdoc.h index b3b3ba73..b5ec16d7 100644 --- a/include/onyxdoc.h +++ b/include/onyxdoc.h @@ -4,8 +4,15 @@ #include "bh.h" #include "onyxastnodes.h" +typedef enum DocFormat { + Doc_Format_Human, + Doc_Format_Tags, + Doc_Format_Html, +} DocFormat; + typedef struct DocEntry { OnyxFilePos pos; + char* sym; // Unused by doc generator char* def; char* additional; } DocEntry; @@ -20,10 +27,12 @@ typedef struct DocPackage { typedef struct OnyxDocumentation { bh_arena doc_arena; + DocFormat format; + bh_arr(DocPackage) package_docs; } OnyxDocumentation; OnyxDocumentation onyx_docs_generate(ProgramInfo* prog); -void onyx_docs_write(OnyxDocumentation* doc); +void onyx_docs_emit(OnyxDocumentation* doc); -#endif \ No newline at end of file +#endif diff --git a/onyx b/onyx index a21c505676db1d50d980aa85b2ca603188a64485..bfe7d9cd83347f794ed6ceb65a69c35f3a4e880d 100755 GIT binary patch delta 52652 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 RP;dMq)01>Q@kcB3{{fZ;D475N delta 48226 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 i32 { if v1.x != v2.x do return v1.x - v2.x; if v1.y != v2.y do return v1.y - v2.y; return v1.z - v2.z; -} \ No newline at end of file +} diff --git a/src/onyx.c b/src/onyx.c index b1628aa6..59b6acf3 100644 --- a/src/onyx.c +++ b/src/onyx.c @@ -334,6 +334,16 @@ static CompilerProgress process_source_file(CompilerState* compiler_state, char* bh_file_contents fc = bh_file_read_contents(compiler_state->token_alloc, &file); bh_file_close(&file); + // POTENTIAL BUG: If there are too many files and too many collisions in the table, + // there is a chance that the inner arrays of the table will be repositioned. That + // would completely break the pointer taken here, which would break all references + // to file contents anywhere else in the program. + // + // A good solution would be to not use a table and just use a array of char* and + // ensure that the filename is not in that list. + // - brendanfh 2020/09/03 + + // NOTE: Need to reget the value out of the table so token references work bh_table_put(bh_file_contents, compiler_state->loaded_files, (char *) filename, fc); fc = bh_table_get(bh_file_contents, compiler_state->loaded_files, (char *) filename); @@ -394,7 +404,8 @@ static i32 onyx_compile(CompilerState* compiler_state) { if (compiler_state->options->action == ONYX_COMPILE_ACTION_DOCUMENT) { OnyxDocumentation docs = onyx_docs_generate(&compiler_state->prog_info); - onyx_docs_write(&docs); + docs.format = Doc_Format_Tags; + onyx_docs_emit(&docs); return ONYX_COMPILER_PROGRESS_SUCCESS; } diff --git a/src/onyxdoc.c b/src/onyxdoc.c index 918f6e8c..fbe7515d 100644 --- a/src/onyxdoc.c +++ b/src/onyxdoc.c @@ -12,7 +12,7 @@ static i32 cmp_doc_entry(const void * a, const void * b) { static i32 cmp_doc_package(const void * a, const void * b) { DocPackage* d1 = (DocPackage *) a; DocPackage* d2 = (DocPackage *) b; - + return strncmp(d1->name, d2->name, 1024); } @@ -79,7 +79,8 @@ static char* node_to_doc_def(const char* sym, AstNode *node, bh_allocator a) { case Ast_Kind_Basic_Type: case Ast_Kind_Array_Type: case Ast_Kind_Type_Alias: - case Ast_Kind_Slice_Type: { + case Ast_Kind_Slice_Type: + case Ast_Kind_DynArr_Type: { strncat(buf, type_get_name(type_build_from_ast(global_heap_allocator, (AstType *) node)), 1023); break; } @@ -105,6 +106,7 @@ static DocPackage doc_package_create(Package* p, bh_allocator a) { DocEntry de; de.pos = value->token->pos; de.def = node_to_doc_def(key, value, a); + de.sym = (char *) key; de.additional = NULL; bh_arr_push(dp.public_entries, de); @@ -114,6 +116,7 @@ static DocPackage doc_package_create(Package* p, bh_allocator a) { DocEntry de; de.pos = value->token->pos; de.def = node_to_doc_def(key, value, a); + de.sym = (char *) key; de.additional = NULL; bh_arr_push(dp.private_entries, de); @@ -144,7 +147,7 @@ OnyxDocumentation onyx_docs_generate(ProgramInfo* prog) { return doc; } -void onyx_docs_write(OnyxDocumentation* doc) { +static void onyx_docs_emit_human(OnyxDocumentation* doc) { // NOTE: Disabling fancy line printing until I can make it better #if 0 bh_arr_each(DocPackage, dp, doc->package_docs) { @@ -214,3 +217,66 @@ void onyx_docs_write(OnyxDocumentation* doc) { } #endif } + + +static i32 sort_tags(const void* a, const void* b) { + DocEntry *da = *((DocEntry **) a); + DocEntry *db = *((DocEntry **) b); + + return strcmp(da->sym, db->sym); +} + +static void onyx_docs_emit_tags(OnyxDocumentation* doc) { + bh_file tags_file; + if (bh_file_create(&tags_file, "./tags") != BH_FILE_ERROR_NONE) { + bh_printf("Cannot create 'tags'.\n"); + return; + } + + bh_fprintf(&tags_file, "!_TAG_FILE_FORMAT\t2\n"); + bh_fprintf(&tags_file, "!_TAG_FILE_SORTED\t1\n"); + bh_fprintf(&tags_file, "!_TAG_OUTPUT_FILESEP\tslash\n"); + bh_fprintf(&tags_file, "!_TAG_OUTPUT_MODE\tu-ctags\n"); + bh_fprintf(&tags_file, "!_TAG_PROGRAM_AUTHOR\tOnyx Compiler\n"); + bh_fprintf(&tags_file, "!_TAG_PROGRAM_NAME\tOnyx Compiler\n"); + bh_fprintf(&tags_file, "!_TAG_PROGRAM_URL\thttps://github.com/brendanfh/onyx\n"); + bh_fprintf(&tags_file, "!_TAG_PROGRAM_VERSION\t0.0.1\n"); + + bh_arr(DocEntry *) tags = NULL; + bh_arr_new(global_heap_allocator, tags, 256); + + bh_arr_each(DocPackage, dp, doc->package_docs) { + bh_arr_each(DocEntry, de, dp->public_entries) bh_arr_push(tags, de); + bh_arr_each(DocEntry, de, dp->private_entries) bh_arr_push(tags, de); + } + + qsort(tags, bh_arr_length(tags), sizeof(DocEntry *), sort_tags); + + bh_arr_each(DocEntry *, tag, tags) { + if ((*tag)->pos.filename == NULL) continue; + + i32 line_len = 0; + char *c = (*tag)->pos.line_start; + while (*c++ != '\n') line_len++; + + bh_fprintf(&tags_file, "%s\t%s\t/^%b$/\n", + (*tag)->sym, (*tag)->pos.filename, + (*tag)->pos.line_start, line_len); + } + + bh_file_close(&tags_file); +} + +static void onyx_docs_emit_html(OnyxDocumentation* doc) { + bh_printf("HTML documentation output not supported yet.\n"); + return; +} + +void onyx_docs_emit(OnyxDocumentation* doc) { + switch (doc->format) { + case Doc_Format_Human: onyx_docs_emit_human(doc); break; + case Doc_Format_Tags: onyx_docs_emit_tags(doc); break; + case Doc_Format_Html: onyx_docs_emit_html(doc); break; + } +} + diff --git a/src/onyxerrors.c b/src/onyxerrors.c index 5e9879d0..ed8bc702 100644 --- a/src/onyxerrors.c +++ b/src/onyxerrors.c @@ -50,6 +50,13 @@ static void print_detailed_message(OnyxError* err, bh_file_contents* fc) { } void onyx_errors_print() { + // NOTE: If the format of the error messages is ever changed, + // update onyx_compile.vim and onyx.sublime-build to match + // the new format. This was editor error highlighting is still + // supported. + // + // - brendanfh 2020/09/03 + bh_arr_each(OnyxError, err, errors.errors) { if (err->pos.filename) { bh_file_contents* fc = &bh_table_get(bh_file_contents, *errors.file_contents, (char *) err->pos.filename); -- 2.25.1