diff --git a/deps/aha/aha.c b/deps/aha/aha.c index bac96b0..c7d2edf 100644 --- a/deps/aha/aha.c +++ b/deps/aha/aha.c @@ -20,6 +20,7 @@ #include #include #include +#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, "", &size, &outat); if ((fc!=-1) || (bc!=-1) || (ul!=0) || (bo!=0) || (bl!=0)) { - append_output(&output, " 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, " ", &size, &outat); - line=0; - momline++; - append_output(&output, "
\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, "☺", &size, &outat); break; - case '\x02' : append_output(&output, "☻", &size, &outat); break; - case '\x03' : append_output(&output, "♥", &size, &outat); break; - case '\x04' : append_output(&output, "♦", &size, &outat); break; - case '\x05' : append_output(&output, "♣", &size, &outat); break; - case '\x06' : append_output(&output, "♠", &size, &outat); break; - case '\x07' : append_output(&output, "•", &size, &outat); break; - case '\x08' : append_output(&output, "◘", &size, &outat); break; - case '\x09' : append_output(&output, "○", &size, &outat); break; - //case '\x0a' : append_output(&output, "◘", &size, &outat); break; - case '\x0b' : append_output(&output, "♂", &size, &outat); break; - case '\x0c' : append_output(&output, "♀", &size, &outat); break; - //case '\x0d' : append_output(&output, "♪", &size, &outat); break; - case '\x0e' : append_output(&output, "♫", &size, &outat); break; - case '\x0f' : append_output(&output, "☼", &size, &outat); break; - case '\x10' : append_output(&output, "▸", &size, &outat); break; - case '\x11' : append_output(&output, "◂", &size, &outat); break; - case '\x12' : append_output(&output, "↕", &size, &outat); break; - case '\x13' : append_output(&output, "‼", &size, &outat); break; - case '\x14' : append_output(&output, "¶", &size, &outat); break; - case '\x15' : append_output(&output, "§", &size, &outat); break; - case '\x16' : append_output(&output, "▬", &size, &outat); break; - case '\x17' : append_output(&output, "↨", &size, &outat); break; - case '\x18' : append_output(&output, "↑", &size, &outat); break; - case '\x19' : append_output(&output, "↓", &size, &outat); break; - case '\x1a' : append_output(&output, "→", &size, &outat); break; - case '\x1b' : append_output(&output, "←", &size, &outat); break; - case '\x1c' : append_output(&output, "∟", &size, &outat); break; - case '\x1d' : append_output(&output, "↔", &size, &outat); break; - case '\x1e' : append_output(&output, "▴", &size, &outat); break; - case '\x1f' : append_output(&output, "▾", &size, &outat); break; - case '\x21' : append_output(&output, "!", &size, &outat); break; - case '\x22' : append_output(&output, """, &size, &outat); break; - case '\x23' : append_output(&output, "#", &size, &outat); break; - case '\x24' : append_output(&output, "$", &size, &outat); break; - case '\x25' : append_output(&output, "%", &size, &outat); break; - case '\x26' : append_output(&output, "&", &size, &outat); break; - case '\x27' : append_output(&output, "'", &size, &outat); break; - case '\x28' : append_output(&output, "(", &size, &outat); break; - case '\x29' : append_output(&output, ")", &size, &outat); break; - case '\x2a' : append_output(&output, "*", &size, &outat); break; - case '\x2b' : append_output(&output, "+", &size, &outat); break; - case '\x2c' : append_output(&output, ",", &size, &outat); break; - case '\x2d' : append_output(&output, "-", &size, &outat); break; - case '\x2e' : append_output(&output, ".", &size, &outat); break; - case '\x2f' : append_output(&output, "/", &size, &outat); break; - case '\x7f' : append_output(&output, "⌂", &size, &outat); break; - case '\x80' : append_output(&output, "Ç", &size, &outat); break; - case '\x81' : append_output(&output, "ü", &size, &outat); break; - case '\x82' : append_output(&output, "é", &size, &outat); break; - case '\x83' : append_output(&output, "â", &size, &outat); break; - case '\x84' : append_output(&output, "ä", &size, &outat); break; - case '\x85' : append_output(&output, "à", &size, &outat); break; - case '\x86' : append_output(&output, "å", &size, &outat); break; - case '\x87' : append_output(&output, "ç", &size, &outat); break; - case '\x88' : append_output(&output, "ê", &size, &outat); break; - case '\x89' : append_output(&output, "ë", &size, &outat); break; - case '\x8a' : append_output(&output, "è", &size, &outat); break; - case '\x8b' : append_output(&output, "ï", &size, &outat); break; - case '\x8c' : append_output(&output, "î", &size, &outat); break; - case '\x8d' : append_output(&output, "ì", &size, &outat); break; - case '\x8e' : append_output(&output, "Ä", &size, &outat); break; - case '\x8f' : append_output(&output, "Å", &size, &outat); break; - case '\x90' : append_output(&output, "É", &size, &outat); break; - case '\x91' : append_output(&output, "æ", &size, &outat); break; - case '\x92' : append_output(&output, "Æ", &size, &outat); break; - case '\x93' : append_output(&output, "ô", &size, &outat); break; - case '\x94' : append_output(&output, "ö", &size, &outat); break; - case '\x95' : append_output(&output, "ò", &size, &outat); break; - case '\x96' : append_output(&output, "û", &size, &outat); break; - case '\x97' : append_output(&output, "ù", &size, &outat); break; - case '\x98' : append_output(&output, "ÿ", &size, &outat); break; - case '\x99' : append_output(&output, "Ö", &size, &outat); break; - case '\x9a' : append_output(&output, "Ü", &size, &outat); break; - case '\x9b' : append_output(&output, "¢", &size, &outat); break; - case '\x9c' : append_output(&output, "£", &size, &outat); break; - case '\x9d' : append_output(&output, "¥", &size, &outat); break; - case '\x9e' : append_output(&output, "₧", &size, &outat); break; - case '\x9f' : append_output(&output, "ƒ", &size, &outat); break; - case '\xa0' : append_output(&output, "á", &size, &outat); break; - case '\xa1' : append_output(&output, "í", &size, &outat); break; - case '\xa2' : append_output(&output, "ó", &size, &outat); break; - case '\xa3' : append_output(&output, "ú", &size, &outat); break; - case '\xa4' : append_output(&output, "ñ", &size, &outat); break; - case '\xa5' : append_output(&output, "Ñ", &size, &outat); break; - case '\xa6' : append_output(&output, "ª", &size, &outat); break; - case '\xa7' : append_output(&output, "º", &size, &outat); break; - case '\xa8' : append_output(&output, "¿", &size, &outat); break; - case '\xa9' : append_output(&output, "⌐", &size, &outat); break; - case '\xaa' : append_output(&output, "¬", &size, &outat); break; - case '\xab' : append_output(&output, "½", &size, &outat); break; - case '\xac' : append_output(&output, "¼", &size, &outat); break; - case '\xad' : append_output(&output, "¡", &size, &outat); break; - case '\xae' : append_output(&output, "«", &size, &outat); break; - case '\xaf' : append_output(&output, "»", &size, &outat); break; - case '\xb0' : append_output(&output, "░", &size, &outat); break; - case '\xb1' : append_output(&output, "▒", &size, &outat); break; - case '\xb2' : append_output(&output, "▓", &size, &outat); break; - case '\xb3' : append_output(&output, "│", &size, &outat); break; - case '\xb4' : append_output(&output, "┤", &size, &outat); break; - case '\xb5' : append_output(&output, "╡", &size, &outat); break; - case '\xb6' : append_output(&output, "╢", &size, &outat); break; - case '\xb7' : append_output(&output, "╖", &size, &outat); break; - case '\xb8' : append_output(&output, "╕", &size, &outat); break; - case '\xb9' : append_output(&output, "╣", &size, &outat); break; - case '\xba' : append_output(&output, "║", &size, &outat); break; - case '\xbb' : append_output(&output, "╗", &size, &outat); break; - case '\xbc' : append_output(&output, "╝", &size, &outat); break; - case '\xbd' : append_output(&output, "╜", &size, &outat); break; - case '\xbe' : append_output(&output, "╛", &size, &outat); break; - case '\xbf' : append_output(&output, "┐", &size, &outat); break; - case '\xc0' : append_output(&output, "└", &size, &outat); break; - case '\xc1' : append_output(&output, "┴", &size, &outat); break; - case '\xc2' : append_output(&output, "┬", &size, &outat); break; - case '\xc3' : append_output(&output, "├", &size, &outat); break; - case '\xc4' : append_output(&output, "─", &size, &outat); break; - case '\xc5' : append_output(&output, "┼", &size, &outat); break; - case '\xc6' : append_output(&output, "╞", &size, &outat); break; - case '\xc7' : append_output(&output, "╟", &size, &outat); break; - case '\xc8' : append_output(&output, "╚", &size, &outat); break; - case '\xc9' : append_output(&output, "╔", &size, &outat); break; - case '\xca' : append_output(&output, "╩", &size, &outat); break; - case '\xcb' : append_output(&output, "╦", &size, &outat); break; - case '\xcc' : append_output(&output, "╠", &size, &outat); break; - case '\xcd' : append_output(&output, "═", &size, &outat); break; - case '\xce' : append_output(&output, "╬", &size, &outat); break; - case '\xcf' : append_output(&output, "╧", &size, &outat); break; - case '\xd0' : append_output(&output, "╨", &size, &outat); break; - case '\xd1' : append_output(&output, "╤", &size, &outat); break; - case '\xd2' : append_output(&output, "╥", &size, &outat); break; - case '\xd3' : append_output(&output, "╙", &size, &outat); break; - case '\xd4' : append_output(&output, "╛", &size, &outat); break; - case '\xd5' : append_output(&output, "╒", &size, &outat); break; - case '\xd6' : append_output(&output, "╓", &size, &outat); break; - case '\xd7' : append_output(&output, "╫", &size, &outat); break; - case '\xd8' : append_output(&output, "╪", &size, &outat); break; - case '\xd9' : append_output(&output, "┘", &size, &outat); break; - case '\xda' : append_output(&output, "┌", &size, &outat); break; - case '\xdb' : append_output(&output, "█", &size, &outat); break; - case '\xdc' : append_output(&output, "▄", &size, &outat); break; - case '\xdd' : append_output(&output, "▌", &size, &outat); break; - case '\xde' : append_output(&output, "▐", &size, &outat); break; - case '\xdf' : append_output(&output, "▀", &size, &outat); break; - case '\xe0' : append_output(&output, "α", &size, &outat); break; - case '\xe1' : append_output(&output, "β", &size, &outat); break; - case '\xe2' : append_output(&output, "Γ", &size, &outat); break; - case '\xe3' : append_output(&output, "π", &size, &outat); break; - case '\xe4' : append_output(&output, "Σ", &size, &outat); break; - case '\xe5' : append_output(&output, "σ", &size, &outat); break; - case '\xe6' : append_output(&output, "µ", &size, &outat); break; - case '\xe7' : append_output(&output, "τ", &size, &outat); break; - case '\xe8' : append_output(&output, "Φ", &size, &outat); break; - case '\xe9' : append_output(&output, "Θ", &size, &outat); break; - case '\xea' : append_output(&output, "Ω", &size, &outat); break; - case '\xeb' : append_output(&output, "δ", &size, &outat); break; - case '\xec' : append_output(&output, "∞", &size, &outat); break; - case '\xed' : append_output(&output, "∅", &size, &outat); break; - case '\xee' : append_output(&output, "∈", &size, &outat); break; - case '\xef' : append_output(&output, "∩", &size, &outat); break; - case '\xf0' : append_output(&output, "≡", &size, &outat); break; - case '\xf1' : append_output(&output, "±", &size, &outat); break; - case '\xf2' : append_output(&output, "≥", &size, &outat); break; - case '\xf3' : append_output(&output, "≤", &size, &outat); break; - case '\xf4' : append_output(&output, "⌠", &size, &outat); break; - case '\xf5' : append_output(&output, "⌡", &size, &outat); break; - case '\xf6' : append_output(&output, "÷", &size, &outat); break; - case '\xf7' : append_output(&output, "≈", &size, &outat); break; - case '\xf8' : append_output(&output, "°", &size, &outat); break; - case '\xf9' : append_output(&output, "∙", &size, &outat); break; - case '\xfa' : append_output(&output, "·", &size, &outat); break; - case '\xfb' : append_output(&output, "√", &size, &outat); break; - case '\xfc' : append_output(&output, "ⁿ", &size, &outat); break; - case '\xfd' : append_output(&output, "²", &size, &outat); break; - case '\xfe' : append_output(&output, "▪", &size, &outat); break; - case '<': append_output(&output, "<", &size, &outat); break; - case '>': append_output(&output, ">", &size, &outat); break; - case '\n':case 13: momline++; - line=0; - append_output(&output, "
\n", &size, &outat); - break; - case ' ': append_output(&output, " ", &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, "
\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; } diff --git a/src/www_files.c b/src/www_files.c index 260846c..5274d90 100644 --- a/src/www_files.c +++ b/src/www_files.c @@ -7,11 +7,12 @@ #include "../deps/hashids/hashids.h" +#include "www_tree.h" #include "bbs.h" extern struct bbs_config conf; extern struct user_record *gUser; -extern char *aha(char *input); +extern struct www_tag * aha(char *input, struct www_tag *parent); static int digit2nibble(int digit) { static const char *const hex = "0123456789abcdef"; @@ -298,7 +299,6 @@ char *www_files_display_listing(int dir, int sub) { stralloc page = EMPTY_STRALLOC; char pathbuf[PATH_MAX]; - char *aha_out = NULL; sqlite3 *db = NULL; sqlite3_stmt *res = NULL; int rc = 0; @@ -372,9 +372,13 @@ char *www_files_display_listing(int dir, int sub) { if (*p == '\n') *p = '\r'; } - aha_out = aha(description); - stralloc_cats(&page, aha_out); - free(aha_out); + struct www_tag *aha_out = www_tag_new(NULL, ""); + aha(description, aha_out); + + char *aha_data = www_tag_unwravel(aha_out); + + stralloc_cats(&page, aha_data); + free(aha_data); free(description); free(filename); diff --git a/src/www_msgs.c b/src/www_msgs.c index c2d32a2..476d509 100644 --- a/src/www_msgs.c +++ b/src/www_msgs.c @@ -6,7 +6,7 @@ #include #include #include - +#include "www_tree.h" #include "jamlib/jam.h" #include "libuuid/uuid.h" @@ -15,9 +15,8 @@ #define IN 0 #define OUT 1 -extern char *aha(char *input); extern struct bbs_config conf; - +extern struct www_tag * aha(char *input, struct www_tag *parent); static char *www_wordwrap(char *content, int cutoff); char *www_sanitize(char *inp) { int i; @@ -241,7 +240,6 @@ char *www_msgs_messageview(struct user_record *user, int conference, int area, i char *to_s; int l1, l2; char *aha_text; - char *aha_out; char *nodename; struct fido_addr *nodeno; @@ -421,10 +419,13 @@ char *www_msgs_messageview(struct user_record *user, int conference, int area, i stralloc_cats(&page, "
\n"); aha_text = strndup(body, jmh.TxtLen); - aha_out = aha(aha_text); - stralloc_cats(&page, aha_out); - - free(aha_out); + struct www_tag *aha_out = www_tag_new(NULL, ""); + aha(aha_text, aha_out); + + char *aha_data = www_tag_unwravel(aha_out); + + stralloc_cats(&page, aha_data); + free(aha_data); free(aha_text); stralloc_cats(&page, "
\n"); diff --git a/src/www_tree.c b/src/www_tree.c index eee4da2..430db11 100644 --- a/src/www_tree.c +++ b/src/www_tree.c @@ -28,12 +28,528 @@ struct www_tag *www_tag_new(char *tag, char *data) { case '>': stralloc_cats(&str, ">"); break; + case '\x01': + stralloc_cats(&str, "☺"); + break; + case '\x02': + stralloc_cats(&str, "☻"); + break; + case '\x03': + stralloc_cats(&str, "♥"); + break; + case '\x04': + stralloc_cats(&str, "♦"); + break; + case '\x05': + stralloc_cats(&str, "♣"); + break; + case '\x06': + stralloc_cats(&str, "♠"); + break; + case '\x07': + stralloc_cats(&str, "•"); + break; + case '\x08': + stralloc_cats(&str, "◘"); + break; + case '\x09': + stralloc_cats(&str, "○"); + break; + case '\x0b': + stralloc_cats(&str, "♂"); + break; + case '\x0c': + stralloc_cats(&str, "♀"); + break; + case '\x0e': + stralloc_cats(&str, "♫"); + break; + case '\x0f': + stralloc_cats(&str, "☼"); + break; + case '\x10': + stralloc_cats(&str, "▸"); + break; + case '\x11': + stralloc_cats(&str, "◂"); + break; + case '\x12': + stralloc_cats(&str, "↕"); + break; + case '\x13': + stralloc_cats(&str, "‼"); + break; + case '\x14': + stralloc_cats(&str, "¶"); + break; + case '\x15': + stralloc_cats(&str, "§"); + break; + case '\x16': + stralloc_cats(&str, "▬"); + break; + case '\x17': + stralloc_cats(&str, "↨"); + break; + case '\x18': + stralloc_cats(&str, "↑"); + break; + case '\x19': + stralloc_cats(&str, "↓"); + break; + case '\x1a': + stralloc_cats(&str, "→"); + break; + case '\x1b': + stralloc_cats(&str, "←"); + break; + case '\x1c': + stralloc_cats(&str, "∟"); + break; + case '\x1d': + stralloc_cats(&str, "↔"); + break; + case '\x1e': + stralloc_cats(&str, "▴"); + break; + case '\x1f': + stralloc_cats(&str, "▾"); + break; + case '\x21': + stralloc_cats(&str, "!"); + break; + case '\x22': + stralloc_cats(&str, """); + break; + case '\x23': + stralloc_cats(&str, "#"); + break; + case '\x24': + stralloc_cats(&str, "$"); + break; + case '\x25': + stralloc_cats(&str, "%"); + break; + case '\x27': + stralloc_cats(&str, "'"); + break; + case '\x28': + stralloc_cats(&str, "("); + break; + case '\x29': + stralloc_cats(&str, ")"); + break; + case '\x2a': + stralloc_cats(&str, "*"); + break; + case '\x2b': + stralloc_cats(&str, "+"); + break; + case '\x2c': + stralloc_cats(&str, ","); + break; + case '\x2d': + stralloc_cats(&str, "-"); + break; + case '\x2e': + stralloc_cats(&str, "."); + break; + case '\x2f': + stralloc_cats(&str, "/"); + break; + case '\x7f': + stralloc_cats(&str, "⌂"); + break; + case '\x80': + stralloc_cats(&str, "Ç"); + break; + case '\x81': + stralloc_cats(&str, "ü"); + break; + case '\x82': + stralloc_cats(&str, "é"); + break; + case '\x83': + stralloc_cats(&str, "â"); + break; + case '\x84': + stralloc_cats(&str, "ä"); + break; + case '\x85': + stralloc_cats(&str, "à"); + break; + case '\x86': + stralloc_cats(&str, "å"); + break; + case '\x87': + stralloc_cats(&str, "ç"); + break; + case '\x88': + stralloc_cats(&str, "ê"); + break; + case '\x89': + stralloc_cats(&str, "ë"); + break; + case '\x8a': + stralloc_cats(&str, "è"); + break; + case '\x8b': + stralloc_cats(&str, "ï"); + break; + case '\x8c': + stralloc_cats(&str, "î"); + break; + case '\x8d': + stralloc_cats(&str, "ì"); + break; + case '\x8e': + stralloc_cats(&str, "Ä"); + break; + case '\x8f': + stralloc_cats(&str, "Å"); + break; + case '\x90': + stralloc_cats(&str, "É"); + break; + case '\x91': + stralloc_cats(&str, "æ"); + break; + case '\x92': + stralloc_cats(&str, "Æ"); + break; + case '\x93': + stralloc_cats(&str, "ô"); + break; + case '\x94': + stralloc_cats(&str, "ö"); + break; + case '\x95': + stralloc_cats(&str, "ò"); + break; + case '\x96': + stralloc_cats(&str, "û"); + break; + case '\x97': + stralloc_cats(&str, "ù"); + break; + case '\x98': + stralloc_cats(&str, "ÿ"); + break; + case '\x99': + stralloc_cats(&str, "Ö"); + break; + case '\x9a': + stralloc_cats(&str, "Ü"); + break; + case '\x9b': + stralloc_cats(&str, "¢"); + break; + case '\x9c': + stralloc_cats(&str, "£"); + break; + case '\x9d': + stralloc_cats(&str, "¥"); + break; + case '\x9e': + stralloc_cats(&str, "₧"); + break; + case '\x9f': + stralloc_cats(&str, "ƒ"); + break; + case '\xa0': + stralloc_cats(&str, "á"); + break; + case '\xa1': + stralloc_cats(&str, "í"); + break; + case '\xa2': + stralloc_cats(&str, "ó"); + break; + case '\xa3': + stralloc_cats(&str, "ú"); + break; + case '\xa4': + stralloc_cats(&str, "ñ"); + break; + case '\xa5': + stralloc_cats(&str, "Ñ"); + break; + case '\xa6': + stralloc_cats(&str, "ª"); + break; + case '\xa7': + stralloc_cats(&str, "º"); + break; + case '\xa8': + stralloc_cats(&str, "¿"); + break; + case '\xa9': + stralloc_cats(&str, "⌐"); + break; + case '\xaa': + stralloc_cats(&str, "¬"); + break; + case '\xab': + stralloc_cats(&str, "½"); + break; + case '\xac': + stralloc_cats(&str, "¼"); + break; + case '\xad': + stralloc_cats(&str, "¡"); + break; + case '\xae': + stralloc_cats(&str, "«"); + break; + case '\xaf': + stralloc_cats(&str, "»"); + break; + case '\xb0': + stralloc_cats(&str, "░"); + break; + case '\xb1': + stralloc_cats(&str, "▒"); + break; + case '\xb2': + stralloc_cats(&str, "▓"); + break; + case '\xb3': + stralloc_cats(&str, "│"); + break; + case '\xb4': + stralloc_cats(&str, "┤"); + break; + case '\xb5': + stralloc_cats(&str, "╡"); + break; + case '\xb6': + stralloc_cats(&str, "╢"); + break; + case '\xb7': + stralloc_cats(&str, "╖"); + break; + case '\xb8': + stralloc_cats(&str, "╕"); + break; + case '\xb9': + stralloc_cats(&str, "╣"); + break; + case '\xba': + stralloc_cats(&str, "║"); + break; + case '\xbb': + stralloc_cats(&str, "╗"); + break; + case '\xbc': + stralloc_cats(&str, "╝"); + break; + case '\xbd': + stralloc_cats(&str, "╜"); + break; + case '\xbe': + stralloc_cats(&str, "╛"); + break; + case '\xbf': + stralloc_cats(&str, "┐"); + break; + case '\xc0': + stralloc_cats(&str, "└"); + break; + case '\xc1': + stralloc_cats(&str, "┴"); + break; + case '\xc2': + stralloc_cats(&str, "┬"); + break; + case '\xc3': + stralloc_cats(&str, "├"); + break; + case '\xc4': + stralloc_cats(&str, "─"); + break; + case '\xc5': + stralloc_cats(&str, "┼"); + break; + case '\xc6': + stralloc_cats(&str, "╞"); + break; + case '\xc7': + stralloc_cats(&str, "╟"); + break; + case '\xc8': + stralloc_cats(&str, "╚"); + break; + case '\xc9': + stralloc_cats(&str, "╔"); + break; + case '\xca': + stralloc_cats(&str, "╩"); + break; + case '\xcb': + stralloc_cats(&str, "╦"); + break; + case '\xcc': + stralloc_cats(&str, "╠"); + break; + case '\xcd': + stralloc_cats(&str, "═"); + break; + case '\xce': + stralloc_cats(&str, "╬"); + break; + case '\xcf': + stralloc_cats(&str, "╧"); + break; + case '\xd0': + stralloc_cats(&str, "╨"); + break; + case '\xd1': + stralloc_cats(&str, "╤"); + break; + case '\xd2': + stralloc_cats(&str, "╥"); + break; + case '\xd3': + stralloc_cats(&str, "╙"); + break; + case '\xd4': + stralloc_cats(&str, "╛"); + break; + case '\xd5': + stralloc_cats(&str, "╒"); + break; + case '\xd6': + stralloc_cats(&str, "╓"); + break; + case '\xd7': + stralloc_cats(&str, "╫"); + break; + case '\xd8': + stralloc_cats(&str, "╪"); + break; + case '\xd9': + stralloc_cats(&str, "┘"); + break; + case '\xda': + stralloc_cats(&str, "┌"); + break; + case '\xdb': + stralloc_cats(&str, "█"); + break; + case '\xdc': + stralloc_cats(&str, "▄"); + break; + case '\xdd': + stralloc_cats(&str, "▌"); + break; + case '\xde': + stralloc_cats(&str, "▐"); + break; + case '\xdf': + stralloc_cats(&str, "▀"); + break; + case '\xe0': + stralloc_cats(&str, "α"); + break; + case '\xe1': + stralloc_cats(&str, "β"); + break; + case '\xe2': + stralloc_cats(&str, "Γ"); + break; + case '\xe3': + stralloc_cats(&str, "π"); + break; + case '\xe4': + stralloc_cats(&str, "Σ"); + break; + case '\xe5': + stralloc_cats(&str, "σ"); + break; + case '\xe6': + stralloc_cats(&str, "µ"); + break; + case '\xe7': + stralloc_cats(&str, "τ"); + break; + case '\xe8': + stralloc_cats(&str, "Φ"); + break; + case '\xe9': + stralloc_cats(&str, "Θ"); + break; + case '\xea': + stralloc_cats(&str, "Ω"); + break; + case '\xeb': + stralloc_cats(&str, "δ"); + break; + case '\xec': + stralloc_cats(&str, "∞"); + break; + case '\xed': + stralloc_cats(&str, "∅"); + break; + case '\xee': + stralloc_cats(&str, "∈"); + break; + case '\xef': + stralloc_cats(&str, "∩"); + break; + case '\xf0': + stralloc_cats(&str, "≡"); + break; + case '\xf1': + stralloc_cats(&str, "±"); + break; + case '\xf2': + stralloc_cats(&str, "≥"); + break; + case '\xf3': + stralloc_cats(&str, "≤"); + break; + case '\xf4': + stralloc_cats(&str, "⌠"); + break; + case '\xf5': + stralloc_cats(&str, "⌡"); + break; + case '\xf6': + stralloc_cats(&str, "÷"); + break; + case '\xf7': + stralloc_cats(&str, "≈"); + break; + case '\xf8': + stralloc_cats(&str, "°"); + break; + case '\xf9': + stralloc_cats(&str, "∙"); + break; + case '\xfa': + stralloc_cats(&str, "·"); + break; + case '\xfb': + stralloc_cats(&str, "√"); + break; + case '\xfc': + stralloc_cats(&str, "ⁿ"); + break; + case '\xfd': + stralloc_cats(&str, "²"); + break; + case '\xfe': + stralloc_cats(&str, "▪"); + break; + case ' ': + stralloc_cats(&str, " "); + break; default: stralloc_append1(&str, *p); break; } } - + stralloc_0(&str); new_tag->data = str.s; } else { new_tag->tag = strdup(tag); @@ -48,6 +564,14 @@ struct www_tag *www_tag_new(char *tag, char *data) { return new_tag; } +struct www_tag *www_tag_duplicate(struct www_tag *oldtag) { + struct www_tag *newtag = www_tag_new(oldtag->tag, oldtag->data); + for (int i=0;iattribs.len;i++) { + www_tag_add_attrib(newtag, strdup(ptr_vector_get(&oldtag->attribs, i)), strdup(ptr_vector_get(&oldtag->values, i))); + } + return newtag; +} + void www_tag_add_attrib(struct www_tag *tag, char *attrib, char *value) { ptr_vector_append(&tag->attribs, strdup(attrib)); ptr_vector_append(&tag->values, strdup(value)); diff --git a/src/www_tree.h b/src/www_tree.h index d3cb7ba..faae72c 100644 --- a/src/www_tree.h +++ b/src/www_tree.h @@ -15,6 +15,7 @@ struct www_tag { extern struct www_tag *www_tag_new(char *tag, char *data); extern void www_tag_add_attrib(struct www_tag *tag, char *attrib, char *value); +extern struct www_tag *www_tag_duplicate(struct www_tag *oldtag); extern void www_tag_add_child(struct www_tag *tag, struct www_tag *child); extern char *www_tag_unwravel(struct www_tag *tag); #endif