From 2b8a72a9837f548c1a637999173089f0d99d958e Mon Sep 17 00:00:00 2001 From: Paul Gardner-Stephen Date: Thu, 25 Apr 2019 11:37:06 +0930 Subject: [PATCH] refactor text compression routines --- src/compress_text.c | 164 +++++++++++++++++++++++++------------------- 1 file changed, 95 insertions(+), 69 deletions(-) diff --git a/src/compress_text.c b/src/compress_text.c index 090b4084..be2a67dd 100644 --- a/src/compress_text.c +++ b/src/compress_text.c @@ -81,7 +81,7 @@ char *keyword_list[]={ "NOT", // https://www.landsnail.com/a2ref.htm "STEP", // https://www.landsnail.com/a2ref.htm "+", // https://www.landsnail.com/a2ref.htm - "−", // https://www.landsnail.com/a2ref.htm + "-", // https://www.landsnail.com/a2ref.htm "*", // https://www.landsnail.com/a2ref.htm "/", // https://www.landsnail.com/a2ref.htm "^", // https://www.landsnail.com/a2ref.htm @@ -178,7 +178,7 @@ unsigned char packed_words[MAX_LEN]; int packed_len=0; struct char_freq { - char c; + unsigned char c; int count; }; @@ -190,7 +190,8 @@ int cmpfreq(const void *a,const void *b) return 0; } -struct char_freq char_freqs[31]; +#define MAX_CHARS 256 +struct char_freq char_freqs[MAX_CHARS]; int char_max=0; int find_word(char *w) @@ -218,30 +219,103 @@ void end_of_message(void) message_tokens[token_count++]=0xFF; } +int calc_stats(const char *s) +{ + for(int j=0;s[j];j++) + if (s[j]!=' ') { + int char_num=0; + for(char_num=0;char_numMAX_CHARS) { + fprintf(stderr,"Too many unique characters in message list. Max is %d\n",MAX_CHARS); + exit(-1); + } + if (char_num>=char_max) char_max=char_num+1; + char_freqs[char_num].c=s[j]; + char_freqs[char_num].count++; + } + return 0; +} + +int pack_word(const char *w,unsigned char *out,int *len) +{ + int nybl_waiting=0; + int nybl_val=0; + for(int j=0;w[j];j++) { + int char_num; + for(char_num=0;char_num(14+15)) { - fprintf(stderr,"Too many unique characters in message list. Max is 29\n"); - exit(-1); - } - if (char_num>=char_max) char_max=char_num+1; - char_freqs[char_num].c=error_list[i][j]; - char_freqs[char_num].count++; - } - } + for(int i=0;error_list[i];i++) calc_stats(error_list[i]); + for(int i=0;keyword_list[i];i++) calc_stats(keyword_list[i]); + qsort(char_freqs,char_max,sizeof(struct char_freq),cmpfreq); - fprintf(stderr,"Letter frequencies:\n"); - for(int i=0;i