hell
This commit is contained in:
parent
7d8e55eaef
commit
26a160f6b0
3
Makefile
3
Makefile
@ -10,3 +10,6 @@ OBJ:=$(subst .c,.o,${SRC})
|
||||
|
||||
hl: ${OBJ}
|
||||
${LINK.c} ${OBJ} -o $@
|
||||
|
||||
new:
|
||||
g++ src2/main.cpp -o hl -ggdb
|
||||
|
61
src2/Highlight.h
Normal file
61
src2/Highlight.h
Normal file
@ -0,0 +1,61 @@
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <stdio.h>
|
||||
|
||||
typedef enum {
|
||||
BOLD,
|
||||
ITALICS,
|
||||
UNDERLINE,
|
||||
END
|
||||
} attr_t;
|
||||
|
||||
typedef void (*attr_callback_t)(void);
|
||||
void bold_on(void){
|
||||
fputs("\033[1m", stdout);
|
||||
}
|
||||
void bold_off(void){
|
||||
fputs("\033[0m", stdout);
|
||||
}
|
||||
attr_callback_t attr_callbacks[END*2] = {
|
||||
(attr_callback_t)bold_on,
|
||||
(attr_callback_t)bold_off,
|
||||
};
|
||||
|
||||
typedef int color;
|
||||
|
||||
struct hl_t {
|
||||
attr_t attrs;
|
||||
color fg_color;
|
||||
color bg_color;
|
||||
//? font;
|
||||
};
|
||||
|
||||
struct hl_group {
|
||||
char* name;
|
||||
std::map<char*, hl_t> o;
|
||||
hl_group* link;
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
KEYWORD,
|
||||
MATCH,
|
||||
REGION
|
||||
} token_t;
|
||||
|
||||
struct token{
|
||||
hl_group* hl;
|
||||
token_t t;
|
||||
char* syntax;
|
||||
};
|
||||
|
||||
std::vector<token*> token_table;
|
||||
|
||||
token* newtoken(char* syntax, token_t t, hl_group* g){
|
||||
token* mt = new (token){
|
||||
.hl = g,
|
||||
.t = t,
|
||||
.syntax = syntax
|
||||
};
|
||||
token_table.push_back(mt);
|
||||
return mt;
|
||||
}
|
45
src2/main.cpp
Normal file
45
src2/main.cpp
Normal file
@ -0,0 +1,45 @@
|
||||
#include "Highlight.h"
|
||||
|
||||
const char *const test_string = "this (test) is my test string which im with testing in this test";
|
||||
|
||||
int fits(const char* const pattern, const char* const to){
|
||||
if(pattern == NULL){ return true; }
|
||||
for(int i = 0;; i++){
|
||||
if(pattern[i] == '\00'){ return i; }
|
||||
if(to[i] == '\00' or pattern[i] != to[i]){ return false; }
|
||||
}
|
||||
}
|
||||
|
||||
void render_string(const char* const string, char* mode){
|
||||
for(const char* s = string; *s != '\00';){
|
||||
for(auto &i : token_table){
|
||||
int f;
|
||||
f = fits(i->syntax, s);
|
||||
if(f){
|
||||
int pos = i->hl->o.find(mode)->second.attrs;
|
||||
attr_callbacks[pos]();
|
||||
for(int h = 0; h < f; h++){
|
||||
putchar(*(s+h));
|
||||
}
|
||||
attr_callbacks[pos+1]();
|
||||
s += f;
|
||||
}else{
|
||||
putchar(*s);
|
||||
++s;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
signed main(){
|
||||
hl_group mygroup = (hl_group){
|
||||
.name = "test",
|
||||
.link = NULL
|
||||
};
|
||||
mygroup.o["cterm"] = (hl_t){
|
||||
.attrs = BOLD
|
||||
};
|
||||
token* mytoken = newtoken("test", KEYWORD, &mygroup);
|
||||
render_string(test_string, "cterm");
|
||||
putchar('\n');
|
||||
}
|
Loading…
Reference in New Issue
Block a user