import java.io.*;

public class Ref {
	private CfileList cfilelist = new CfileList();
	private ArgList arglist = new ArgList();
	private SignalList signallist = new SignalList();
	private ObjectList objectList = new ObjectList();
	private EnumList enumlist = new EnumList();
	private static String root = "/home/src/gnome.gtk/gnome/";
	private static String directory[] = {
		"glib",
		"gnome-libs/libgnomeui",
		"gnome-libs/libgnome",
		"gnome-libs/libgnorba",
		"gnome-libs/gtk-xmhtml",
		"gtk+/gdk",
		"gtk+/gtk",
	};
	public static void main(String arg[]) {
		new Ref();
	}
	Ref() {
		for(int i=0; i<directory.length; i++) {
			File file = new File(root + directory[i]);
			if(!file.isDirectory())
				System.err.println("Skipped (not a directory): " + file);
			processDirectory(file);
		}
		dump();
	}
	private void processDirectory(File directory) {
		String[] list = directory.list();
		for(int i=0; i<list.length; i++) {
			if(list[i].equals("win32"))
				continue;
			File file = new File(directory.getAbsolutePath(),list[i]);
			if(file.isDirectory()) {
				processDirectory(file);
			} else if(list[i].endsWith(".c")) {
				if(list[i].startsWith("g")) {
					processC(file);
				}
			} else if(list[i].endsWith(".h")) {
				if(list[i].startsWith("g")) {
					processH(file);
				}
			}
/*****************************************************
			} else if(list[i].endsWith(".c")) {
				if(list[i].startsWith("gnome") ||
					list[i].startsWith("gtk") ||
					list[i].startsWith("gdk")) {
						processC(file);
				}
			} else if(list[i].endsWith(".h")) {
				if(list[i].startsWith("gnome") ||
					list[i].startsWith("gtk") ||
					list[i].startsWith("gdk")) {
						processH(file);
				}
			}
*************************************************/
		}
	}
	private void processC(File file) {
		try {
			System.err.print(file);
			Cfile cfile = new Cfile(file);
			System.err.print("..1");
			cfilelist.add(cfile);
			System.err.print("2");
			arglist.add(file);
			System.err.print("3");
			signallist.add(file);
			System.err.println("....done");
		} catch(SyntaxException e) {
			System.err.println();
			System.err.println(e.getLine());
			System.err.println(e.getExpected());
			System.err.println(e.getFound());
		}
	}
	private void processH(File file) {
		try {
			ObjectNode node;
			System.err.print(file);
			objectList.add(file);
			node = objectList.locateNode("GtkObject");
			node.setParent(null);
			node.setTerminator(true);
			node = objectList.locateNode("GtkObjectClass");
			node.setParent(null);
			node.setTerminator(true);
			enumlist.add(file);
			System.err.println("....done");
		} catch(SyntaxException e) {
			System.err.println();
			System.err.println(e.getLine());
			System.err.println(e.getExpected());
			System.err.println(e.getFound());
		}
	}
	private void dump() {
		PrintWriter out;
		System.err.println(".....writing");
		System.err.println("fnwidget.txt");
		try {
			out = newPrintWriter("fnwidget.txt");
			cfilelist.dump(out);
			out.close();
		} catch(IOException e) {
			System.err.println(e);
			e.printStackTrace();
		}
		System.err.println("fnkeywordfull.txt");
		try {
			out = newPrintWriter("fnkeywordfull.txt");
			cfilelist.dumpKeywordFull(out);
			out.close();
		} catch(IOException e) {
			System.err.println(e);
			e.printStackTrace();
		}
		System.err.println("fnkeywordshort.txt");
		try {
			out = newPrintWriter("fnkeywordshort.txt");
			cfilelist.dumpKeywordShort(out);
			out.close();
		} catch(IOException e) {
			System.err.println(e);
			e.printStackTrace();
		}
		System.err.println("fnalpha.txt");
		try {
			out = newPrintWriter("fnalpha.txt");
			cfilelist.dumpFunctions(out);
			out.close();
		} catch(IOException e) {
			System.err.println(e);
			e.printStackTrace();
		}
		System.err.println("returnval.txt");
		try {
			out = newPrintWriter("returnval.txt");
			cfilelist.dumpReturnval(out);
			out.close();
		} catch(IOException e) {
			System.err.println(e);
			e.printStackTrace();
		}
		System.err.println("args.txt");
		try {
			out = newPrintWriter("args.txt");
			arglist.dump(out);
			out.close();
		} catch(IOException e) {
			System.err.println(e);
			e.printStackTrace();
		}
		System.err.println("signals.txt");
		try {
			out = newPrintWriter("signals.txt");
			signallist.dump(out);
			out.close();
		} catch(IOException e) {
			System.err.println(e);
			e.printStackTrace();
		}
		System.err.println("inheritance.txt");
		try {
			out = newPrintWriter("inheritance.txt");
			objectList.dump(out);
			out.close();
		} catch(IOException e) {
			System.err.println(e);
			e.printStackTrace();
		}
		System.err.println("enum.txt");
		try {
			out = newPrintWriter("enum.txt");
			enumlist.dump(out);
			out.close();
		} catch(IOException e) {
			System.err.println(e);
			e.printStackTrace();
		}
		System.err.println(".....done");
	}
	private PrintWriter newPrintWriter(String fileName) throws IOException {
		File file = new File(fileName);
		FileOutputStream fos = new FileOutputStream(file);
		PrintWriter out = new PrintWriter(fos);
		return(out);
	}
}
