2 action.c - MaLa actions implementation
4 Copyright (C) 2004, Christian Thaeter <chth@gmx.net>
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License version 2 as
8 published by the Free Software Foundation.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, contact me.
20 #include "mala_types.h"
22 #include "stringlist.h"
23 #include "actiondesc.h"
28 mala_null_parser (MalaEngine eng
, void* list
, void * data
)
33 return MALA_ENOACTION
;
37 mala_action_new (MalaString name
, void * data
,
38 MalaParserFunc parser
, MalaDataDestructor destructor
)
42 self
= malloc (sizeof (mala_action
));
46 self
->name
= name
; /* weak-reference, not refcounted */
47 self
->parser
= parser
;
48 self
->destructor
= destructor
;
52 LIST_INIT (&self
->childs
);
59 mala_action_new_actioninit (MalaActionInit init
, MalaStringBucket bucket
)
64 MalaDataDestructor dtor
= init
->destructor
;
66 name
= mala_string_new_bucket (init
->command
, bucket
);
70 if (init
->parser
== mala_substitute_parser
)
72 data
= mala_string_new_bucket ((const char *)init
->data
, bucket
);
76 dtor
= (MalaDataDestructor
) mala_string_free
;
78 else if (init
->parser
== mala_expand_parser
)
80 data
= mala_stringlist_new_cstrs_bucket ((const char **)init
->data
, -1, bucket
);
84 dtor
= (MalaDataDestructor
) mala_stringlist_free
;
86 else if (init
->parser
== mala_macro_parser
)
88 data
= mala_stringlist_new_cstrs_bucket ((const char **)init
->data
, -1, bucket
);
92 dtor
= (MalaDataDestructor
) mala_stringlist_free
;
97 self
= mala_action_new (name
, data
, init
->parser
, dtor
);
101 mala_string_free (name
);
108 mala_string_free (name
);
113 mala_action_new_brief (MalaActionInit init
, MalaAction parent
, MalaStringBucket bucket
)
121 name
= mala_string_new_cat_bucket ("--BRIEF.", init
->command
, bucket
);
125 MALA_DEBUG("catenated");
127 cmds
= mala_stringlist_new_cstrs_bucket ((const char *[])
128 {"--PRINT",(const char *) init
->brief
,0}, 2, bucket
);
131 MALA_DEBUG("stringlist FAILED");
134 MALA_DEBUG("stringlist created");
136 self
= mala_action_new (name
, cmds
, mala_expand_parser
, (MalaDataDestructor
) mala_stringlist_free
);
140 self
->parent
= parent
;
141 LIST_INSERT_HEAD (&self
->childs
, self
, cldnode
);
143 mala_string_free (name
);
148 mala_stringlist_free (cmds
);
150 mala_string_free (name
);
155 mala_action_new_help (MalaActionInit init
, MalaAction parent
, MalaStringBucket bucket
)
164 name
= mala_string_new_cat_bucket ("--HELP.", init
->command
, bucket
);
168 MALA_DEBUG("catenated");
170 cmds
= mala_stringlist_new_cstrs_bucket ((const char **)init
->help
, -1, bucket
);
173 MALA_DEBUG("stringlist FAILED");
176 MALA_DEBUG("stringlist created");
178 self
= mala_action_new (name
, cmds
, mala_expand_parser
, (MalaDataDestructor
) mala_stringlist_free
);
182 self
->parent
= parent
;
183 LIST_INSERT_HEAD (&self
->childs
, self
, cldnode
);
185 mala_string_free (name
);
190 mala_stringlist_free (cmds
);
192 mala_string_free (name
);
198 mala_action_attach (MalaAction self
)
202 desc
= mala_actiondesc_ensure (self
->name
);
206 mala_actiondesc_push_action (desc
, self
);
211 mala_action_execute (MalaAction self
, MalaStringListNode pptr
, MalaEngine eng
)
217 //return self->parser ? self->parser (pptr, self->data, eng) : MALA_EPARSER;
227 mala_action_getname (MalaAction self
)
233 mala_action_attach (MalaAction self
, MalaAction parent
)
235 if (!llist_is_empty (&self
->cldnode
))
236 return MALA_EACTIONUSED
;
238 llist_add_tail (&parent
->childs
, &self
->cldnode
);
243 mala_action_detach (MalaAction self
)
245 llist_unlink (&self
->cldnode
);
249 mala_action_getparser (MalaAction self
)
255 mala_action_getdata (MalaAction self
)
263 mala_action_free (MalaAction self
)
270 // detach from parent
274 LIST_REMOVE (self
, cldnode
);
278 while ((child
= self
->childs
.lh_first
) != NULL
)
280 LIST_REMOVE (child
, cldnode
);
281 mala_action_free (child
);
284 if (self
->destructor
&& self
->data
)
286 self
->destructor (self
->data
);
290 LIST_REMOVE(self
, stknode
);
292 /*ok, refcounting has some strange effects*/
293 if (!self
->name
->bucket
->destroying
&& self
->desc
->actions
.lh_first
!= NULL
)
294 mala_actiondesc_free (self
->desc
);
306 // c-file-style: "gnu"
308 // arch-tag: 5b3b4c3c-09f4-4f2e-a737-1ea6c5df59e9