|
@@ -72,7 +72,7 @@ cucul_canvas_t * cucul_import_canvas(void const *data, unsigned int size, |
|
|
buf[0] == 'C' && buf[1] == 'A' && buf[2] == 'C' && buf[3] != 'A') |
|
|
buf[0] == 'C' && buf[1] == 'A' && buf[2] == 'C' && buf[3] != 'A') |
|
|
return import_caca(data, size); |
|
|
return import_caca(data, size); |
|
|
|
|
|
|
|
|
/* If we find ESC[ tuple, we guess it's an ANSI file */ |
|
|
|
|
|
|
|
|
/* If we find ESC[ argv, we guess it's an ANSI file */ |
|
|
while(i<size-1) |
|
|
while(i<size-1) |
|
|
{ |
|
|
{ |
|
|
if((buf[i] == 0x1b) && (buf[i+1] == '[')) |
|
|
if((buf[i] == 0x1b) && (buf[i+1] == '[')) |
|
@@ -201,7 +201,7 @@ static cucul_canvas_t *import_text(void const *data, unsigned int size) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
#define IS_ALPHA(x) (x>='A' && x<='z') |
|
|
#define IS_ALPHA(x) (x>='A' && x<='z') |
|
|
#define END_TUP 0x1337 |
|
|
|
|
|
|
|
|
#define END_ARG 0x1337 |
|
|
static int parse_tuple(unsigned int *, unsigned char const *, int); |
|
|
static int parse_tuple(unsigned int *, unsigned char const *, int); |
|
|
static void manage_modifiers(int, uint8_t *, uint8_t *, uint8_t *, uint8_t *, uint8_t *, uint8_t *); |
|
|
static void manage_modifiers(int, uint8_t *, uint8_t *, uint8_t *, uint8_t *, uint8_t *, uint8_t *); |
|
|
|
|
|
|
|
@@ -210,8 +210,6 @@ static cucul_canvas_t *import_ansi(void const *data, unsigned int size) |
|
|
cucul_canvas_t *cv; |
|
|
cucul_canvas_t *cv; |
|
|
unsigned char const *buffer = (unsigned char const*)data; |
|
|
unsigned char const *buffer = (unsigned char const*)data; |
|
|
unsigned int i; |
|
|
unsigned int i; |
|
|
unsigned int count = 0; |
|
|
|
|
|
unsigned int tuple[1024]; /* Should be enough. Will it be ? */ |
|
|
|
|
|
int x = 0, y = 0; |
|
|
int x = 0, y = 0; |
|
|
unsigned int width = 80, height = 25; |
|
|
unsigned int width = 80, height = 25; |
|
|
int save_x = 0, save_y = 0; |
|
|
int save_x = 0, save_y = 0; |
|
@@ -245,6 +243,8 @@ static cucul_canvas_t *import_ansi(void const *data, unsigned int size) |
|
|
|
|
|
|
|
|
if(buffer[i] == '\x1b' && buffer[i + 1] == '[') /* ESC code */ |
|
|
if(buffer[i] == '\x1b' && buffer[i + 1] == '[') /* ESC code */ |
|
|
{ |
|
|
{ |
|
|
|
|
|
unsigned int argv[1024]; /* Should be enough. Will it be? */ |
|
|
|
|
|
unsigned int argc = 0; |
|
|
unsigned char c = '\0'; |
|
|
unsigned char c = '\0'; |
|
|
|
|
|
|
|
|
i++; // ESC |
|
|
i++; // ESC |
|
@@ -257,37 +257,35 @@ static cucul_canvas_t *import_ansi(void const *data, unsigned int size) |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
skip += parse_tuple(tuple, buffer + i, size - i); |
|
|
|
|
|
count = 0; |
|
|
|
|
|
|
|
|
skip += parse_tuple(argv, buffer + i, size - i); |
|
|
|
|
|
|
|
|
while(tuple[count] != END_TUP) |
|
|
|
|
|
count++; /* Gruik */ |
|
|
|
|
|
|
|
|
while(argv[argc] != END_ARG) |
|
|
|
|
|
argc++; /* Gruik */ |
|
|
|
|
|
|
|
|
switch(c) |
|
|
switch(c) |
|
|
{ |
|
|
{ |
|
|
case 'f': |
|
|
case 'f': |
|
|
case 'H': |
|
|
case 'H': |
|
|
if(tuple[0] == END_TUP) |
|
|
|
|
|
x = y = 0; |
|
|
|
|
|
else |
|
|
|
|
|
|
|
|
switch(argc) |
|
|
{ |
|
|
{ |
|
|
y = tuple[0] - 1; |
|
|
|
|
|
x = tuple[1] == END_TUP ? 0 : tuple[1] - 1; |
|
|
|
|
|
|
|
|
case 0: x = y = 0; break; |
|
|
|
|
|
case 1: y = argv[0] - 1; x = 0; break; |
|
|
|
|
|
case 2: y = argv[0] - 1; x = argv[1] - 1; break; |
|
|
} |
|
|
} |
|
|
break; |
|
|
break; |
|
|
case 'A': |
|
|
case 'A': |
|
|
y -= tuple[0] == END_TUP ? 1 : tuple[0]; |
|
|
|
|
|
|
|
|
y -= argc ? argv[0] : 1; |
|
|
if(y < 0) |
|
|
if(y < 0) |
|
|
y = 0; |
|
|
y = 0; |
|
|
break; |
|
|
break; |
|
|
case 'B': |
|
|
case 'B': |
|
|
y += tuple[0] == END_TUP ? 1 : tuple[0]; |
|
|
|
|
|
|
|
|
y += argc ? argv[0] : 1; |
|
|
break; |
|
|
break; |
|
|
case 'C': |
|
|
case 'C': |
|
|
x += tuple[0] == END_TUP ? 1 : tuple[0]; |
|
|
|
|
|
|
|
|
x += argc ? argv[0] : 1; |
|
|
break; |
|
|
break; |
|
|
case 'D': |
|
|
case 'D': |
|
|
x -= tuple[0] == END_TUP ? 1 : tuple[0]; |
|
|
|
|
|
|
|
|
x -= argc ? argv[0] : 1; |
|
|
if(x < 0) |
|
|
if(x < 0) |
|
|
x = 0; |
|
|
x = 0; |
|
|
break; |
|
|
break; |
|
@@ -300,7 +298,7 @@ static cucul_canvas_t *import_ansi(void const *data, unsigned int size) |
|
|
y = save_y; |
|
|
y = save_y; |
|
|
break; |
|
|
break; |
|
|
case 'J': |
|
|
case 'J': |
|
|
if(tuple[0] == 2) |
|
|
|
|
|
|
|
|
if(argv[0] == 2) |
|
|
x = y = 0; |
|
|
x = y = 0; |
|
|
break; |
|
|
break; |
|
|
case 'K': |
|
|
case 'K': |
|
@@ -310,8 +308,9 @@ static cucul_canvas_t *import_ansi(void const *data, unsigned int size) |
|
|
x = width; |
|
|
x = width; |
|
|
break; |
|
|
break; |
|
|
case 'm': |
|
|
case 'm': |
|
|
for(j = 0; j < count; j++) |
|
|
|
|
|
manage_modifiers(tuple[j], &fg, &bg, &save_fg, &save_bg, &bold, &reverse); |
|
|
|
|
|
|
|
|
for(j = 0; j < argc; j++) |
|
|
|
|
|
manage_modifiers(argv[j], &fg, &bg, |
|
|
|
|
|
&save_fg, &save_bg, &bold, &reverse); |
|
|
if(bold && fg < 8) |
|
|
if(bold && fg < 8) |
|
|
fg += 8; |
|
|
fg += 8; |
|
|
if(bold && bg < 8) |
|
|
if(bold && bg < 8) |
|
@@ -359,7 +358,7 @@ static int parse_tuple(unsigned int *ret, unsigned char const *buffer, int size) |
|
|
int t = 0; |
|
|
int t = 0; |
|
|
unsigned char nbr[1024]; |
|
|
unsigned char nbr[1024]; |
|
|
|
|
|
|
|
|
ret[0] = END_TUP; |
|
|
|
|
|
|
|
|
ret[0] = END_ARG; |
|
|
|
|
|
|
|
|
for(i = 0; i < size; i++) |
|
|
for(i = 0; i < size; i++) |
|
|
{ |
|
|
{ |
|
@@ -370,7 +369,7 @@ static int parse_tuple(unsigned int *ret, unsigned char const *buffer, int size) |
|
|
ret[t] = atoi((char*)nbr); |
|
|
ret[t] = atoi((char*)nbr); |
|
|
t++; |
|
|
t++; |
|
|
} |
|
|
} |
|
|
ret[t] = END_TUP; |
|
|
|
|
|
|
|
|
ret[t] = END_ARG; |
|
|
j = 0; |
|
|
j = 0; |
|
|
return i; |
|
|
return i; |
|
|
} |
|
|
} |
|
@@ -385,14 +384,15 @@ static int parse_tuple(unsigned int *ret, unsigned char const *buffer, int size) |
|
|
{ |
|
|
{ |
|
|
ret[t] = atoi((char*)nbr); |
|
|
ret[t] = atoi((char*)nbr); |
|
|
t++; |
|
|
t++; |
|
|
ret[t] = END_TUP; |
|
|
|
|
|
|
|
|
ret[t] = END_ARG; |
|
|
j = 0; |
|
|
j = 0; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
return size; |
|
|
return size; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
static void manage_modifiers(int i, uint8_t *fg, uint8_t *bg, uint8_t *save_fg, uint8_t *save_bg, uint8_t *bold, uint8_t *reverse) |
|
|
|
|
|
|
|
|
static void manage_modifiers(int i, uint8_t *fg, uint8_t *bg, uint8_t *save_fg, |
|
|
|
|
|
uint8_t *save_bg, uint8_t *bold, uint8_t *reverse) |
|
|
{ |
|
|
{ |
|
|
static uint8_t const ansi2cucul[] = |
|
|
static uint8_t const ansi2cucul[] = |
|
|
{ |
|
|
{ |
|
|