Skip to content

Commit

Permalink
ajout de fonctions slang, petite refonte du mode commande pour gerer les
Browse files Browse the repository at this point in the history
macros (hum, c'est probablement bugué jusqu'à l'os)
  • Loading branch information
masse committed Apr 12, 2005
1 parent f572b85 commit ace5342
Show file tree
Hide file tree
Showing 6 changed files with 138 additions and 85 deletions.
15 changes: 13 additions & 2 deletions src/art_group.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;i<NB_KNOWN_HEADERS;i++)
if ((len+1==Headers[i].header_len) &&
(fl_strncasecmp(Headers[i].header,name,len)==0)) break;
if ((article->headers==NULL) ||
((i<NB_KNOWN_HEADERS) && (article->headers->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("");
}
Expand All @@ -624,6 +629,12 @@ flrn_char *get_one_header(Article_List *article, Newsgroup_List *newsgroup,
if (i<NB_KNOWN_HEADERS)
{
flrn_char *resstr;
if (rep_a) {
if (!article->headers->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;
Expand Down
3 changes: 2 additions & 1 deletion src/flrn_filter.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
Expand Down
163 changes: 86 additions & 77 deletions src/flrn_inter.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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) &&
Expand Down Expand Up @@ -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<NB_FLCMD;i++)
if (strcmp(nom, Flcmds[i].nom)==0)
return i;
return -1;
}
#endif

/* FIXME : passer à l'éxecution d'une commande */
int call_func(int number, flrn_char *arg) {
int res;
Expand Down Expand Up @@ -928,17 +872,79 @@ static int get_str_arg(int res, Cmd_return *cmd, int tosave) {
return 0;
}

/* Prend et execute une commande en mode COMMAND */
/* retour >= 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
Expand All @@ -956,28 +962,31 @@ 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 */
#ifdef USE_SLANG_LANGUAGE
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 ,
Expand All @@ -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)) {
Expand All @@ -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)) ))) {
Expand All @@ -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;
}

Expand Down
2 changes: 1 addition & 1 deletion src/flrn_inter.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
38 changes: 35 additions & 3 deletions src/slang_flrn.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -288,13 +286,47 @@ 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 [] =
{
/*** Articles ***/
/* 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,
Expand Down
2 changes: 1 addition & 1 deletion src/version.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down

0 comments on commit ace5342

Please sign in to comment.