diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Slice/Parser.cpp | 51 | ||||
-rw-r--r-- | cpp/src/slice2docbook/.depend | 0 | ||||
-rw-r--r-- | cpp/src/slice2docbook/Gen.cpp | 332 | ||||
-rw-r--r-- | cpp/src/slice2docbook/Gen.h | 53 | ||||
-rw-r--r-- | cpp/src/slice2docbook/GenUtil.cpp | 77 | ||||
-rw-r--r-- | cpp/src/slice2docbook/GenUtil.h | 25 | ||||
-rw-r--r-- | cpp/src/slice2docbook/Main.cpp | 164 | ||||
-rw-r--r-- | cpp/src/slice2docbook/Makefile | 31 | ||||
-rw-r--r-- | cpp/src/slice2docbook/docbook.dsp | 118 |
9 files changed, 851 insertions, 0 deletions
diff --git a/cpp/src/Slice/Parser.cpp b/cpp/src/Slice/Parser.cpp index 7d90baaf121..a45b517766e 100644 --- a/cpp/src/Slice/Parser.cpp +++ b/cpp/src/Slice/Parser.cpp @@ -890,6 +890,44 @@ Slice::ClassDef::createOperation(const string& name, return 0; } + { + TypeStringList allParams = inParams; + allParams.insert(allParams.end(), outParams.begin(), outParams.end()); + + TypeStringList::iterator p = allParams.begin(); + while(p != allParams.end()) + { + TypeStringList::iterator q = p; + ++q; + while(q != allParams.end()) + { + if(p -> second == q -> second) + { + string msg = "duplicate parameter `"; + msg += p -> second; + msg += "'"; + yyerror(msg); + return 0; + } + ++q; + } + ++p; + } + } + + if(name == this -> name()) + { + string msg; + if(isInterface()) + msg = "interface name `"; + else + msg = "class name `"; + msg += name; + msg += "' can not be used as operation"; + yyerror(msg); + return 0; + } + Operation_ptr p = new Operation(this, name, returnType, inParams, outParams, throws); contents_.push_back(p); @@ -924,6 +962,19 @@ Slice::ClassDef::createDataMember(const string& name, const Type_ptr& type) return 0; } + if(name == this -> name()) + { + string msg; + if(isInterface()) + msg = "interface name `"; + else + msg = "class name `"; + msg += name; + msg += "' can not be used as data member"; + yyerror(msg); + return 0; + } + DataMember_ptr p = new DataMember(this, name, type); contents_.push_back(p); return p; diff --git a/cpp/src/slice2docbook/.depend b/cpp/src/slice2docbook/.depend new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/cpp/src/slice2docbook/.depend diff --git a/cpp/src/slice2docbook/Gen.cpp b/cpp/src/slice2docbook/Gen.cpp new file mode 100644 index 00000000000..24f3e551de0 --- /dev/null +++ b/cpp/src/slice2docbook/Gen.cpp @@ -0,0 +1,332 @@ +// ********************************************************************** +// +// Copyright (c) 2001 +// MutableRealms, Inc. +// Huntsville, AL, USA +// +// All Rights Reserved +// +// ********************************************************************** + +#include <Ice/Functional.h> +#include <Gen.h> +#include <GenUtil.h> + +using namespace std; +using namespace Slice; + +Slice::Gen::Gen(const string& name) + : name_(name) +{ +} + +Slice::Gen::~Gen() +{ +} + +bool +Slice::Gen::operator!() const +{ + return false; +} + +void +Slice::Gen::generate(const Unit_ptr& unit) +{ + unit -> mergeModules(); + unit -> sort(); + unit -> visit(this); +} + +void +Slice::Gen::printHeader(Output& out) +{ + static const char* header = + "Copyright (c) 2001\n" + "MutableRealms, Inc.\n" + "Huntsville, AL, USA\n" + "\n" + "All Rights Reserved\n" + "\n" + "Generated by the `slice2docbook' converter\n"; + + out << header; +} + +void +Slice::Gen::visitUnitStart(const Unit_ptr& p) +{ + string file = scopedToFile("toplevel"); + outputStack_.push(new Output(file.c_str())); + Output& out = *outputStack_.top(); + if(!out) + { + cerr << name_ << ": can't open `" << file << "' for writing: " + << strerror(errno) << endl; + return; + } + printHeader(out); +} + +void +Slice::Gen::visitUnitEnd(const Unit_ptr& p) +{ + Output& out = *outputStack_.top(); + if(!out) + return; + + out << '\n'; + + delete outputStack_.top(); + outputStack_.pop(); +} + +void +Slice::Gen::visitModuleStart(const Module_ptr& p) +{ + { + Output& out = *outputStack_.top(); + if(!out) + return; + + out << sp; + out << nl << "module " << p -> name() << ';'; + } + + { + string file = scopedToFile(p -> scoped()); + outputStack_.push(new Output(file.c_str())); + Output& out = *outputStack_.top(); + if(!out) + { + cerr << name_ << ": can't open `" << file << "' for writing: " + << strerror(errno) << endl; + return; + } + printHeader(out); + + string comment = p -> comment(); + if(comment.length()) + { + out << sp; + out << nl << comment; + } + + out << sp; + out << nl << "module " << p -> name(); + out << sb; + out.dec(); + } +} + +void +Slice::Gen::visitModuleEnd(const Module_ptr& p) +{ + Output& out = *outputStack_.top(); + if(!out) + return; + + out << sp; + out.inc(); + out << eb << ';'; + + delete outputStack_.top(); + outputStack_.pop(); +} + +void +Slice::Gen::visitClassDefStart(const ClassDef_ptr& p) +{ + { + Output& out = *outputStack_.top(); + if(!out) + return; + + out << sp; + out << nl; + if(p -> isLocal()) + out << "isLocal "; + out << "class " << p -> name() << ';'; + } + + { + string file = scopedToFile(p -> scoped()); + outputStack_.push(new Output(file.c_str())); + Output& out = *outputStack_.top(); + if(!out) + { + cerr << name_ << ": can't open `" << file << "' for writing: " + << strerror(errno) << endl; + return; + } + printHeader(out); + + string comment = p -> comment(); + if(comment.length()) + { + out << sp; + out << nl << comment; + } + + out << sp; + out << nl; + if(p -> isLocal()) + out << "local "; + if(p -> isInterface()) + out << "interface "; + else + out << "class "; + out << p -> name(); + ClassList bases = p -> bases(); + if(!bases.empty() && !bases.front() -> isInterface()) + { + out << " extends " << bases.front() -> scoped().substr(2); + bases.pop_front(); + } + if(!bases.empty()) + { + if(p -> isInterface()) + out << " extends "; + else + out << " implements "; + } + ClassList::iterator q = bases.begin(); + while(q != bases.end()) + { + out << (*q) -> scoped().substr(2); + if(++q != bases.end()) + out << ", "; + } + out << sb; + } +} + +void +Slice::Gen::visitClassDefEnd(const ClassDef_ptr& p) +{ + Output& out = *outputStack_.top(); + if(!out) + return; + + out << eb << ';'; + + delete outputStack_.top(); + outputStack_.pop(); +} + +void +Slice::Gen::visitOperation(const Operation_ptr& p) +{ + Output& out = *outputStack_.top(); + if(!out) + return; + + Type_ptr returnType = p -> returnType(); + TypeStringList inputParams = p -> inputParameters(); + TypeStringList outputParams = p -> outputParameters(); + TypeList throws = p -> throws(); + + string comment = p -> comment(); + if(comment.length()) + { + out << sp; + out << nl << comment; + } + + out << sp; + out << nl << (returnType ? typeToString(returnType) : "void") << ' ' + << p -> name() << '('; + out.useCurrentPosAsIndent(); + TypeStringList::iterator q = inputParams.begin(); + while(q != inputParams.end()) + { + out << typeToString(q -> first) << ' ' << q -> second; + if(++q != inputParams.end()) + out << ',' << nl; + } + if(!outputParams.empty()) + { + out << ';' << nl; + q = outputParams.begin(); + while(q != outputParams.end()) + { + out << typeToString(q -> first) << ' ' << q -> second; + if(++q != outputParams.end()) + out << ',' << nl; + } + } + out << ')'; + out.restoreIndent(); + if(!throws.empty()) + { + out.inc(); + out << nl << "throws "; + out.useCurrentPosAsIndent(); + TypeList::iterator r = throws.begin(); + while(r != throws.end()) + { + out << typeToString(*r); + if(++r != throws.end()) + out << ',' << nl; + } + out.restoreIndent(); + out.dec(); + } + out << ';'; +} + +void +Slice::Gen::visitDataMember(const DataMember_ptr& p) +{ + Output& out = *outputStack_.top(); + if(!out) + return; + + string comment = p -> comment(); + if(comment.length()) + { + out << sp; + out << nl << comment; + } + + out << sp; + out << nl << typeToString(p -> type()) << ' ' << p -> name() << ';'; +} + +void +Slice::Gen::visitVector(const Vector_ptr& p) +{ + Output& out = *outputStack_.top(); + if(!out) + return; + + string comment = p -> comment(); + if(comment.length()) + { + out << sp; + out << nl << comment; + } + + out << sp; + out << nl << "vector< " << typeToString(p -> type()) << " > " + << p -> name() << ';'; +} + +void +Slice::Gen::visitNative(const Native_ptr& p) +{ + Output& out = *outputStack_.top(); + if(!out) + return; + + string comment = p -> comment(); + if(comment.length()) + { + out << sp; + out << nl << comment; + } + + out << sp; + out << nl << "native " << p -> name() << ';'; +} + diff --git a/cpp/src/slice2docbook/Gen.h b/cpp/src/slice2docbook/Gen.h new file mode 100644 index 00000000000..1bb2146f0f3 --- /dev/null +++ b/cpp/src/slice2docbook/Gen.h @@ -0,0 +1,53 @@ +// ********************************************************************** +// +// Copyright (c) 2001 +// MutableRealms, Inc. +// Huntsville, AL, USA +// +// All Rights Reserved +// +// ********************************************************************** + +#ifndef GEN_H +#define GEN_H + +#include <Parser.h> +#include <OutputUtil.h> +#include <stack> + +namespace Slice +{ + +class Gen : ::__Ice::noncopyable, public ParserVisitor +{ +public: + + Gen(const std::string&); + virtual ~Gen(); + + bool operator!() const; // Returns true if there was a constructor error + + void generate(const Unit_ptr&); + + virtual void visitUnitStart(const Unit_ptr&); + virtual void visitUnitEnd(const Unit_ptr&); + virtual void visitModuleStart(const Module_ptr&); + virtual void visitModuleEnd(const Module_ptr&); + virtual void visitClassDefStart(const ClassDef_ptr&); + virtual void visitClassDefEnd(const ClassDef_ptr&); + virtual void visitOperation(const Operation_ptr&); + virtual void visitDataMember(const DataMember_ptr&); + virtual void visitVector(const Vector_ptr&); + virtual void visitNative(const Native_ptr&); + +private: + + void printHeader(Output&); + + std::string name_; + std::stack<Output*> outputStack_; +}; + +} + +#endif diff --git a/cpp/src/slice2docbook/GenUtil.cpp b/cpp/src/slice2docbook/GenUtil.cpp new file mode 100644 index 00000000000..fa2f0de0045 --- /dev/null +++ b/cpp/src/slice2docbook/GenUtil.cpp @@ -0,0 +1,77 @@ +// ********************************************************************** +// +// Copyright (c) 2001 +// MutableRealms, Inc. +// Huntsville, AL, USA +// +// All Rights Reserved +// +// ********************************************************************** + +#include <GenUtil.h> + +using namespace std; +using namespace Slice; + +string +Slice::typeToString(const Type_ptr& type) +{ + static const char* builtinTable[] = + { + "byte", + "bool", + "short", + "int", + "long", + "float", + "double", + "string", + "wstring", + "Object", + "Object*", + "LocalObject" + }; + + Builtin_ptr builtin = Builtin_ptr::dynamicCast(type); + if(builtin) + return builtinTable[builtin -> kind()]; + + ClassDecl_ptr cl = ClassDecl_ptr::dynamicCast(type); + if(cl) + return cl -> scoped().substr(2); + + Proxy_ptr proxy = Proxy_ptr::dynamicCast(type); + if(proxy) + return proxy -> _class() -> scoped().substr(2) + "*"; + + Contained_ptr contained = Contained_ptr::dynamicCast(type); + if(contained) + return contained -> scoped().substr(2); + + return "???"; +} + + +struct ToFile +{ + char operator()(char c) + { + if(c == ':') + return '_'; + else + return c; + } +}; + +string +Slice::scopedToFile(const string& scoped) +{ + string result; + if(scoped[0] == ':') + result = scoped.substr(2); + else + result = scoped; + transform(result.begin(), result.end(), result.begin(), ToFile()); + result += ".sgml"; + return result; +} diff --git a/cpp/src/slice2docbook/GenUtil.h b/cpp/src/slice2docbook/GenUtil.h new file mode 100644 index 00000000000..dda7183a4b1 --- /dev/null +++ b/cpp/src/slice2docbook/GenUtil.h @@ -0,0 +1,25 @@ +// ********************************************************************** +// +// Copyright (c) 2001 +// MutableRealms, Inc. +// Huntsville, AL, USA +// +// All Rights Reserved +// +// ********************************************************************** + +#ifndef GEN_UTIL_H +#define GEN_UTIL_H + +#include <Parser.h> +#include <OutputUtil.h> + +namespace Slice +{ + +std::string typeToString(const Type_ptr&); +std::string scopedToFile(const std::string&); + +} + +#endif diff --git a/cpp/src/slice2docbook/Main.cpp b/cpp/src/slice2docbook/Main.cpp new file mode 100644 index 00000000000..559e0d99bfb --- /dev/null +++ b/cpp/src/slice2docbook/Main.cpp @@ -0,0 +1,164 @@ +// ********************************************************************** +// +// Copyright (c) 2001 +// MutableRealms, Inc. +// Huntsville, AL, USA +// +// All Rights Reserved +// +// ********************************************************************** + +#include <Gen.h> +#include <fstream> + +using namespace std; +using namespace Slice; + +void +usage(const char* n) +{ + cerr << "Usage: " << n << " [options] slice-files ...\n"; + cerr << +"Options:\n" +"-h, --help Show this message.\n" +"-DNAME Define NAME as 1.\n" +"-DNAME=DEF Define NAME as DEF.\n" +"-UNAME Remove any definition for NAME.\n" +"-IDIR Put DIR in the include file search path.\n" +"-d, --debug Print debug messages.\n" + ; +} + +int +main(int argc, char* argv[]) +{ + string cpp("cpp -C"); + vector<string> includePaths; + bool debug = false; + + int idx = 1; + while(idx < argc) + { + if(strncmp(argv[idx], "-I", 2) == 0) + { + cpp += ' '; + cpp += argv[idx]; + + string path = argv[idx] + 2; + if(path.length()) + includePaths.push_back(path); + + for(int i = idx ; i + 1 < argc ; ++i) + argv[i] = argv[i + 1]; + --argc; + } + else if(strncmp(argv[idx], "-D", 2) == 0 || + strncmp(argv[idx], "-U", 2) == 0) + { + cpp += ' '; + cpp += argv[idx]; + + for(int i = idx ; i + 1 < argc ; ++i) + argv[i] = argv[i + 1]; + --argc; + } + else if(strcmp(argv[idx], "-h") == 0 || + strcmp(argv[idx], "--help") == 0) + { + usage(argv[0]); + return EXIT_SUCCESS; + } + else if(strcmp(argv[idx], "-d") == 0 || + strcmp(argv[idx], "--debug") == 0) + { + debug = true; + for(int i = idx ; i + 1 < argc ; ++i) + argv[i] = argv[i + 1]; + --argc; + } + else if(argv[idx][0] == '-') + { + cerr << argv[0] << ": error: unknown option `" << argv[idx] << "'" + << endl; + usage(argv[0]); + return EXIT_FAILURE; + } + else + ++idx; + } + + if(argc < 2) + { + cerr << argv[0] << ": error: no input file" << endl; + usage(argv[0]); + return EXIT_FAILURE; + } + + int status = EXIT_SUCCESS; + + for(idx = 1 ; idx < argc ; ++idx) + { + string base(argv[idx]); + string suffix; + string::size_type pos = base.rfind('.'); + if(pos != string::npos) + { + suffix = base.substr(pos); + transform(suffix.begin(), suffix.end(), suffix.begin(), tolower); + } + if(suffix != ".ice") + { + cerr << argv[0] << ": input files must end with `.ice'" + << endl; + return EXIT_FAILURE; + } + base.erase(pos); + + ifstream test(argv[idx]); + if(!test) + { + cerr << argv[0] << ": can't open `" << argv[idx] + << "' for reading: " << strerror(errno) << endl; + return EXIT_FAILURE; + } + test.close(); + + string cmd = cpp + " " + argv[idx]; +#ifdef WIN32 + FILE* cppHandle = _popen(cmd.c_str(), "r"); +#else + FILE* cppHandle = popen(cmd.c_str(), "r"); +#endif + if(cppHandle == NULL) + { + cerr << argv[0] << ": can't run C++ preprocessor: " + << strerror(errno) << endl; + return EXIT_FAILURE; + } + + Unit_ptr unit = Unit::createUnit(true, true); + int parseStatus = unit -> parse(cppHandle, debug); + +#ifdef WIN32 + _pclose(cppHandle); +#else + pclose(cppHandle); +#endif + + if(parseStatus == EXIT_FAILURE) + { + status = EXIT_FAILURE; + } + else + { + Gen gen(argv[0]); + if(!gen) + return EXIT_FAILURE; + gen.generate(unit); + } + + unit -> destroy(); + } + + return status; +} diff --git a/cpp/src/slice2docbook/Makefile b/cpp/src/slice2docbook/Makefile new file mode 100644 index 00000000000..0eadcdb814d --- /dev/null +++ b/cpp/src/slice2docbook/Makefile @@ -0,0 +1,31 @@ +# ********************************************************************** +# +# Copyright (c) 2001 +# MutableRealms, Inc. +# Huntsville, AL, USA +# +# All Rights Reserved +# +# ********************************************************************** + +top_srcdir = ../../.. + +NAME = $(top_srcdir)/bin/slice2docbook + +TARGETS = $(NAME) + +OBJS = Gen.o \ + GenUtil.o \ + Main.o + +SRCS = $(OBJS:.o=.cpp) + +include $(top_srcdir)/config/Make.rules + +CPPFLAGS := -I../parser $(CPPFLAGS) + +$(NAME): $(OBJS) + rm -f $@ + $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $(OBJS) -lSlice $(BASELIBS) + +include .depend diff --git a/cpp/src/slice2docbook/docbook.dsp b/cpp/src/slice2docbook/docbook.dsp new file mode 100644 index 00000000000..96f2d02d71a --- /dev/null +++ b/cpp/src/slice2docbook/docbook.dsp @@ -0,0 +1,118 @@ +# Microsoft Developer Studio Project File - Name="docbook" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=docbook - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "docbook.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "docbook.mak" CFG="docbook - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "docbook - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "docbook - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "docbook - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GR /GX /O2 /I "." /I "../../../include" /I "../parser" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 jtc.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib setargv.obj /nologo /subsystem:console /machine:I386 /out:"../../../bin/slice2docbook.exe" /libpath:"../../../lib"
+
+!ELSEIF "$(CFG)" == "docbook - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /I "." /I "../../../include" /I "../parser" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 jtcd.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib setargv.obj /nologo /subsystem:console /debug /machine:I386 /out:"../../../bin/slice2docbook.exe" /pdbtype:sept /libpath:"../../../lib"
+
+!ENDIF
+
+# Begin Target
+
+# Name "docbook - Win32 Release"
+# Name "docbook - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\Gen.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\GenUtil.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\Main.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=.\Gen.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\GenUtil.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
|