From 2d7d585fcce413e4afcd7fb17d8fae7c06f47cde Mon Sep 17 00:00:00 2001 From: Andrew Pamment Date: Thu, 30 Mar 2017 22:49:49 +1000 Subject: [PATCH] experimental ansi messages in www --- Makefile.freebsd | 2 +- Makefile.freebsd.WWW | 2 +- Makefile.linux.WWW | 2 +- Makefile.netbsd.WWW | 2 +- Makefile.osx.WWW | 2 +- bbs.h | 1 + deps/aha/aha.c | 363 +++++++++++++++++++++++++++++++++++++++++++ www_msgs.c | 37 ++--- 8 files changed, 388 insertions(+), 23 deletions(-) create mode 100644 deps/aha/aha.c diff --git a/Makefile.freebsd b/Makefile.freebsd index ed62b49..b014174 100644 --- a/Makefile.freebsd +++ b/Makefile.freebsd @@ -29,7 +29,7 @@ $(CDK): cd deps/cdk-5.0-20161210/ && export CPPFLAGS=-I/usr/local/include && ./configure --with-ncurses cd deps/cdk-5.0-20161210/ && $(MAKE) -OBJ = inih/ini.o bbs.o main.o users.o main_menu.o mail_menu.o doors.o bbs_list.o chat_system.o email.o files.o settings.o lua_glue.o strings.o bluewave.o hashmap/hashmap.o +OBJ = inih/ini.o bbs.o main.o users.o main_menu.o mail_menu.o doors.o bbs_list.o chat_system.o email.o files.o settings.o lua_glue.o strings.o bluewave.o hashmap/hashmap.o %.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS) diff --git a/Makefile.freebsd.WWW b/Makefile.freebsd.WWW index 2907c42..ed0409d 100644 --- a/Makefile.freebsd.WWW +++ b/Makefile.freebsd.WWW @@ -34,7 +34,7 @@ $(CDK): cd deps/cdk-5.0-20161210/ && export CPPFLAGS=-I/usr/local/include && ./configure --with-ncurses cd deps/cdk-5.0-20161210/ && $(MAKE) -OBJ = inih/ini.o bbs.o main.o users.o main_menu.o mail_menu.o doors.o bbs_list.o chat_system.o email.o files.o settings.o lua_glue.o strings.o bluewave.o www.o www_email.o www_msgs.o www_last10.o hashmap/hashmap.o +OBJ = deps/aha/aha.o inih/ini.o bbs.o main.o users.o main_menu.o mail_menu.o doors.o bbs_list.o chat_system.o email.o files.o settings.o lua_glue.o strings.o bluewave.o www.o www_email.o www_msgs.o www_last10.o hashmap/hashmap.o %.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS) diff --git a/Makefile.linux.WWW b/Makefile.linux.WWW index 65c9098..fe2ade6 100644 --- a/Makefile.linux.WWW +++ b/Makefile.linux.WWW @@ -34,7 +34,7 @@ $(CDK): cd deps/cdk-5.0-20161210/ && ./configure cd deps/cdk-5.0-20161210/ && $(MAKE) -OBJ = inih/ini.o bbs.o main.o users.o main_menu.o mail_menu.o doors.o bbs_list.o chat_system.o email.o files.o settings.o lua_glue.o strings.o www.o www_email.o www_msgs.o www_last10.o bluewave.o hashmap/hashmap.o +OBJ = deps/aha/aha.o inih/ini.o bbs.o main.o users.o main_menu.o mail_menu.o doors.o bbs_list.o chat_system.o email.o files.o settings.o lua_glue.o strings.o www.o www_email.o www_msgs.o www_last10.o bluewave.o hashmap/hashmap.o %.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS) diff --git a/Makefile.netbsd.WWW b/Makefile.netbsd.WWW index 0b748ed..82b9a7f 100644 --- a/Makefile.netbsd.WWW +++ b/Makefile.netbsd.WWW @@ -34,7 +34,7 @@ $(CDK): cd deps/cdk-5.0-20161210/ && export CPPFLAGS=-I/usr/pkg/include && ./configure --with-ncurses cd deps/cdk-5.0-20161210/ && $(MAKE) -OBJ = inih/ini.o bbs.o main.o users.o main_menu.o mail_menu.o doors.o bbs_list.o chat_system.o email.o files.o settings.o lua_glue.o strings.o bluewave.o www.o www_email.o www_msgs.o www_last10.o hashmap/hashmap.o +OBJ = deps/aha/aha.o inih/ini.o bbs.o main.o users.o main_menu.o mail_menu.o doors.o bbs_list.o chat_system.o email.o files.o settings.o lua_glue.o strings.o bluewave.o www.o www_email.o www_msgs.o www_last10.o hashmap/hashmap.o %.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS) diff --git a/Makefile.osx.WWW b/Makefile.osx.WWW index 147e1b7..94e2924 100644 --- a/Makefile.osx.WWW +++ b/Makefile.osx.WWW @@ -34,7 +34,7 @@ $(CDK): cd deps/cdk-5.0-20161210/ && ./configure cd deps/cdk-5.0-20161210/ && $(MAKE) -OBJ = inih/ini.o bbs.o main.o users.o main_menu.o mail_menu.o doors.o bbs_list.o chat_system.o email.o files.o settings.o lua_glue.o strings.o www.o www_email.o www_msgs.o www_last10.o bluewave.o hashmap/hashmap.o +OBJ = deps/aha/aha.o inih/ini.o bbs.o main.o users.o main_menu.o mail_menu.o doors.o bbs_list.o chat_system.o email.o files.o settings.o lua_glue.o strings.o www.o www_email.o www_msgs.o www_last10.o bluewave.o hashmap/hashmap.o %.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS) diff --git a/bbs.h b/bbs.h index 3c10e27..32281e4 100644 --- a/bbs.h +++ b/bbs.h @@ -258,6 +258,7 @@ extern int msg_is_to(struct user_record *user, char *addressed_to, char *address extern int msg_is_from(struct user_record *user, char *addressed_from, char *address, int type, int rn, int msgconf); extern unsigned long generate_msgid(); + extern int door_menu(struct user_record *user); extern void rundoor(struct user_record *user, char *cmd, int stdio); extern void runexternal(struct user_record *user, char *cmd, int stdio, char **argv, char *cwd, int raw); diff --git a/deps/aha/aha.c b/deps/aha/aha.c new file mode 100644 index 0000000..5696a30 --- /dev/null +++ b/deps/aha/aha.c @@ -0,0 +1,363 @@ +/* + The contents of this file are subject to the Mozilla Public License + Version 1.1 (the "License"); you may not use this file except in + compliance with the License. You may obtain a copy of the License at + http://www.mozilla.org/MPL/ + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + License for the specific language governing rights and limitations + under the License. + + Alternatively, the contents of this file may be used under the terms + of the GNU Lesser General Public license version 2 or later (LGPL2+), + in which case the provisions of LGPL License are applicable instead of + those above. + + For feedback and questions about my Files and Projects please mail me, + Alexander Matthes (Ziz) , ziz_at_mailbox.org +*/ +#include +#include +#include + +extern void unmangle_ansi(char *body, int len, char **body_out, int *body_len); + +typedef struct selem *pelem; +typedef struct selem { + unsigned char digit[8]; + unsigned char digitcount; + pelem next; +} telem; + +pelem parseInsert(char* s) +{ + pelem firstelem=NULL; + pelem momelem=NULL; + unsigned char digit[8]; + unsigned char digitcount=0; + int pos=0; + for (pos=0;pos<1024;pos++) + { + if (s[pos]=='[') + continue; + if (s[pos]==';' || s[pos]==0) + { + if (digitcount==0) + { + digit[0]=0; + digitcount=1; + } + + pelem newelem=(pelem)malloc(sizeof(telem)); + for (unsigned char a=0;a<8;a++) + newelem->digit[a]=digit[a]; + newelem->digitcount=digitcount; + newelem->next=NULL; + if (momelem==NULL) + firstelem=newelem; + else + momelem->next=newelem; + momelem=newelem; + digitcount=0; + memset(digit,0,8); + if (s[pos]==0) + break; + } + else + if (digitcount<8) + { + digit[digitcount]=s[pos]-'0'; + digitcount++; + } + } + return firstelem; +} + +void deleteParse(pelem elem) +{ + while (elem!=NULL) + { + pelem temp=elem->next; + free(elem); + elem=temp; + } +} + +void append_output(char *output, char *stuff, int *size, int *at) { + if (*at + strlen(stuff) + 1 >= *size) { + *size += 256; + output = realloc(output, *size); + } + + strcat(output, stuff); + *at += strlen(stuff); +} + +char * aha(char *input) +{ + //Searching Parameters + char *unmangle_out; + int unmangle_out_len; + unmangle_ansi(input, strlen(input), &unmangle_out, &unmangle_out_len); + + //Begin of Conversion + unsigned int c; + int fc = -1; //Standard Foreground Color //IRC-Color+8 + int bc = -1; //Standard Background Color //IRC-Color+8 + int ul = 0; //Not underlined + int bo = 0; //Not bold + int bl = 0; //No Blinking + int ofc,obc,oul,obo,obl; //old values + int line=0; + int momline=0; + int newline=-1; + int temp; + char *ptr = unmangle_out; + char *output = (char *)malloc(256); + int size; + int outat = 0; + char minibuf[2]; + while (*ptr != '\0') + { + c = *ptr++; + if (c=='\033') + { + //Saving old values + ofc=fc; + obc=bc; + oul=ul; + obo=bo; + obl=bl; + //Searching the end (a letter) and safe the insert: + c= *ptr++; + if ( c == '[' ) // CSI code, see https://en.wikipedia.org/wiki/ANSI_escape_code#Colors + { + char buffer[1024]; + buffer[0] = '['; + int counter=1; + while ((c<'A') || ((c>'Z') && (c<'a')) || (c>'z')) + { + c=*ptr++; + buffer[counter]=c; + if (c=='>') //end of htop + break; + counter++; + if (counter>1022) + break; + } + buffer[counter-1]=0; + pelem elem; + switch (c) + { + case 'm': + //printf("\n%s\n",buffer); //DEBUG + elem=parseInsert(buffer); + pelem momelem=elem; + while (momelem!=NULL) + { + //jump over zeros + int mompos=0; + while (momposdigitcount && momelem->digit[mompos]==0) + mompos++; + if (mompos==momelem->digitcount) //only zeros => delete all + { + bo=0;ul=0;bl=0;fc=-1;bc=-1; + } + else + { + switch (momelem->digit[mompos]) + { + case 1: if (mompos+1==momelem->digitcount) // 1, 1X not supported + bo=1; + break; + case 2: if (mompos+1digitcount) // 2X, 2 not supported + switch (momelem->digit[mompos+1]) + { + case 1: //Reset and double underline (which aha doesn't support) + case 2: //Reset bold + bo=0; + break; + case 4: //Reset underline + ul=0; + break; + case 5: //Reset blink + bl=0; + break; + case 7: //Reset Inverted + if (bc == -1) + bc = 8; + if (fc == -1) + fc = 9; + temp = bc; + bc = fc; + fc = temp; + break; + } + break; + case 3: if (mompos+1digitcount) // 3X, 3 not supported + fc=momelem->digit[mompos+1]; + break; + case 4: if (mompos+1==momelem->digitcount) // 4 + ul=1; + else // 4X + bc=momelem->digit[mompos+1]; + break; + case 5: if (mompos+1==momelem->digitcount) //5, 5X not supported + bl=1; + break; + //6 and 6X not supported at all + case 7: if (bc == -1) //7, 7X is mot defined (and supported) + bc = 8; + if (fc == -1) + fc = 9; + temp = bc; + bc = fc; + fc = temp; + break; + //8 and 9 not supported + } + } + momelem=momelem->next; + } + deleteParse(elem); + break; + } + //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, "", &size, &outat); + } + } + } + } + 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 '&': append_output(output, "&", &size, &outat); break; + case '\"': 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; + default: { + sprintf(minibuf, "%c", c); + append_output(output, minibuf, &size, &outat); + } + } + } + } + + //Footer + if ((fc!=-1) || (bc!=-1) || (ul!=0) || (bo!=0) || (bl!=0)) + append_output(output, "\n", &size, &outat); + + return 0; +} diff --git a/www_msgs.c b/www_msgs.c index ab60317..49aa348 100644 --- a/www_msgs.c +++ b/www_msgs.c @@ -12,7 +12,7 @@ #define IN 0 #define OUT 1 - +extern char * aha(char *input); extern struct bbs_config conf; static int new_messages(struct user_record *user, int conference, int area) { @@ -269,6 +269,10 @@ char *www_msgs_messageview(struct user_record *user, int conference, int area, i char buffer[4096]; int chars; int i; + + char *aha_text; + char *aha_out; + if (conference < 0 || conference >= conf.mail_conference_count || area < 0 || area >= conf.mail_conferences[conference]->mail_area_count) { return NULL; } @@ -461,23 +465,20 @@ char *www_msgs_messageview(struct user_record *user, int conference, int area, i len += strlen(buffer); - for (z=0;z"); - } else if (body[z] == '<') { - sprintf(buffer, "<"); - } else if (body[z] == '>') { - sprintf(buffer, ">"); - } else { - sprintf(buffer, "%c", body[z]); - } - if (len + strlen(buffer) > max_len - 1) { - max_len += 4096; - page = (char *)realloc(page, max_len); - } - strcat(page, buffer); - len += strlen(buffer); - } + aha_text = (char *)malloc(jmh.TxtLen + 1); + + memcpy(aha_text, body, jmh.TxtLen); + aha_text[jmh.TxtLen] = '\0'; + + aha_out = aha(aha_text); + + while (len + strlen(aha_out) > max_len - 1) { + max_len += 4096; + page = (char *)realloc(page, max_len); + } + strcat(page, aha_out); + len += strlen(aha_out); + sprintf(buffer, "\n"); if (len + strlen(buffer) > max_len - 1) {