Rewrite aha to work with new tree system ready for messages and files

This commit is contained in:
Andrew Pamment
2018-10-21 23:05:17 +10:00
parent 71b465eba2
commit 947d4ab37f
5 changed files with 653 additions and 272 deletions

367
deps/aha/aha.c vendored
View File

@@ -20,6 +20,7 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "../../src/www_tree.h"
extern void unmangle_ansi(char *body, int len, char **body_out, int *body_len);
@@ -84,17 +85,7 @@ void deleteParse(pelem elem)
}
}
void append_output(char **output, char *stuff, int *size, int *at) {
while (*at + strlen(stuff) + 1 >= *size) {
*size += 256;
*output = realloc(*output, *size);
}
strcat(*output, stuff);
*at += strlen(stuff);
}
char * aha(char *input)
struct www_tag * aha(char *input, struct www_tag *parent)
{
//Searching Parameters
char *unmangle_out;
@@ -116,13 +107,11 @@ char * aha(char *input)
int newline=-1;
int temp;
char *ptr = unmangle_out;
char *output = (char *)malloc(256);
int size = 256;
int outat = 0;
char minibuf[2];
memset(output, 0, 256);
struct www_tag *child = NULL;
stralloc data = EMPTY_STRALLOC;
while (*ptr != '\0')
{
@@ -138,7 +127,7 @@ char * aha(char *input)
//Searching the end (a letter) and safe the insert:
c= *ptr++;
if (c == '\0') {
return output;
return parent;
}
if ( c == '[' ) // CSI code, see https://en.wikipedia.org/wiki/ANSI_escape_code#Colors
{
@@ -149,7 +138,7 @@ char * aha(char *input)
{
c=*ptr++;
if (c == '\0') {
return output;
return parent;
}
buffer[counter]=c;
if (c=='>') //end of htop
@@ -238,340 +227,202 @@ char * aha(char *input)
//Checking the differences
if ((fc!=ofc) || (bc!=obc) || (ul!=oul) || (bo!=obo) || (bl!=obl)) //ANY Change
{
if ((ofc!=-1) || (obc!=-1) || (oul!=0) || (obo!=0) || (obl!=0))
append_output(&output, "</span>", &size, &outat);
if ((fc!=-1) || (bc!=-1) || (ul!=0) || (bo!=0) || (bl!=0))
{
append_output(&output, "<span style=\"", &size, &outat);
if (data.len > 0) {
stralloc_0(&data);
struct www_tag *datatag = www_tag_new(NULL, data.s);
free(data.s);
data = EMPTY_STRALLOC;
if (child == NULL) {
www_tag_add_child(parent, datatag);
} else {
www_tag_add_child(child, datatag);
www_tag_add_child(parent, child);
}
}
child = www_tag_new("span", NULL);
stralloc output = EMPTY_STRALLOC;
switch (fc)
{
case 0:
if (bo) {
append_output(&output, "color:dimgray;", &size, &outat);
stralloc_cats(&output, "color:dimgray;");
} else {
append_output(&output, "color:dimgray;", &size, &outat);
stralloc_cats(&output, "color:dimgray;");
}
break; //Black
case 1:
if (bo) {
append_output(&output, "color:#FF8888;", &size, &outat);
stralloc_cats(&output, "color:#FF8888;");
} else {
append_output(&output, "color:red;", &size, &outat);
stralloc_cats(&output, "color:red;");
}
break; //Red
case 2:
if (bo) {
append_output(&output, "color:lime;", &size, &outat);
stralloc_cats(&output, "color:lime;");
} else {
append_output(&output, "color:#00ff00;", &size, &outat);
stralloc_cats(&output, "color:#00FF00;");
}
break; //Green
case 3:
if (bo) {
append_output(&output, "color:yellow;", &size, &outat);
stralloc_cats(&output, "color:yellow;");
} else {
append_output(&output, "color:olive;", &size, &outat);
stralloc_cats(&output, "color:olive;");
}
break; //Yellow
case 4:
if (bo) {
append_output(&output, "color:#8888FF;", &size, &outat);
stralloc_cats(&output, "color:#8888FF;");
} else {
append_output(&output, "color:#0000FF;", &size, &outat);
stralloc_cats(&output, "color:#0000FF;");
}
break; //Blue
case 5:
if (bo) {
append_output(&output, "color:fuchsia;", &size, &outat);
stralloc_cats(&output, "color:fuchsia;");
} else {
append_output(&output, "color:#FF00FF;", &size, &outat);
stralloc_cats(&output, "color:#FF00FF;");
}
break; //Purple
case 6:
if (bo) {
append_output(&output, "color:aqua;", &size, &outat);
stralloc_cats(&output, "color:aqua;");
} else {
append_output(&output, "color:#008888;", &size, &outat);
stralloc_cats(&output, "color:#008888;");
}
break; //Cyan
case 7:
if (bo) {
append_output(&output, "color:white;", &size, &outat);
stralloc_cats(&output, "color:white;");
} else {
append_output(&output, "color:grey;", &size, &outat);
stralloc_cats(&output, "color:grey;");
}
break; //White
case 8:
append_output(&output, "color:black;", &size, &outat);
stralloc_cats(&output, "color:black;");
break; //Background Colour
case 9:
append_output(&output, "color:white;", &size, &outat);
stralloc_cats(&output, "color:white;");
break; //Foreground Color
}
switch (bc)
{
case 0:
append_output(&output, "background-color:black;", &size, &outat);
stralloc_cats(&output, "background-color:black;");
break; //Black
case 1:
append_output(&output, "background-color:red;", &size, &outat);
stralloc_cats(&output, "background-color:red;");
break; //Red
case 2:
append_output(&output, "background-color:lime;", &size, &outat);
stralloc_cats(&output, "background-color:lime;");
break; //Green
case 3:
append_output(&output, "background-color:yellow;", &size, &outat);
stralloc_cats(&output, "background-color:yellow;");
break; //Yellow
case 4:
append_output(&output, "background-color:#3333FF;", &size, &outat);
stralloc_cats(&output, "background-color:#3333FF;");
break; //Blue
case 5:
append_output(&output, "background-color:fuchsia;", &size, &outat);
stralloc_cats(&output, "background-color:fuchsia;");
break; //Purple
case 6:
append_output(&output, "background-color:aqua;", &size, &outat);
stralloc_cats(&output, "background-color:aqua;");
break; //Cyan
case 7:
append_output(&output, "background-color:white;", &size, &outat);
stralloc_cats(&output, "background-color:white;");
break; //White
case 8:
append_output(&output, "background-color:black;", &size, &outat);
stralloc_cats(&output, "background-color:black;");
break; //Background Colour
case 9:
append_output(&output, "background-color:white;", &size, &outat);
stralloc_cats(&output, "background-color:white;");
break; //Foreground Colour
}
if (ul)
{
append_output(&output, "text-decoration:underline;", &size, &outat);
stralloc_cats(&output, "text-decoration:underline;");
}
if (bl)
{
append_output(&output, "text-decoration:blink;", &size, &outat);
stralloc_cats(&output, "text-decoration:blink;");
}
append_output(&output, "\">", &size, &outat);
stralloc_0(&output);
www_tag_add_attrib(child, "style", output.s);
free(output.s);
}
}
}
}
else
if (c==13)
{
//for (;line<80;line++)
// append_output(&output, "&nbsp;", &size, &outat);
line=0;
momline++;
append_output(&output, "<br />\n", &size, &outat);
}
else if (c!=8)
{
line++;
if (newline>=0)
{
while (newline>line)
{
append_output(&output, " ", &size, &outat);
line++;
}
newline=-1;
}
switch (c)
{
case '\x01' : append_output(&output, "&#x263A;", &size, &outat); break;
case '\x02' : append_output(&output, "&#x263B;", &size, &outat); break;
case '\x03' : append_output(&output, "&#x2665;", &size, &outat); break;
case '\x04' : append_output(&output, "&#x2666;", &size, &outat); break;
case '\x05' : append_output(&output, "&#x2663;", &size, &outat); break;
case '\x06' : append_output(&output, "&#x2660;", &size, &outat); break;
case '\x07' : append_output(&output, "&#x2022;", &size, &outat); break;
case '\x08' : append_output(&output, "&#x25D8;", &size, &outat); break;
case '\x09' : append_output(&output, "&#x25CB;", &size, &outat); break;
//case '\x0a' : append_output(&output, "&#x25D8;", &size, &outat); break;
case '\x0b' : append_output(&output, "&#x2642;", &size, &outat); break;
case '\x0c' : append_output(&output, "&#x2640;", &size, &outat); break;
//case '\x0d' : append_output(&output, "&#x266A;", &size, &outat); break;
case '\x0e' : append_output(&output, "&#x266B;", &size, &outat); break;
case '\x0f' : append_output(&output, "&#x263C;", &size, &outat); break;
case '\x10' : append_output(&output, "&#x25B8;", &size, &outat); break;
case '\x11' : append_output(&output, "&#x25C2;", &size, &outat); break;
case '\x12' : append_output(&output, "&#x2195;", &size, &outat); break;
case '\x13' : append_output(&output, "&#x203C;", &size, &outat); break;
case '\x14' : append_output(&output, "&#x00B6;", &size, &outat); break;
case '\x15' : append_output(&output, "&#x00A7;", &size, &outat); break;
case '\x16' : append_output(&output, "&#x25AC;", &size, &outat); break;
case '\x17' : append_output(&output, "&#x21A8;", &size, &outat); break;
case '\x18' : append_output(&output, "&#x2191;", &size, &outat); break;
case '\x19' : append_output(&output, "&#x2193;", &size, &outat); break;
case '\x1a' : append_output(&output, "&#x2192;", &size, &outat); break;
case '\x1b' : append_output(&output, "&#x2190;", &size, &outat); break;
case '\x1c' : append_output(&output, "&#x221F;", &size, &outat); break;
case '\x1d' : append_output(&output, "&#x2194;", &size, &outat); break;
case '\x1e' : append_output(&output, "&#x25B4;", &size, &outat); break;
case '\x1f' : append_output(&output, "&#x25BE;", &size, &outat); break;
case '\x21' : append_output(&output, "&#x0021;", &size, &outat); break;
case '\x22' : append_output(&output, "&#x0022;", &size, &outat); break;
case '\x23' : append_output(&output, "&#x0023;", &size, &outat); break;
case '\x24' : append_output(&output, "&#x0024;", &size, &outat); break;
case '\x25' : append_output(&output, "&#x0025;", &size, &outat); break;
case '\x26' : append_output(&output, "&#x0026;", &size, &outat); break;
case '\x27' : append_output(&output, "&#x0027;", &size, &outat); break;
case '\x28' : append_output(&output, "&#x0028;", &size, &outat); break;
case '\x29' : append_output(&output, "&#x0029;", &size, &outat); break;
case '\x2a' : append_output(&output, "&#x002A;", &size, &outat); break;
case '\x2b' : append_output(&output, "&#x002B;", &size, &outat); break;
case '\x2c' : append_output(&output, "&#x002C;", &size, &outat); break;
case '\x2d' : append_output(&output, "&#x002D;", &size, &outat); break;
case '\x2e' : append_output(&output, "&#x002E;", &size, &outat); break;
case '\x2f' : append_output(&output, "&#x002F;", &size, &outat); break;
case '\x7f' : append_output(&output, "&#x2302;", &size, &outat); break;
case '\x80' : append_output(&output, "&#x00C7;", &size, &outat); break;
case '\x81' : append_output(&output, "&#x00FC;", &size, &outat); break;
case '\x82' : append_output(&output, "&#x00E9;", &size, &outat); break;
case '\x83' : append_output(&output, "&#x00E2;", &size, &outat); break;
case '\x84' : append_output(&output, "&#x00E4;", &size, &outat); break;
case '\x85' : append_output(&output, "&#x00E0;", &size, &outat); break;
case '\x86' : append_output(&output, "&#x00E5;", &size, &outat); break;
case '\x87' : append_output(&output, "&#x00E7;", &size, &outat); break;
case '\x88' : append_output(&output, "&#x00EA;", &size, &outat); break;
case '\x89' : append_output(&output, "&#x00EB;", &size, &outat); break;
case '\x8a' : append_output(&output, "&#x00E8;", &size, &outat); break;
case '\x8b' : append_output(&output, "&#x00EF;", &size, &outat); break;
case '\x8c' : append_output(&output, "&#x00EE;", &size, &outat); break;
case '\x8d' : append_output(&output, "&#x00EC;", &size, &outat); break;
case '\x8e' : append_output(&output, "&#x00C4;", &size, &outat); break;
case '\x8f' : append_output(&output, "&#x00C5;", &size, &outat); break;
case '\x90' : append_output(&output, "&#x00C9;", &size, &outat); break;
case '\x91' : append_output(&output, "&#x00E6;", &size, &outat); break;
case '\x92' : append_output(&output, "&#x00C6;", &size, &outat); break;
case '\x93' : append_output(&output, "&#x00F4;", &size, &outat); break;
case '\x94' : append_output(&output, "&#x00F6;", &size, &outat); break;
case '\x95' : append_output(&output, "&#x00F2;", &size, &outat); break;
case '\x96' : append_output(&output, "&#x00FB;", &size, &outat); break;
case '\x97' : append_output(&output, "&#x00F9;", &size, &outat); break;
case '\x98' : append_output(&output, "&#x00FF;", &size, &outat); break;
case '\x99' : append_output(&output, "&#x00D6;", &size, &outat); break;
case '\x9a' : append_output(&output, "&#x00DC;", &size, &outat); break;
case '\x9b' : append_output(&output, "&#x00A2;", &size, &outat); break;
case '\x9c' : append_output(&output, "&#x00A3;", &size, &outat); break;
case '\x9d' : append_output(&output, "&#x00A5;", &size, &outat); break;
case '\x9e' : append_output(&output, "&#x20A7;", &size, &outat); break;
case '\x9f' : append_output(&output, "&#x0192;", &size, &outat); break;
case '\xa0' : append_output(&output, "&#x00E1;", &size, &outat); break;
case '\xa1' : append_output(&output, "&#x00ED;", &size, &outat); break;
case '\xa2' : append_output(&output, "&#x00F3;", &size, &outat); break;
case '\xa3' : append_output(&output, "&#x00FA;", &size, &outat); break;
case '\xa4' : append_output(&output, "&#x00F1;", &size, &outat); break;
case '\xa5' : append_output(&output, "&#x00D1;", &size, &outat); break;
case '\xa6' : append_output(&output, "&#x00AA;", &size, &outat); break;
case '\xa7' : append_output(&output, "&#x00BA;", &size, &outat); break;
case '\xa8' : append_output(&output, "&#x00BF;", &size, &outat); break;
case '\xa9' : append_output(&output, "&#x2310;", &size, &outat); break;
case '\xaa' : append_output(&output, "&#x00AC;", &size, &outat); break;
case '\xab' : append_output(&output, "&#x00BD;", &size, &outat); break;
case '\xac' : append_output(&output, "&#x00BC;", &size, &outat); break;
case '\xad' : append_output(&output, "&#x00A1;", &size, &outat); break;
case '\xae' : append_output(&output, "&#x00AB;", &size, &outat); break;
case '\xaf' : append_output(&output, "&#x00BB;", &size, &outat); break;
case '\xb0' : append_output(&output, "&#x2591;", &size, &outat); break;
case '\xb1' : append_output(&output, "&#x2592;", &size, &outat); break;
case '\xb2' : append_output(&output, "&#x2593;", &size, &outat); break;
case '\xb3' : append_output(&output, "&#x2502;", &size, &outat); break;
case '\xb4' : append_output(&output, "&#x2524;", &size, &outat); break;
case '\xb5' : append_output(&output, "&#x2561;", &size, &outat); break;
case '\xb6' : append_output(&output, "&#x2562;", &size, &outat); break;
case '\xb7' : append_output(&output, "&#x2556;", &size, &outat); break;
case '\xb8' : append_output(&output, "&#x2555;", &size, &outat); break;
case '\xb9' : append_output(&output, "&#x2563;", &size, &outat); break;
case '\xba' : append_output(&output, "&#x2551;", &size, &outat); break;
case '\xbb' : append_output(&output, "&#x2557;", &size, &outat); break;
case '\xbc' : append_output(&output, "&#x255D;", &size, &outat); break;
case '\xbd' : append_output(&output, "&#x255C;", &size, &outat); break;
case '\xbe' : append_output(&output, "&#x255B;", &size, &outat); break;
case '\xbf' : append_output(&output, "&#x2510;", &size, &outat); break;
case '\xc0' : append_output(&output, "&#x2514;", &size, &outat); break;
case '\xc1' : append_output(&output, "&#x2534;", &size, &outat); break;
case '\xc2' : append_output(&output, "&#x252C;", &size, &outat); break;
case '\xc3' : append_output(&output, "&#x251C;", &size, &outat); break;
case '\xc4' : append_output(&output, "&#x2500;", &size, &outat); break;
case '\xc5' : append_output(&output, "&#x253C;", &size, &outat); break;
case '\xc6' : append_output(&output, "&#x255E;", &size, &outat); break;
case '\xc7' : append_output(&output, "&#x255F;", &size, &outat); break;
case '\xc8' : append_output(&output, "&#x255A;", &size, &outat); break;
case '\xc9' : append_output(&output, "&#x2554;", &size, &outat); break;
case '\xca' : append_output(&output, "&#x2569;", &size, &outat); break;
case '\xcb' : append_output(&output, "&#x2566;", &size, &outat); break;
case '\xcc' : append_output(&output, "&#x2560;", &size, &outat); break;
case '\xcd' : append_output(&output, "&#x2550;", &size, &outat); break;
case '\xce' : append_output(&output, "&#x256C;", &size, &outat); break;
case '\xcf' : append_output(&output, "&#x2567;", &size, &outat); break;
case '\xd0' : append_output(&output, "&#x2568;", &size, &outat); break;
case '\xd1' : append_output(&output, "&#x2564;", &size, &outat); break;
case '\xd2' : append_output(&output, "&#x2565;", &size, &outat); break;
case '\xd3' : append_output(&output, "&#x2559;", &size, &outat); break;
case '\xd4' : append_output(&output, "&#x255B;", &size, &outat); break;
case '\xd5' : append_output(&output, "&#x2552;", &size, &outat); break;
case '\xd6' : append_output(&output, "&#x2553;", &size, &outat); break;
case '\xd7' : append_output(&output, "&#x256B;", &size, &outat); break;
case '\xd8' : append_output(&output, "&#x256A;", &size, &outat); break;
case '\xd9' : append_output(&output, "&#x2518;", &size, &outat); break;
case '\xda' : append_output(&output, "&#x250C;", &size, &outat); break;
case '\xdb' : append_output(&output, "&#x2588;", &size, &outat); break;
case '\xdc' : append_output(&output, "&#x2584;", &size, &outat); break;
case '\xdd' : append_output(&output, "&#x258C;", &size, &outat); break;
case '\xde' : append_output(&output, "&#x2590;", &size, &outat); break;
case '\xdf' : append_output(&output, "&#x2580;", &size, &outat); break;
case '\xe0' : append_output(&output, "&#x03B1;", &size, &outat); break;
case '\xe1' : append_output(&output, "&#x03B2;", &size, &outat); break;
case '\xe2' : append_output(&output, "&#x0393;", &size, &outat); break;
case '\xe3' : append_output(&output, "&#x03C0;", &size, &outat); break;
case '\xe4' : append_output(&output, "&#x03A3;", &size, &outat); break;
case '\xe5' : append_output(&output, "&#x03C3;", &size, &outat); break;
case '\xe6' : append_output(&output, "&#x00B5;", &size, &outat); break;
case '\xe7' : append_output(&output, "&#x03C4;", &size, &outat); break;
case '\xe8' : append_output(&output, "&#x03A6;", &size, &outat); break;
case '\xe9' : append_output(&output, "&#x0398;", &size, &outat); break;
case '\xea' : append_output(&output, "&#x03A9;", &size, &outat); break;
case '\xeb' : append_output(&output, "&#x03B4;", &size, &outat); break;
case '\xec' : append_output(&output, "&#x221E;", &size, &outat); break;
case '\xed' : append_output(&output, "&#x2205;", &size, &outat); break;
case '\xee' : append_output(&output, "&#x2208;", &size, &outat); break;
case '\xef' : append_output(&output, "&#x2229;", &size, &outat); break;
case '\xf0' : append_output(&output, "&#x2261;", &size, &outat); break;
case '\xf1' : append_output(&output, "&#x00B1;", &size, &outat); break;
case '\xf2' : append_output(&output, "&#x2265;", &size, &outat); break;
case '\xf3' : append_output(&output, "&#x2264;", &size, &outat); break;
case '\xf4' : append_output(&output, "&#x2320;", &size, &outat); break;
case '\xf5' : append_output(&output, "&#x2321;", &size, &outat); break;
case '\xf6' : append_output(&output, "&#x00F7;", &size, &outat); break;
case '\xf7' : append_output(&output, "&#x2248;", &size, &outat); break;
case '\xf8' : append_output(&output, "&#x00B0;", &size, &outat); break;
case '\xf9' : append_output(&output, "&#x2219;", &size, &outat); break;
case '\xfa' : append_output(&output, "&#x00B7;", &size, &outat); break;
case '\xfb' : append_output(&output, "&#x221A;", &size, &outat); break;
case '\xfc' : append_output(&output, "&#x207F;", &size, &outat); break;
case '\xfd' : append_output(&output, "&#x00B2;", &size, &outat); break;
case '\xfe' : append_output(&output, "&#x25AA;", &size, &outat); break;
case '<': append_output(&output, "&lt;", &size, &outat); break;
case '>': append_output(&output, "&gt;", &size, &outat); break;
case '\n':case 13: momline++;
line=0;
append_output(&output, "<br />\n", &size, &outat);
break;
case ' ': append_output(&output, "&nbsp;", &size, &outat); break;
case '\n':
case 13:
momline++;
line=0;
struct www_tag *brtag = www_tag_new("br", NULL);
if (data.len > 0) {
if (child != NULL) {
stralloc_0(&data);
struct www_tag *datatag = www_tag_new(NULL, data.s);
free(data.s);
data = EMPTY_STRALLOC;
www_tag_add_child(child, datatag);
www_tag_add_child(child, brtag);
www_tag_add_child(parent, child);
child = www_tag_duplicate(child);
} else {
stralloc_0(&data);
struct www_tag *datatag = www_tag_new(NULL, data.s);
free(data.s);
data = EMPTY_STRALLOC;
www_tag_add_child(parent, datatag);
www_tag_add_child(parent, brtag);
}
} else {
if (child != NULL) {
www_tag_add_child(child, brtag);
www_tag_add_child(parent, child);
child = www_tag_duplicate(child);
} else {
www_tag_add_child(parent, brtag);
}
}
break;
default: {
sprintf(minibuf, "%c", c);
append_output(&output, minibuf, &size, &outat);
stralloc_append1(&data, c);
break;
}
}
}
}
//Footer
if ((fc!=-1) || (bc!=-1) || (ul!=0) || (bo!=0) || (bl!=0))
append_output(&output, "</span>\n", &size, &outat);
if (data.len > 0) {
stralloc_0(&data);
struct www_tag *datatag = www_tag_new(NULL, data.s);
free(data.s);
data = EMPTY_STRALLOC;
if (child == NULL) {
www_tag_add_child(parent, datatag);
} else {
www_tag_add_child(child, datatag);
www_tag_add_child(parent, child);
}
}
free(unmangle_out);
return output;
return parent;
}