block: don't put spaces around :
[ironout.git] / ironout.c
blobc0b71cc56b4729d49cee304cde1ce7ec7ccc2021
1 /*
2 * ironout - A C refactoring tool
4 * Copyright (C) 2008 Ali Gholami Rudi
6 */
7 #include <getopt.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <string.h>
11 #include <unistd.h>
12 #include "ast.h"
13 #include "block.h"
14 #include "cfile.h"
15 #include "find.h"
16 #include "hash.h"
17 #include "name.h"
18 #include "path.h"
19 #include "project.h"
20 #include "rename.h"
22 #define MAXPATHLEN 1024
24 static void require_args(int argc, char **argv, int required, char *usage)
26 if (argc < required + 1) {
27 fprintf(stderr, "Usage: %s %s\n\n", argv[0], usage);
28 fprintf(stderr, "%s command requires at least %d arguments\n",
29 argv[0], required);
30 exit(1);
34 static int parse_cmd(int argc, char **argv)
36 struct cfile *cfile;
37 require_args(argc, argv, 1, "FILENAME");
38 cfile = cfile_init(argv[1]);
39 if (cfile)
40 cfile_free(cfile);
41 return !cfile;
44 static int getname_cmd(int argc, char **argv)
46 struct cfile *cfile;
47 struct node *found;
48 require_args(argc, argv, 2, "FILENAME OFFSET");
49 cfile = cfile_init(argv[1]);
50 found = node_find(cfile->node, atoi(argv[2]));
51 if (found && (found->type == AST_IDENTIFIER ||
52 found->type == AST_TYPENAME))
53 puts(found->data);
54 cfile_free(cfile);
55 return 0;
58 static int find_cmd(int argc, char **argv)
60 char dir[MAXPATHLEN];
61 char filename[MAXPATHLEN];
62 struct project *project;
63 struct cfile *cfile;
64 struct hit *hits, *cur;
65 struct name *name;
66 require_args(argc, argv, 2, "FILENAME OFFSET");
67 dirname(dir, argv[1]);
68 basename(filename, argv[1]);
69 chdir(dir);
70 project = project_init(".");
71 cfile = project_find(project, filename);
72 if (!cfile)
73 return 1;
74 name = name_find(project, cfile, argv[2]);
75 hits = find_name(project, name);
76 cur = hits;
77 while (cur) {
78 printf("%s %ld %ld\n", cur->cfile->name, cur->start, cur->end);
79 cur = cur->next;
81 free_hits(hits);
82 project_free(project);
83 return 0;
86 static int rename_cmd(int argc, char **argv)
88 char dir[MAXPATHLEN];
89 char filename[MAXPATHLEN];
90 struct project *project;
91 struct cfile *cfile;
92 struct name *name;
93 require_args(argc, argv, 3, "FILENAME OFFSET NEWNAME");
94 dirname(dir, argv[1]);
95 basename(filename, argv[1]);
96 chdir(dir);
97 project = project_init(".");
98 cfile = project_find(project, filename);
99 if (!cfile)
100 return 1;
101 name = name_find(project, cfile, argv[2]);
102 rename_name(project, name, argv[3]);
103 project_free(project);
104 return 0;
107 static char *usage =
108 "Usage: %s COMMAND [ARGS]\n\n"
109 "Command can be:\n"
110 " rename: rename a name and report the changes as a patch\n"
111 " find: find and list occurrences of a name\n"
112 " getname: print the name under point\n"
113 " version: print version number and exit\n";
115 static void print_help(int argc, char **argv)
117 printf(usage, argv[0]);
120 static char *version =
121 "Ironout 0.0.2\n"
122 "Copyright (C) 2008 Ali Gholami Rudi\n"
123 "You can redistribute and/or modify Ironout under the terms\n"
124 "of GNU General Public License. For more information, see\n"
125 "the file named COPYING.\n";
128 static void print_version(int argc, char **argv)
130 printf(version);
133 int main(int argc, char **argv)
135 int c;
136 while ((c = getopt(argc, argv, "vh")) != -1) {
137 switch (c) {
138 case 'v':
139 print_version(argc, argv);
140 return 0;
141 case 'h':
142 print_help(argc, argv);
143 return 0;
144 case '?':
145 default:
146 fprintf(stderr, "Bad command line option\n");
147 return 1;
150 if (argc > optind) {
151 char *command = argv[optind];
152 char **nargv = argv + optind;
153 int nargc = argc - optind;
154 if (!strcmp(command, "parse"))
155 return parse_cmd(nargc, nargv);
156 if (!strcmp(command, "getname"))
157 return getname_cmd(nargc, nargv);
158 if (!strcmp(command, "find"))
159 return find_cmd(nargc, nargv);
160 if (!strcmp(command, "rename"))
161 return rename_cmd(nargc, nargv);
162 if (!strcmp(command, "version")) {
163 print_version(argc, argv);
164 return 0;
167 print_help(argc, argv);
168 return 1;