2 * (c) Oleg Puchinin 2006.
3 * graycardinalster@gmail.com
5 * 25/06/06 - Perl plugin for SilentBob.
13 #include <gclib/gclib.h>
18 #include <the_fly.hpp>
20 extern "C" DArray
* plugin_init (struct env_t
*env
);
21 void __perl_files (char * f_name
);
22 int perl_make_ctags (char * f_name
, FILE * of
);
23 char t_op2 (char ** d_in
, char ** d_prev
);
29 int perl_print_tags (char * f_name
)
35 void perl_file (DArray
* d_array
)
40 void pl_sub (struct tt_state_t
*tt
, int line
, char * d_out
, char ch
)
45 S
= strchr (d_out
, '(');
49 part1
= strchr (d_out
, ' ');
51 part2
= strchr (part1
, ':');
56 part2
= strip (part2
);
62 fprintf (ofile
, "%s:%s\t%s\t%i\n", part1
, part2
, tt
->d_file_name
, line
);
64 fprintf (ofile
, "%s\t%s\t%i\n", part1
, tt
->d_file_name
, line
);
67 void pl_package (struct tt_state_t
*tt
, int line
, char * d_out
, char ch
)
72 S
= strchr (d_out
, ' ');
78 ptr
= rindex (S
, ':');
81 fprintf (ofile
, "%s\t%s\t%i\n", ptr
, tt
->d_file_name
, line
);
83 fprintf (ofile
, "%s\t%s\t%i\n", S
, tt
->d_file_name
, line
);
86 void perl_make_tag (struct tt_state_t
*tt
, char * d_out
, char ch
)
90 line
= tt
->d_attachment
[ENV
->t_op_no
].pair_line
+1;
94 if (ch
== '{' && (! strncmp (d_out
, "sub ", 4))) {
95 pl_sub (tt
, line
, d_out
, ch
);
99 if (ch
== ';' && (! strncmp (d_out
, "package ", 8))) {
100 pl_package (tt
, line
, d_out
, ch
);
110 __perl_files (ENV
->tmp_files
);
111 d_array
= new DArray (32);
112 d_array
->from_file (ENV
->tmp_files
);
113 d_array
->foreach ((Dfunc_t
)chomp
);
115 for (i
= 0; i
< d_array
->get_size (); ++i
) {
116 if (! d_array
->get (i
))
119 perl_make_ctags (d_array
->get (i
), ofile
);
122 unlink (ENV
->tmp_files
);
123 d_array
->foreach (free
);
127 int perl_make_ctags (char * f_name
, FILE * of
)
130 char *d_ptr
,*d_out
; // for t_op2
132 struct tt_state_t
*tt
;
135 if (f_name
== NULL
) {
143 tt
= CNEW (tt_state_t
, 1);
144 memset (tt
, 0, sizeof (struct tt_state_t
));
145 tt
->d_file_name
= strdup (f_name
);
146 THE_FLY::fly_for_file (tt
);
147 //write (1, tt->d_output, tt->d_output_size);
149 d_out
= tt
->d_output
;
152 ch
= t_op2 (&d_ptr
, &d_out
);
159 perl_make_tag (tt
, d_out
, ch
);
175 int perl_call_tags (char * f_name
)
177 printf ("Jay online.\n");
181 char perl_opt (DArray
* d_opts
, int * i
)
186 if (EQ (d_opts
->get (*i
), "--perl")) {
187 ENV
->language
= "Perl";
193 void __perl_files (char * f_name
)
196 sblib_find ("./", "*.pm", f_name
);
197 sblib_find ("./", "*.pl", f_name
);
198 sblib_find ("./", "*.ph", f_name
);
201 char perl_files_opt (DArray
* d_opts
, int * i
)
206 if (EQ (d_opts
->get (*i
), "--files") && EQ (ENV
->language
, "Perl")) {
207 unlink ("./perl_files");
208 __perl_files ("./perl_files");
215 void perl_plugin_info ()
217 printf ("Perl support.\n");
218 printf ("Version: 1.0-rc1\n");
219 printf ("options: --perl --make-ctags\n");
222 void perl_files_info ()
224 printf ("Perl files.\n");
225 printf ("Version: 1.0\n");
226 printf ("options: --perl --files\n");
229 DArray
* perl_init ()
232 struct mod_feature
* pm
;
233 struct mod_feature
* mod_perlfiles
;
234 struct mod_language
* pm_lang
;
236 Ret
= new DArray (2);
237 pm
= CNEW (mod_feature
, 1);
238 pm_lang
= CNEW (mod_language
, 1);
239 mod_perlfiles
= CNEW (mod_feature
, 1);
241 memset (pm
, 0, sizeof (mod_feature
));
242 memset (pm_lang
, 0, sizeof (mod_language
));
243 memset (mod_perlfiles
, 0, sizeof (mod_feature
));
245 pm
->mod
.Type
= TYPE_FEATURE
;
246 pm
->mod
.Version
= strdup ("0.1");
249 mod_perlfiles
->mod
.Type
= TYPE_FEATURE
;
250 mod_perlfiles
->mod
.Version
= strdup ("1.0");
251 mod_perlfiles
->mod
.short_info
= perl_files_info
;
252 mod_perlfiles
->opt
= perl_files_opt
;
254 pm_lang
->mod
.Type
= TYPE_LANGUAGE
;
255 pm_lang
->mod
.Version
= strdup ("1.0-rc1");
256 pm_lang
->mod
.short_info
= perl_plugin_info
;
257 pm_lang
->language
= strdup ("Perl");
258 pm_lang
->the
= THE_FLY::fly_for_file
;
259 pm_lang
->print_tags
= perl_print_tags
;
260 pm_lang
->file
= perl_file
;
261 pm_lang
->make_ctags
= perl_make_ctags
;
263 Ret
->add (LPCHAR (pm
));
264 Ret
->add (LPCHAR (pm_lang
));
265 Ret
->add (LPCHAR (mod_perlfiles
));
270 DArray
* plugin_init (struct env_t
*env
)
276 // printf ("Perl module under construction.\n");