home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Geek Gadgets 1
/
ADE-1.bin
/
ade-dist
/
id-utils-3.2-src.tgz
/
tar.out
/
fsf
/
id-utils
/
src
/
xtokid.c
< prev
Wrap
C/C++ Source or Header
|
1996-09-28
|
5KB
|
216 lines
/* idx.c -- simple interface for testing scanners scanners
Copyright (C) 1986, 1995, 1996 Free Software Foundation, Inc.
Written by Greg McGary <gkm@gnu.ai.mit.edu>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include <config.h>
#include <stdio.h>
#include <getopt.h>
#include "xstring.h"
#include "xnls.h"
#include "scanners.h"
#include "idfile.h"
#include "pathmax.h"
#include "error.h"
void scan_files __P((struct idhead *idhp));
void scan_member_file __P((struct member_file const *member));
void usage __P((void));
char const *program_name;
char *lang_map_file_name = 0;
int show_version = 0;
int show_help = 0;
struct idhead idh;
struct file_link *cw_dlink;
void
usage (void)
{
fprintf (stderr, _("Try `%s --help' for more information.\n"),
program_name);
exit (1);
}
static struct option const long_options[] =
{
{ "include", required_argument, 0, 'i' },
{ "exclude", required_argument, 0, 'x' },
{ "lang-option", required_argument, 0, 'l' },
{ "lang-map", required_argument, 0, 'm' },
{ "default-lang", required_argument, 0, 'd' },
{ "prune", required_argument, 0, 'p' },
{ "help", no_argument, &show_help, 1 },
{ "version", no_argument, &show_version, 1 },
{ 0 }
};
static void
help_me (void)
{
printf (_("\
Usage: %s [OPTION]... [FILE]...\n\
"), program_name);
printf (_("\
Print all tokens found in a source file.\n\
-i, --include=LANGS include languages in LANGS (default: \"C C++ asm\")\n\
-x, --exclude=LANGS exclude languages in LANGS\n\
-l, --lang-option=L:OPT pass OPT as a default for language L (see below)\n\
-m, --lang-map=MAPFILE use MAPFILE to map file names onto source language\n\
-d, --default-lang=LANG make LANG the default source language\n\
-p, --prune=NAMES exclude the named files and/or directories\n\
--help display this help and exit\n\
--version output version information and exit\n\
\n\
The following arguments apply to the language-specific scanners:\n\
"));
language_help_me ();
exit (0);
}
int
main (int argc, char **argv)
{
program_name = argv[0];
/* Set locale according to user's wishes. */
setlocale (LC_ALL, "");
/* Tell program which translations to use and where to find. */
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);
for (;;)
{
int optc = getopt_long (argc, argv, "i:x:l:m:d:p:",
long_options, (int *) 0);
if (optc < 0)
break;
switch (optc)
{
case 0:
break;
case 'i':
include_languages (optarg);
break;
case 'x':
exclude_languages (optarg);
break;
case 'l':
language_save_arg (optarg);
break;
case 'm':
lang_map_file_name = optarg;
break;
case 'd':
set_default_language (optarg);
break;
case 'p':
if (cw_dlink == 0)
cw_dlink = init_walker (&idh);
prune_file_names (optarg, cw_dlink);
break;
default:
usage ();
}
}
if (show_version)
{
printf ("%s - %s\n", program_name, PACKAGE_VERSION);
exit (0);
}
if (show_help)
help_me ();
argc -= optind;
argv += optind;
if (argc == 0)
{
static char *dot = (char *) ".";
argc = 1;
argv = ˙
}
language_getopt ();
if (cw_dlink == 0)
cw_dlink = init_walker (&idh);
parse_language_map (lang_map_file_name);
while (argc--)
{
struct file_link *flink = parse_file_name (*argv++, cw_dlink);
if (flink)
walk_flink (flink, 0);
}
mark_member_file_links (&idh);
obstack_init (&tokens_obstack);
scan_files (&idh);
return 0;
}
void
scan_files (struct idhead *idhp)
{
struct member_file **members_0
= (struct member_file **) hash_dump (&idhp->idh_member_file_table,
0, member_file_qsort_compare);
struct member_file **end = &members_0[idhp->idh_member_file_table.ht_fill];
struct member_file **members;
for (members = members_0; members < end; members++)
scan_member_file (*members);
free (members_0);
}
void
scan_member_file (struct member_file const *member)
{
struct lang_args const *lang_args = member->mf_lang_args;
struct language const *lang = lang_args->la_language;
get_token_func_t get_token = lang->lg_get_token;
struct file_link *flink = member->mf_link;
FILE *source_FILE;
chdir_to_link (flink->fl_parent);
source_FILE = fopen (flink->fl_name, "r");
if (source_FILE)
{
void const *args = lang_args->la_args_digested;
int flags;
struct token *token;
while ((token = (*get_token) (source_FILE, args, &flags)) != NULL)
{
puts (token->tok_name);
obstack_free (&tokens_obstack, token);
}
fclose (source_FILE);
}
else
error (0, errno, _("can't open `%s'"), flink->fl_name);
}