diff --git a/src/art_group.c b/src/art_group.c index ea83098..091c657 100644 --- a/src/art_group.c +++ b/src/art_group.c @@ -600,20 +600,25 @@ void ajoute_reponse_a(Article_List *article) { * de le réallouer, à cause du risque de traduction "statique" */ flrn_char *get_one_header(Article_List *article, Newsgroup_List *newsgroup, flrn_char *name, int *tofree) { - int i,len; + int i,len,rep_a=0; flrn_char *buf; Header_List *parcours; *tofree=0; buf=fl_strchr(name,fl_static(':')); if (buf) len=buf-name; else len=fl_strlen(name); + /* cas particulier de la reponse */ + if (fl_strncasecmp(fl_static(" References"),name,len)==0) { + i = NB_DECODED_HEADERS + REFERENCES_HEADER; + rep_a=1; + } else for (i=0;iheaders==NULL) || ((iheaders->k_headers_checked[i]==0)) || ((i>=NB_KNOWN_HEADERS) && (Last_head_cmd.Article_vu!=article))) { - if (cree_header(article,0,(i==NB_KNOWN_HEADERS), + if (cree_header(article,rep_a,(i==NB_KNOWN_HEADERS), newsgroup==Newsgroup_courant ? 0 : 1)==NULL) return fl_static(""); } @@ -624,6 +629,12 @@ flrn_char *get_one_header(Article_List *article, Newsgroup_List *newsgroup, if (iheaders->reponse_a_checked) + ajoute_reponse_a(article); + if (article->headers->reponse_a==NULL) return fl_static(""); + else return article->headers->reponse_a; + } if (article->headers->k_raw_headers[i-NB_DECODED_HEADERS]==NULL) return fl_static(""); *tofree=0; diff --git a/src/flrn_filter.c b/src/flrn_filter.c index 87be368..8610705 100644 --- a/src/flrn_filter.c +++ b/src/flrn_filter.c @@ -316,7 +316,8 @@ void filter_do_action(flrn_filter *filt) { act=filt->action.action; if (!act) return; while(act) { - call_func(act->command->cmd[CONTEXT_COMMAND],act->command->after); + (void) get_and_execute_command(act->command->cmd[CONTEXT_COMMAND], + act->command, 0); act=act->next; } } diff --git a/src/flrn_inter.c b/src/flrn_inter.c index 522ae26..94877d1 100644 --- a/src/flrn_inter.c +++ b/src/flrn_inter.c @@ -136,13 +136,14 @@ struct file_and_int { static long min_kill_l, max_kill_l; int parse_arg_string(flrn_char *str,int command, int annu16); -/* On prédéfinit ici les fonctions appelés par loop... A l'exception de */ -/* get_command, elles DOIVENT être de la forme int do_* (int res) */ + +/* On prédéfinit ici les fonctions appelés par loop... */ #ifdef USE_SLANG_LANGUAGE -int get_command_command(int get_com, SLang_Name_Type **slang_fun); +int get_command_command(int get_com, SLang_Name_Type **slang_fun, + Cmd_return *ucmd); int Execute_function_slang_command(int, SLang_Name_Type *slang_fun); #else -int get_command_command(int get_com); +int get_command_command(int get_com, Cmd_return *ucmd); #endif int do_deplace(int res); int do_goto(int res); /* renvoie change */ @@ -343,13 +344,7 @@ int loop(flrn_char *opt) { int res=0, quit=0, ret; int to_build=0; /* il faut appeler cree_liste */ int change, a_change=1; - Numeros_List *fin_de_param=NULL; - flrn_char Str_macro[MAX_CHAR_STRING]; -#ifdef USE_SLANG_LANGUAGE - SLang_Name_Type *slang_fun; -#endif - Str_macro[0]=fl_static('\0'); etat_loop.hors_struct=11; etat_loop.etat=etat_loop.num_message=0; etat_loop.Newsgroup_nouveau=NULL; @@ -479,51 +474,11 @@ int loop(flrn_char *opt) { to_build=0; } if (ret<0) ret=0; /* Aff_article_courant a renvoyé une erreur */ - if (etat_loop.next_cmd>=0) { - res=etat_loop.next_cmd; - etat_loop.next_cmd=-1; /* remis à jour ensuite */ - fl_strncpy(Arg_str,Str_macro,99); - if (fin_de_param==NULL) Arg_do_funcs.numlst_flags=0; else - if (fin_de_param->next) fin_de_param->next->numlst_flags=0; - } else { -#ifdef USE_SLANG_LANGUAGE - res=get_command_command(ret-1,&slang_fun); -#else - res=get_command_command(ret-1); -#endif - if ((res>0) && (res & FLCMD_MACRO)) { - fl_strncpy(Str_macro,Arg_str,99); - fin_de_param=&Arg_do_funcs; - if (fin_de_param->numlst_flags==0) fin_de_param=NULL; - else - while ((fin_de_param->next) && - (fin_de_param->next->numlst_flags)) - fin_de_param=fin_de_param->next; - } - } - if ((res >0) && (res & FLCMD_MACRO)) { - int num_macro= res ^FLCMD_MACRO; - res = Flcmd_macro[num_macro].cmd; - res = parse_arg_string(Flcmd_macro[num_macro].arg,res,0); - etat_loop.next_cmd = Flcmd_macro[num_macro].next_cmd; - } - if (res==-2) etat_loop.etat=3; else - if (res==FLCMD_UNDEF) - { etat_loop.etat=2; etat_loop.num_message=-9; } - else -#ifdef USE_SLANG_LANGUAGE - if (res>=NB_FLCMD) - change=Execute_function_slang_command(res-NB_FLCMD, slang_fun); - else -#endif - { - if ((Flcmds[res].cmd_flags & CMD_NEED_GROUP) && - (etat_loop.hors_struct & 8)) { - etat_loop.etat=2; etat_loop.num_message=-3; change=0; - } else - change=(*Flcmds[res].appel)(res); + change=get_and_execute_command(ret, NULL,1); + if (change<0) { + change=0; + quit=1; } - quit=((res==FLCMD_QUIT) || (res==FLCMD_GQUT)); /* si on change de groupe VERS un article non existant, on ne */ /* change pas de groupe */ if ((change) && (etat_loop.num_futur_article!=0) && @@ -604,17 +559,6 @@ void init_Flcmd_rev() { return; } -/* a supprimer dès que possible */ -#if 0 -int fonction_to_number(char *nom) { - int i; - for (i=0;i= 0 : change , < 0 : quit */ +/* si ucmd = NULL, on demande la commande. avec usenxt, on utilise + * etat_loop.next_cmd, sinon on execute les macros à la suite */ +int get_and_execute_command (int ret, Cmd_return *ucmd, int usenxt) { + int res,change=0; + static Numeros_List *fin_de_param=NULL; + static flrn_char Str_macro[MAX_CHAR_STRING]= fl_static(""); +#ifdef USE_SLANG_LANGUAGE + SLang_Name_Type *slang_fun; +#endif + + while (1) { + if ((usenxt) && (etat_loop.next_cmd>=0)) { + res=etat_loop.next_cmd; + etat_loop.next_cmd=-1; /* remis à jour ensuite */ + fl_strncpy(Arg_str,Str_macro,99); + if (fin_de_param==NULL) Arg_do_funcs.numlst_flags=0; else + if (fin_de_param->next) fin_de_param->next->numlst_flags=0; + } else { +#ifdef USE_SLANG_LANGUAGE + res=get_command_command(ret-1,&slang_fun,ucmd); +#else + res=get_command_command(ret-1,ucmd); +#endif + if ((res>0) && (res & FLCMD_MACRO)) { + fl_strncpy(Str_macro,Arg_str,99); + fin_de_param=&Arg_do_funcs; + if (fin_de_param->numlst_flags==0) fin_de_param=NULL; + else + while ((fin_de_param->next) && + (fin_de_param->next->numlst_flags)) + fin_de_param=fin_de_param->next; + } + } + if ((res >0) && (res & FLCMD_MACRO)) { + int num_macro= res ^FLCMD_MACRO; + res = Flcmd_macro[num_macro].cmd; + res = parse_arg_string(Flcmd_macro[num_macro].arg,res,0); + etat_loop.next_cmd = Flcmd_macro[num_macro].next_cmd; + } + if (res==-2) etat_loop.etat=3; else + if (res==FLCMD_UNDEF) + { etat_loop.etat=2; etat_loop.num_message=-9; } + else +#ifdef USE_SLANG_LANGUAGE + if (res>=NB_FLCMD) + change=Execute_function_slang_command(res-NB_FLCMD, slang_fun); + else +#endif + { + if ((Flcmds[res].cmd_flags & CMD_NEED_GROUP) && + (etat_loop.hors_struct & 8)) { + etat_loop.etat=2; etat_loop.num_message=-3; change=0; + } else + change=(*Flcmds[res].appel)(res); + } + if ((usenxt==1) || (etat_loop.next_cmd<0)) break; + } + return (((res==FLCMD_QUIT) || (res==FLCMD_GQUT)) ? -1 : change); +} /* Prend une commande pour loop... Renvoie le code de la commande frappe */ /* Renvoie -1 si commande non défini */ /* -2 si rien */ /* -3 si l'état est déjà défini... */ /* -4 si on renvoie en fait une fonction slang */ -int get_command_command(int get_com #ifdef USE_SLANG_LANGUAGE - , SLang_Name_Type **slang_fun +int get_command_command(int get_com, SLang_Name_Type **slang_fun, Cmd_return *ucmd) +#else +int get_command_command(int get_com, Cmd_return *ucmd) #endif -) { +{ int res, res2; struct key_entry key; #ifdef USE_SLANG_LANGUAGE @@ -956,13 +962,16 @@ int get_command_command(int get_com Attend_touche(&key); if (KeyBoard_Quit) return -1; res=get_command(&key,CONTEXT_COMMAND,-1,&une_commande); - } else res=get_com; + } else { + res=get_com; + if (ucmd!=NULL) memcpy(&une_commande,ucmd,sizeof(Cmd_return)); + } if (res<0) { if ((res==-1) && (une_commande.cmd_ret_flags & CMD_RET_KEEP_DESC)) { save_command(&une_commande); } - if (une_commande.before) free(une_commande.before); - if (une_commande.after) free(une_commande.after); + if ((!ucmd) && (une_commande.before)) free(une_commande.before); + if ((!ucmd) && (une_commande.after)) free(une_commande.after); return res; } /* res = 0 */ @@ -970,14 +979,14 @@ int get_command_command(int get_com if (une_commande.fun_slang) { if (debug) { fprintf(stderr,"slang parse: %s\n",une_commande.fun_slang); } *slang_fun = Parse_fun_slang(une_commande.fun_slang, &a); - free(une_commande.fun_slang); + if (!ucmd) free(une_commande.fun_slang); une_commande.fun_slang=NULL; if (*slang_fun==NULL) { if (une_commande.cmd_ret_flags & CMD_RET_KEEP_DESC) { save_command(&une_commande); } - if (une_commande.before) free(une_commande.before); - if (une_commande.after) free(une_commande.after); + if ((!ucmd) && (une_commande.before)) free(une_commande.before); + if ((!ucmd) && (une_commande.after)) free(une_commande.after); return -1; } res2=NB_FLCMD+a; /* pour signifier une fonction slang , @@ -992,7 +1001,7 @@ int get_command_command(int get_com save_command(&une_commande); une_commande.cmd_ret_flags &= ~CMD_RET_KEEP_DESC; res2=parse_arg_string(une_commande.after,res2,1); - free(une_commande.after); + if (!ucmd) free(une_commande.after); } #ifdef USE_SLANG_LANGUAGE if ((res2!=FLCMD_UNDEF) && (res2 & FLCMD_MACRO)) { @@ -1002,7 +1011,7 @@ int get_command_command(int get_com if (res3>=NB_FLCMD) { /* fonction SLANG */ *slang_fun = Parse_fun_slang(Flcmd_macro[res4].fun_slang, &a); - if ((Flcmd_macro[res4].arg==NULL) && + if ((!ucmd) && (Flcmd_macro[res4].arg==NULL) && (((res3-NB_FLCMD) & 1) || ( ((!Options.forum_mode) && ((res3-NB_FLCMD) & 8)) || ((Options.forum_mode) && ((res3-NB_FLCMD) & 4)) ))) { @@ -1022,7 +1031,7 @@ int get_command_command(int get_com if (res==-1) res2=-2; } } - if (une_commande.before) free(une_commande.before); + if ((!ucmd) && (une_commande.before)) free(une_commande.before); return res2; } diff --git a/src/flrn_inter.h b/src/flrn_inter.h index 7d680fe..340acab 100644 --- a/src/flrn_inter.h +++ b/src/flrn_inter.h @@ -43,7 +43,7 @@ typedef struct command_desc { /* Les fonctions : */ -extern int call_func(int, flrn_char *); +extern int get_and_execute_command (int, Cmd_return *, int ); extern int loop(flrn_char * ); extern int aff_opt_c(flrn_char *, int); extern void init_Flcmd_rev(void); diff --git a/src/slang_flrn.c b/src/slang_flrn.c index 775a468..0121444 100644 --- a/src/slang_flrn.c +++ b/src/slang_flrn.c @@ -195,9 +195,7 @@ static char *Article_Type_string_callback(unsigned char type, VOID_STAR addr) } static void Article_Type_destroy_callback(unsigned char type, VOID_STAR addr) { - SLang_MMT_Type *bla = *((SLang_MMT_Type **)addr); - Article_and_Group *larticle = - (Article_and_Group *)SLang_object_from_mmt(bla); + Article_and_Group *larticle = (Article_and_Group *)addr; if (larticle) free(larticle); return; } @@ -288,6 +286,34 @@ int intrin_get_option(char *param) { return ret; } +int intrin_get_flags_article(Article_and_Group *larticle) { + if ((larticle==NULL) || (larticle->article==NULL)) return -1; + return (int)(larticle->article->art_flags & 0x7F); +} + +int intrin_set_flags_article(Article_and_Group *larticle, int *newflag) { + int oldflags; + Article_List *art; + if ((larticle==NULL) || (larticle->article==NULL)) return -1; + art = larticle->article; + oldflags = art->art_flags; + art->art_flags = (art->art_flags & (~0x7F)) | (*newflag & 0x7F); + if (art->art_flags & FLAG_KILLED) + art->art_flags |= FLAG_READ; + if (art->art_flags & FLAG_READ) + art->art_flags &= ~FLAG_IMPORTANT; + if ((art->numero>=0) && (larticle->groupe->not_read>=0)) { + if ((oldflags ^ art->art_flags) & FLAG_READ) { + larticle->groupe->not_read += ((oldflags & FLAG_READ) ? 1 : -1); + if (art->thread) art->thread->non_lu += + ((oldflags & FLAG_READ) ? 1 : -1); + } + if ((oldflags ^ art->art_flags) & FLAG_IMPORTANT) + larticle->groupe->important += ((oldflags & FLAG_IMPORTANT) ? + -1 : 1); + } + return (int)(art->art_flags & 0x7F); +} SLang_Intrin_Fun_Type flrn_Intrin_Fun [] = { @@ -295,6 +321,12 @@ SLang_Intrin_Fun_Type flrn_Intrin_Fun [] = /* 1) obtenir l'entête d'un article */ MAKE_INTRINSIC_2("get_header", intrin_get_header, SLANG_STRING_TYPE, ARTICLE_TYPE_NUMBER, SLANG_STRING_TYPE), +/* 2) obtenir l'état d'un article */ + MAKE_INTRINSIC_1("get_flags_article", intrin_get_flags_article, + SLANG_INT_TYPE, ARTICLE_TYPE_NUMBER), +/* 3) changer l'état d'un article */ + MAKE_INTRINSIC_2("set_flags_article", intrin_set_flags_article, + SLANG_INT_TYPE, ARTICLE_TYPE_NUMBER, SLANG_INT_TYPE), /*** Groupes ***/ /* 1) obtenir l'état actuel d'un groupe */ MAKE_INTRINSIC_1("get_flags_group", intrin_get_flags_group, SLANG_INT_TYPE, diff --git a/src/version.c b/src/version.c index a964023..5624e98 100644 --- a/src/version.c +++ b/src/version.c @@ -25,7 +25,7 @@ char version_string[]= char short_version_string[]= "Flrn (0.9.1 - 05/04)"; -int version_number=90; +int version_number=91; void print_version_defines(FILE *out) {