commit 631bcb4abec9058618c57c8dd7dc01b57b64184d
Author: anon <anon@anon.anon>
Date:   Sat Jan 4 02:58:09 2025 +0100

    init

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9eefcdc
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+*.out
+*.tags
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..eab4b81
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,7 @@
+bundle:
+	-mkdir object/.vim/
+	-mkdir ~/bin/
+    cp wrappers/* ~/bin/
+
+install: bundle
+	tar -x -f errtags.tar --dereference -C ~/
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..c6d50bf
--- /dev/null
+++ b/README.md
@@ -0,0 +1,26 @@
+# Errtags
+
+## Idea
+The normal way to do error reporting is redefining your build-system to vim.
+Thats disguasting.
+
+The right way should be to hook into the actual build system.
+
+## Process
+Make is our friend, because its hackable.
+
+    token := genrate-session-token()
+    foreach t in $tools do
+        $t($token)
+    done
+
+The session token is a number used to differentiate between compiles.
+
+Every tool is wrapped, so that it emits its output to both normally and piped into errtags.
+
+Errtags is responsible for grepping error messages and storing them in a csv-like file.
+
+The csv is passed to vim so it can display the errors.
+
+## Dependencies
++ Tcl
diff --git a/debug/c_hw/Makefile b/debug/c_hw/Makefile
new file mode 100644
index 0000000..dc9a56e
--- /dev/null
+++ b/debug/c_hw/Makefile
@@ -0,0 +1,4 @@
+CFLAGS += -Wall -Wpedantic
+
+main:
+	${CC} ${CFLAGS} main.c
diff --git a/debug/c_hw/header.h b/debug/c_hw/header.h
new file mode 100644
index 0000000..5225f9a
--- /dev/null
+++ b/debug/c_hw/header.h
@@ -0,0 +1 @@
+int i = "asd";
diff --git a/debug/c_hw/main.c b/debug/c_hw/main.c
new file mode 100644
index 0000000..6952e2a
--- /dev/null
+++ b/debug/c_hw/main.c
@@ -0,0 +1,26 @@
+// header name typo
+//#include <studio.h>
+// NOTE: LOL.
+//        you thought gcc can report syntax errors if preprocessing failed?
+//       LMAO EVEN.
+
+#include "header.h"
+
+// messed up struct syntax
+struct {
+    int a,
+    int b;
+} k;
+
+int f(void) {
+    // statement with no effect
+    10 + 10;
+    // missing return statement
+}
+
+signed main(void) {
+    // non-sensical break
+    break;
+
+    return f();
+}
diff --git a/errtags b/errtags
new file mode 100755
index 0000000..577037f
--- /dev/null
+++ b/errtags
@@ -0,0 +1,39 @@
+#!/usr/bin/tclsh
+
+set outputFilename "/home/anon/stow/.cache/errtags.tags"
+
+set ERRTAGS_SESSION [expr { \
+    [info exists env(ERRTAGS_SESSION)] ? $env(ERRTAGS_SESSION) : "" \
+}]
+
+if {$ERRTAGS_SESSION eq ""} {
+    set ERRTAGS_SESSION [expr {int(rand() * 1000) + 1}]
+}
+
+# --- Setup output
+proc getMode {fileName errtagsSession} {
+    if {[catch {set fileId [open $fileName r]}]} { return w }
+    
+    set firstLine [gets $fileId]
+    close $fileId
+
+    return [expr {[string match "#$errtagsSession" $firstLine] ? "a" : "w"}]
+}
+
+set mode [getMode $outputFilename $ERRTAGS_SESSION]
+
+set output [open $outputFilename $mode]
+
+# --- Header rewrite
+if {$mode == "w"} {
+    puts $output "#$ERRTAGS_SESSION"
+}
+
+# --- Error translation
+set errex {(.+):(\d+):(\d+): error: (.*)}
+while {[gets stdin line] >= 0} {
+    if {[regexp $errex $line ignore sfile sline scol msg]} {
+        puts $output "$sfile:$sline:$scol:$msg"
+    }
+}
+close $output
diff --git a/errtags.sh b/errtags.sh
new file mode 100644
index 0000000..b0e806f
--- /dev/null
+++ b/errtags.sh
@@ -0,0 +1 @@
+alias make='make.sh CC=cc.sh'
diff --git a/errtags.vim b/errtags.vim
new file mode 100644
index 0000000..fbd448d
--- /dev/null
+++ b/errtags.vim
@@ -0,0 +1,90 @@
+" --- Define our prop types ---
+" #pragma region
+call prop_type_delete('ErrorHighlight')
+call prop_type_delete('CommentHighlight')
+
+hi link ErrTagsError   ErrorMsg
+hi link ErrTagsMessage Comment
+
+call prop_type_add('ErrorHighlight', {
+      \ 'highlight': 'ErrTagsError',
+      \ })
+
+call prop_type_add('CommentHighlight', {
+      \ 'highlight': 'ErrTagsMessage',
+      \ })
+" #pragma endregion
+
+" --- Main logic ---
+" #pragma region
+function! AddNotice(lnum, col, message)
+  try
+    call prop_add(a:lnum, a:col, {
+          \ 'type': 'ErrorHighlight',
+          \ 'length': 1
+          \ })
+  catch /E964/ | endtry
+
+    call prop_add(a:lnum, 0, {
+          \ 'type': 'CommentHighlight',
+          \ 'text': ' # E: ' . a:message,
+          \ 'text_align': 'after'
+          \ })
+endfunction
+
+function AddNotices(notices)
+    for l:notice in a:notices
+        if l:notice['fname'] == expand('%:t')
+            call AddNotice(l:notice.lnum, l:notice.col, l:notice.text)
+        endif
+    endfor
+endfunction
+
+function! ParseNotices(lines)
+    let l:errors = []
+
+    for l:line in a:lines
+        let l:fields = split(l:line, ':')
+
+        if len(l:fields) >= 2
+            let l:filename = l:fields[0]
+            let l:line_number = l:fields[1]
+            let l:column_number = l:fields[2]
+            let l:message = join(l:fields[3:], ':')
+
+            call add(l:errors, {
+            \ 'fname': l:filename,
+            \ 'lnum':  l:line_number,
+            \ 'col':   l:column_number,
+            \ 'text':  l:message,
+            \ 'type':  'E',
+            \ })
+        endif
+    endfor
+
+    return l:errors
+endfunction
+
+function! DoNotices()
+    call prop_remove({ 'type': 'ErrorHighlight' })
+    call prop_remove({ 'type': 'CommentHighlight' })
+
+    let l:lines = readfile(expand('~/stow/.cache/errtags.tags'))
+
+    let l:notices = ParseNotices(l:lines)
+
+    call AddNotices(l:notices)
+endfunction
+" #pragma endregion
+
+let g:errtags_events = ["BufEnter", "BufWrite"]
+" --- Hook up everything ---
+" #pragma region
+if exists('g:errtags_events')
+	for e in g:errtags_events
+		execute "autocmd " . e . " * DoNotices"
+	endfor
+endif
+
+command! DoNotices :call DoNotices()
+" #pragma endregion
diff --git a/object/.gitkeep b/object/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/wrappers/cc.sh b/wrappers/cc.sh
new file mode 100755
index 0000000..4af912e
--- /dev/null
+++ b/wrappers/cc.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+cc -fdiagnostics-color=always "$@" 2>&1 \
+| tee >(\
+        sed -e 's/\x1b\[[0-9;]*m//g' -e 's/\x1b\[K//g' \
+        | errtags
+)
+exit ${PIPESTATUS[0]}
diff --git a/wrappers/make.sh b/wrappers/make.sh
new file mode 100755
index 0000000..9f5ff5c
--- /dev/null
+++ b/wrappers/make.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+ERRTAGS_SESSION=$RANDOM
+export ERRTAGS_SESSION
+make "$@"