summaryrefslogtreecommitdiffstats
path: root/idx.c
blob: 6948607d6f6943255a75b76e094986849b3b9552 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/* static char copyright[] = "@(#)Copyright (c) 1986, Greg McGary";
   static char sccsid[] = "@(#)idx.c	1.2 86/10/17"; */

#include <stdio.h>
#include <string.h>

#include <config.h>
#include "misc.h"
#include "filenames.h"
#include "scanners.h"

void idxtract __P((char *path));

char const *program_name;

static void
usage (void)
{
  fprintf (stderr, "Usage: %s [-u] [+/-a<ccc>] [-c<ccc>] files\n", program_name);
  exit (1);
}

int
main (int argc, char **argv)
{
  char *arg;
  int op;

  program_name = basename ((argc--, *argv++));

  init_scanners ();

  while (argc)
    {
      arg = (argc--, *argv++);
      switch (op = *arg++)
	{
	case '-':
	case '+':
	  break;
	default:
	  (argc++, --argv);
	  goto argsdone;
	}
      switch (*arg++)
	{
	case 'S':
	  set_scan_args (op, arg);
	  break;
	default:
	  usage ();
	}
    }
argsdone:

  if (argc == 0)
    usage ();

  while (argc)
    idxtract ((argc--, *argv++));

  return 0;
}

void
idxtract (char *file_name)
{
  char const *key;
  FILE *source_FILE;
  int flags;
  char const *suffix;
  char const *filter;
  char const *lang_name;
  char const *(*scanner) (FILE*, int*);

  suffix = strrchr (file_name, '.');
  lang_name = get_lang_name (suffix);
  scanner = get_scanner (lang_name);
  if (scanner == NULL)
    return;
  source_FILE = open_source_FILE (file_name, filter = get_filter (suffix));
  if (source_FILE == NULL)
    return;

  while ((key = (*scanner) (source_FILE, &flags)) != NULL)
    puts (key);

  close_source_FILE (source_FILE, filter);
}