Index: src/art.c =================================================================== RCS file: /usr/local/cvsroot/slrn/src/art.c,v retrieving revision 1.1.1.4 retrieving revision 1.7 diff -u -r1.1.1.4 -r1.7 --- src/art.c 6 Jun 2002 12:33:15 -0000 1.1.1.4 +++ src/art.c 6 Jun 2002 12:43:25 -0000 1.7 @@ -81,6 +81,7 @@ SLKeyMap_List_Type *Slrn_Article_Keymap; char *Slrn_X_Browser; char *Slrn_NonX_Browser; +char *Slrn_Short_Initial_Str; char *Slrn_Quote_String; char *Slrn_Save_Directory; char *Slrn_Header_Help_Line; @@ -94,6 +95,10 @@ char *Slrn_Followup_Date_Format; int Slrn_Use_Localtime = 1; +int Slrn_Quote_Style = 0; +int Slrn_Make_Golded_Initial = 0; +int Slrn_Make_Short_Initial = 0; +int Slrn_Kill_Double_Quote = 0; int Slrn_Emphasized_Text_Mode = 3; #define EMPHASIZE_ARTICLE 1 #define EMPHASIZE_QUOTES 2 @@ -234,6 +239,9 @@ #if SLRN_HAS_SPOILERS static void show_spoilers (void); #endif +static char *slrn_test_initial (char *s); +static char *slrn_cut_initial (char *s); +static char *slrn_make_initial (char *s); /*}}}*/ /*{{{ portability functions */ @@ -1926,9 +1934,17 @@ if (*buf == '\0') { - slrn_strncpy (buf, from, sizeof (buf)); + if ( (*(f = from) == '<') && ((p = strchr (from, '>')) != NULL) ) + { + size_t len = p-from; + slrn_strncpy (buf, from+1, len < sizeof (buf) ? len : sizeof (buf)); + } + else + { + slrn_strncpy (buf, from, sizeof (buf)); + } } - + if (*buf != '\0') { f = buf + strlen (buf) - 1; @@ -2591,6 +2607,8 @@ char file[256]; unsigned int n, wrap; char *quote_str; + char *make_initial; + char *add_slrn_quote_string, *add_slrn_initial_string; if ((-1 == slrn_check_batch ()) || (-1 == select_affected_article (MIME_DISPLAY)) @@ -2711,13 +2729,48 @@ if (NULL == (quote_str = Slrn_Quote_String)) quote_str = ">"; + make_initial = slrn_make_initial (from_t); while (l != NULL) { int smart_space = (Slrn_Smart_Quote & 0x01) && ! (l->flags & QUOTE_LINE); if ((*l->buf == 0) && (Slrn_Smart_Quote & 0x02)) fputc ('\n', fp); else - fprintf (fp, "%s%s%s\n", quote_str, (smart_space)? " " : "" , l->buf); + if (Slrn_Quote_Style == 0) + fprintf (fp, "%s%s%s\n", quote_str, (smart_space)? " " : "" , l->buf); + else + { + int line_empty=1; + char *lc; + for (lc=l->buf; *lc!=0; lc++) + if( !isspace(*lc) ) { line_empty=0; break; } + + if (line_empty) { + fprintf(fp,"\n"); + } + else if (NULL == (add_slrn_quote_string = slrn_test_initial (l->buf))) + { + fprintf (fp, "%s%s%s%s%s\n", + " ", + make_initial, + quote_str, + (smart_space)? " " : "" , + l->buf); + } + else + { + add_slrn_initial_string = slrn_cut_initial (l->buf); + fprintf (fp, "%s%s%s", " ", add_slrn_initial_string, quote_str); + if (Slrn_Make_Golded_Initial) + fprintf (fp, "%s", quote_str); + else + fprintf (fp, "%s", + ((0 == strcmp (add_slrn_initial_string, make_initial)) ? quote_str : "")); + fprintf (fp, "%s%s\n", + (smart_space)? " " : "" , + add_slrn_quote_string); + } + } l = l->next; } @@ -2737,6 +2790,175 @@ /*}}}*/ +static char *slrn_test_initial (char *s) +{ + register char ch; + unsigned int fl = 0; + char *tmp; + + if (s == NULL) return NULL; + while (((ch = *s) != 0) && (fl != 255)) + { + switch (ch) + { + case '>': + if ((fl > 3) && (fl != 127)) fl = 255; + if (fl < 3) + { + if (Slrn_Kill_Double_Quote == 0) fl = 255; + else + { + tmp = s; + fl = 3; + } + } + break; + case '\t': + case ' ': + if ((fl == 1) || (fl == 3) || (fl == 5)) fl += 1; + break; + default: + if (fl == 6) + { + s = tmp; + fl = 255; + } + if ((fl == 3) || (fl == 4)) fl = 5; + if (fl == 2) fl = 127; + if (fl == 0) fl = 1; + break; + } + s++; + } + if ((fl > 2) && (fl < 7)) return ++tmp; + if (fl == 255) return s; + return NULL; +} + +static char *slrn_cut_initial (char *s) +{ + char *tmp, *cutin; + register char ch; + unsigned int fl = 0, n = 0; + + if (s == NULL) return NULL; + cutin = SLmalloc (strlen (s) + 1); + while (((ch = *s) != 0) && (fl != 255)) + { + switch (ch) + { + case '>': + if ((fl > 3) && (fl != 127)) + { + cutin[n] = 0; + fl = 255; + } + if (fl < 3) + { + cutin[n] = 0; + if (Slrn_Kill_Double_Quote == 0) fl = 255; + else + { + tmp = strdup (cutin); + n = 0; + fl = 3; + } + } + break; + case '\t': + case ' ': + if ((fl == 1) || (fl == 3) || (fl == 5)) fl += 1; + break; + default: + if (fl == 6) + { + cutin = strdup (tmp); + fl = 255; + } + if ((fl == 3) || (fl == 4)) fl = 5; + if (fl == 2) fl = 127; + if (fl == 0) fl = 1; + if (((fl == 1) || (fl == 5)) && (ch > 0x1f)) cutin[n++] = ch; + break; + } + s++; + } + if ((fl > 2) && (fl < 7)) return tmp; + if (fl == 255) return cutin; + return NULL; +} + +static char *slrn_make_initial (char *s) +{ + char *tmp, *makein; + register char ch; + unsigned int fl = 1, n = 0; + unsigned int realname_len = 0; + + if(Slrn_Current_Header!=NULL) + realname_len=strlen(Slrn_Current_Header->realname); + + if (NULL == (tmp = slrn_strcut (s, '@'))) + if (realname_len == 0) + return NULL; + + if ((Slrn_Quote_Style == 1) && (realname_len != 0)) + { + s = SLmalloc (realname_len); + strncpy (s, Slrn_Current_Header->realname, realname_len); + *(s + realname_len) = 0; + if (NULL == (tmp = slrn_strcut (s, '@'))) tmp = s; + } + + if ((NULL == slrn_strcut (tmp, '_')) && + (NULL == slrn_strcut (tmp, '.')) && + (NULL == slrn_strcut (tmp, ' '))) + { + if ((Slrn_Short_Initial_Str == NULL) || + (strstr (s, Slrn_Short_Initial_Str) != NULL)) + { + if (Slrn_Make_Short_Initial == 1) + { + makein = SLmalloc (2); + makein[0] = *s; + makein[1] = 0; + return makein; + } + if (Slrn_Make_Short_Initial == 2) return tmp; + } + makein = SLmalloc (strlen (s) + 1); + while ((ch = *s) != 0) { + if ((fl == 1) && (ch != '@') && (ch != '.') && + (ch != '-') && (ch != ' ')) + { + makein[n++] = ch; + fl = 0; + } + if ((ch == '@') || (ch == '.') || + (ch == '-') || (ch == ' ')) fl = 1; + s++; + } + } + else + { + makein = SLmalloc (strlen (tmp) + 1); + while ((ch = *tmp) != 0) + { + if ((fl == 1) && (ch != '_') && (ch != '.') && + (ch != '-') && (ch != ' ')) + { + makein[n++] = ch; + fl = 0; + } + if ((ch == '_') || (ch == '.') || + (ch == '-') || (ch == ' ')) fl = 1; + tmp++; + } + } + makein[n] = 0; + return makein; +} + static void reply_cmd (void) /*{{{*/ { if (-1 == slrn_check_batch ()) @@ -2868,6 +3090,9 @@ #endif int strip_sig, rsp, wrap; + char *make_initial; + char *add_slrn_quote_string, *add_slrn_initial_string; + /* The perform_cc testing is ugly. Is there an easier way?? */ if ((-1 == slrn_check_batch ()) || @@ -3217,6 +3442,7 @@ else if (NULL == (quote_str = Slrn_Quote_String)) quote_str = ">"; + make_initial = slrn_make_initial (cc_address_t); while (l != NULL) { int smart_space = (Slrn_Smart_Quote & 0x01) && ! (l->flags & QUOTE_LINE) && prefix_arg != 2; @@ -3228,8 +3454,41 @@ if ((*l->buf == 0) && (Slrn_Smart_Quote & 0x02)) fputc ('\n', fp); else - fprintf (fp, "%s%s%s\n", quote_str, (smart_space)? " " : "" , l->buf); - + if ((Slrn_Quote_Style == 0) || (prefix_arg == 2)) + fprintf (fp, "%s%s%s\n", quote_str, (smart_space)? " " : "" , l->buf); + else + { + int line_empty=1; + char *lc; + for (lc=l->buf; *lc!=0; lc++) + if( !isspace(*lc) ) { line_empty=0; break; } + + if (line_empty) { + fprintf(fp,"\n"); + } + else if (NULL == (add_slrn_quote_string = slrn_test_initial (l->buf))) + { + fprintf (fp, "%s%s%s%s%s\n", + " ", + make_initial, + quote_str, + (smart_space)? " " : "" , + l->buf); + } + else + { + add_slrn_initial_string = slrn_cut_initial (l->buf); + fprintf (fp, "%s%s%s", " ", add_slrn_initial_string, quote_str); + if (Slrn_Make_Golded_Initial) + fprintf (fp, "%s", quote_str); + else + fprintf (fp, "%s", + ((0 == strcmp (add_slrn_initial_string, make_initial)) ? quote_str : "")); + fprintf (fp, "%s%s\n", + (smart_space)? " " : "" , + add_slrn_quote_string); + } + } l = l->next; } Index: src/art.h =================================================================== RCS file: /usr/local/cvsroot/slrn/src/art.h,v retrieving revision 1.1.1.4 retrieving revision 1.4 diff -u -r1.1.1.4 -r1.4 --- src/art.h 6 Jun 2002 12:33:16 -0000 1.1.1.4 +++ src/art.h 6 Jun 2002 12:43:25 -0000 1.4 @@ -26,6 +26,7 @@ extern int slrn_insert_followup_format (char *, FILE *); extern void slrn_subject_strip_was (char *); extern SLKeyMap_List_Type *Slrn_Article_Keymap; +extern char *Slrn_Short_Initial_Str; extern char *Slrn_Quote_String; extern char *Slrn_Save_Directory; extern char *Slrn_Header_Help_Line; @@ -70,6 +71,10 @@ #endif extern int Slrn_Use_Tildes; extern int Slrn_Generate_Email_From; +extern int Slrn_Quote_Style; +extern int Slrn_Make_Short_Initial; +extern int Slrn_Make_Golded_Initial; +extern int Slrn_Kill_Double_Quote; extern int Slrn_Emphasized_Text_Mode; extern int Slrn_Emphasized_Text_Mask; extern int Slrn_Highlight_Urls; Index: src/startup.c =================================================================== RCS file: /usr/local/cvsroot/slrn/src/startup.c,v retrieving revision 1.1.1.4 diff -u -r1.1.1.4 startup.c --- src/startup.c 6 Jun 2002 12:33:16 -0000 1.1.1.4 +++ src/startup.c 6 Jun 2002 13:40:24 -0000 @@ -468,6 +468,10 @@ {"hide_signature", &Slrn_Signature_Hidden}, {"hide_pgpsignature", &Slrn_Pgp_Signature_Hidden}, {"hide_quotes", &Slrn_Quotes_Hidden_Mode}, + {"quote_style", &Slrn_Quote_Style}, + {"make_short_initial", &Slrn_Make_Short_Initial}, + {"make_golded_initial", &Slrn_Make_Golded_Initial}, + {"kill_double_quote", &Slrn_Kill_Double_Quote}, {"emphasized_text_mask", &Slrn_Emphasized_Text_Mask}, {"emphasized_text_mode", &Slrn_Emphasized_Text_Mode}, {"process_verbatim_marks", &Slrn_Process_Verbatim_Marks}, @@ -620,6 +624,7 @@ {"header_help_line", &Slrn_Header_Help_Line}, {"header_status_line", &Slrn_Header_Status_Line}, {"group_help_line", &Slrn_Group_Help_Line}, + {"short_initial_str", &Slrn_Short_Initial_Str}, {"quote_string", &Slrn_Quote_String}, {"replyto", &Slrn_User_Info.replyto}, {"organization", &Slrn_User_Info.org}, Index: src/util.c =================================================================== RCS file: /usr/local/cvsroot/slrn/src/util.c,v retrieving revision 1.1.1.2 diff -u -r1.1.1.2 util.c --- src/util.c 24 Nov 2001 20:24:58 -0000 1.1.1.2 +++ src/util.c 6 Jun 2002 13:40:25 -0000 @@ -101,6 +101,19 @@ /*}}}*/ +char *slrn_strcut (char *s, char ch) /*{{{*/ +{ + char *strcut, *p; + unsigned int i; + + if (NULL == (p = slrn_strchr (s, ch))) return NULL; + i = (unsigned) p - (unsigned) s; + strcut = slrn_strnmalloc (s, i, 0); + return strncpy (strcut, s, i); +} + +/*}}}*/ + /* Search for characters from list in string str. If found, return a pointer * to the first occurrence. If not found, return NULL. */ char *slrn_strbrk (char *str, char *list) /*{{{*/ Index: src/util.h =================================================================== RCS file: /usr/local/cvsroot/slrn/src/util.h,v retrieving revision 1.1.1.2 retrieving revision 1.3 diff -u -r1.1.1.2 -r1.3 --- src/util.h 24 Nov 2001 20:25:03 -0000 1.1.1.2 +++ src/util.h 24 Nov 2001 21:56:48 -0000 1.3 @@ -47,6 +47,7 @@ extern char *slrn_simple_strtok (char *, char *); extern char *slrn_strchr (char *, char); +extern char *slrn_strcut (char *, char); extern char *slrn_skip_whitespace (char *s); extern char *slrn_bskip_whitespace (char *s); extern char *slrn_trim_string (char *s);