2 * (c) Oleg Puchinin 2006
3 * graycardinalster@gmail.com
14 #define PLUGINS_MASK "find ~/plugins/ -name \"libplugin_*.so.*\""
16 typedef struct DArray
*(*plug_init_t
) (struct env_t
*env
);
18 env_t
* sb_getenv (void)
23 char modding_optparse (int * i
, int step
)
29 for (pos
= 0; pos
< ENV
->modding
->get_size (); pos
++) {
30 plug
= (mod_t
*) ENV
->modding
->get (pos
);
31 if (plug
->Type
== TYPE_FEATURE
) {
32 f
= (mod_feature
*) plug
;
35 if (f
->opt
&& f
->opt (ENV
->d_opts
, i
))
40 if (f
->opt2
&& f
->opt2 (ENV
->d_opts
, i
))
49 struct mod_language
* find_language (char *S
)
51 struct mod_language
*pm
= NULL
;
54 //printf ("Plugins count : %i\n", ENV->modding->get_size ());
55 for (i
= 0; i
< ENV
->modding
->get_size (); i
++) {
56 pm
= (struct mod_language
*) ENV
->modding
->get (i
);
60 if (pm
->mod
.Type
!= TYPE_LANGUAGE
)
63 if (EQ (pm
->language
, S
))
67 if (i
< ENV
->modding
->get_size ())
75 struct mod_t
*pm
= NULL
;
78 printf ("Available plugins: \n");
79 for (i
= 0; i
< ENV
->modding
->get_size (); i
++) {
80 pm
= (mod_t
*) ENV
->modding
->get (i
);
92 FILE * mkctags_prepare ()
96 if (SB_FLGET (SB_FLCTAGSAPPEND
)) {
97 if (rename ("./tags", ENV
->tmp_tags
) < 0) {
98 fprintf (stderr
, "$ rename: ./tags %s\n", ENV
->tmp_tags
);
102 ofile
= fopen (ENV
->tmp_tags
, "a");
104 unlink (ENV
->tmp_tags
);
106 ofile
= fopen (ENV
->tmp_tags
, "w");
110 fprintf (stderr
, "fopen (\"%s\", \"w\")\n", ENV
->tmp_tags
);
118 int modding_start (int i_cmd
)
120 struct mod_language
*pm
= NULL
;
121 struct tt_state_t
* tt
;
126 pm
= find_language (ENV
->language
);
127 if (pm
== NULL
|| pm
->the
== NULL
) {
128 assert (true, "Language plugin not found !\n");
132 if (i_cmd
== cmd_makectags
)
133 ofile
= mkctags_prepare ();
135 size
= ENV
->d_files
->get_size ();
139 if (! pm
->make_ctags
)
141 pm
->make_ctags (NULL
, ofile
);
146 for (i
= 0; i
< size
; i
++) {
147 if (S_ISDIR (DLSTAT (ENV
->d_files
->get (i
))->st_mode
))
152 tt
= CNEW (tt_state_t
, 1);
153 memset (tt
, 0, sizeof (struct tt_state_t
));
154 tt
->d_file_name
= ENV
->d_files
->get (i
);
160 if (! SB_FLGET (SB_FLSIMULATE
)) {
161 write (fileno (stdout
), tt
->d_output
,
170 if (! pm
->make_ctags
|| !pm
->the
)
173 pm
->make_ctags (ENV
->d_files
->get (i
), ofile
);
180 pm
->call_tags (ENV
->d_files
->get (i
));
194 if (i_cmd
== cmd_makectags
)
195 mk_tags ("tags", NULL
);
200 int modding_load_dir (char * path
)
205 files
= Dfiles (path
);
209 for (i
= 0; i
< files
->get_size (); i
++) {
210 if (EQ (files
->get (i
), "."))
212 if (EQ (files
->get (i
), ".."))
214 modding_load_plugin (files
->get (i
), path
);
217 files
->foreach (free
);
224 ENV
->modding
= new EArray(32);
225 modding_load_dir (ENV
->home_plugins
);
226 modding_load_dir (ENV
->shared_plugins
);
230 int modding_load_plugin (char * name
, char * path
)
237 struct mod_t
* sb_plugin
;
238 plug_init_t func_handle
;
241 if (! path
|| ! name
)
244 if (*stail (path
) == '/')
245 *stail(m_buf
) = '\0';
248 snprintf (m_buf
, 511, "%s/%s", path
, name
);
251 if (! S_ISREG (st
.st_mode
))
255 lib_handle
= dlopen (m_buf
, RTLD_NOW
);
256 s_dlerror
= dlerror ();
258 bug_plugin (s_dlerror
);
262 func_handle
= (plug_init_t
) dlsym (lib_handle
, "plugin_init");
263 s_dlerror
= dlerror ();
265 bug_plugin (s_dlerror
);
269 plug_list
= func_handle (ENV
);
270 if (plug_list
== NULL
)
273 for (n
= 0; n
< plug_list
->get_size (); n
++) {
274 sb_plugin
= (struct mod_t
*) plug_list
->get (n
);
275 sb_plugin
->mod_file
= strdup (m_buf
);
277 ENV
->modding
->add (LPCHAR (sb_plugin
));