main.cxx
上传用户:hzhsqp
上传日期:2007-01-06
资源大小:1600k
文件大小:12k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * main.cxx
  3.  *
  4.  * Resource compiler
  5.  *
  6.  * Portable Windows Library
  7.  *
  8.  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
  9.  *
  10.  * The contents of this file are subject to the Mozilla Public License
  11.  * Version 1.0 (the "License"); you may not use this file except in
  12.  * compliance with the License. You may obtain a copy of the License at
  13.  * http://www.mozilla.org/MPL/
  14.  *
  15.  * Software distributed under the License is distributed on an "AS IS"
  16.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17.  * the License for the specific language governing rights and limitations
  18.  * under the License.
  19.  *
  20.  * The Original Code is Portable Windows Library.
  21.  *
  22.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  23.  *
  24.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  25.  * All Rights Reserved.
  26.  *
  27.  * Contributor(s): ______________________________________.
  28.  *
  29.  * $Log: main.cxx,v $
  30.  * Revision 1.34  2000/06/21 03:15:24  robertj
  31.  * Added ability to append resources to existing file.
  32.  *
  33.  * Revision 1.33  1999/10/29 12:01:43  robertj
  34.  * Fixed #ifdef conditional around the wrong way.
  35.  *
  36.  * Revision 1.32  1999/10/19 07:08:23  robertj
  37.  * Added #ifdef/#ifndef condition compile functionality
  38.  *
  39.  * Revision 1.31  1999/10/18 04:41:09  robertj
  40.  * Added decompile of .BMP and .ICO files and fixed ability to have 64x64 icons
  41.  *
  42.  * Revision 1.30  1998/11/22 09:29:50  craigs
  43.  * *** empty log message ***
  44.  *
  45.  * Revision 1.29  1998/11/22 08:28:26  robertj
  46.  * Changed output file so platform dependent file is .res.cxx so is compatible with Windows.
  47.  *
  48.  * Revision 1.28  1998/09/26 01:24:08  robertj
  49.  * Added open source license
  50.  *
  51.  * Revision 1.27  1998/09/26 00:37:45  robertj
  52.  * Fixed name space conflict with type Cursor.
  53.  *
  54.  * Revision 1.26  1998/09/14 13:45:26  robertj
  55.  * Allowed suppression of some warnings.
  56.  *
  57.  * Revision 1.25  1996/01/28 03:05:20  robertj
  58.  * Editor changes back fed into command line utility.
  59.  *
  60.  * Revision 1.24  1996/01/02 13:04:05  robertj
  61.  * Changed version number specs.
  62.  *
  63.  * Revision 1.23  1995/12/23 03:51:56  robertj
  64.  * New startup mechanism and version numbers.
  65.  *
  66.  * Revision 1.22  1995/12/10 12:12:01  robertj
  67.  * Changes to support graphical resource file editor.
  68.  *
  69.  * Revision 1.21  1995/10/14 15:19:11  robertj
  70.  * Fixed missing font size on font keyword.
  71.  * Changes required by move of standard buttons to PDialog.
  72.  *
  73.  * Revision 1.20  1995/08/24 12:47:35  robertj
  74.  * Removed redundant parent parameter for ConstructEnd().
  75.  * General updating to latest coding standard.
  76.  *
  77.  * Revision 1.18  1995/07/31 12:30:11  robertj
  78.  * Changed all generated resource IDs to be in the same "number space". This
  79.  *   is to avoid problems with IDs being used for more than one type of resource
  80.  *   eg a menu item and an image for a toolbar.
  81.  * Fixed the generated #line commands to include a relative path instead of an
  82.  *   absolute one.
  83.  *
  84.  * Revision 1.17  1995/04/02 09:28:13  robertj
  85.  * Added "balloon" help.
  86.  *
  87.  * Revision 1.16  1995/02/19 04:17:22  robertj
  88.  * Moved most inline code from header file to cxx file.
  89.  *
  90.  * Revision 1.15  1995/02/11  04:13:47  robertj
  91.  * Strange problem with variable "small" in MSVC 2.0.
  92.  *
  93.  * Revision 1.14  1995/01/27  11:25:40  robertj
  94.  * Added pattern resource.
  95.  *
  96.  * Revision 1.13  1995/01/14  06:27:22  robertj
  97.  * Fixed bug in data array allocation.
  98.  *
  99.  * Revision 1.12  1994/12/05  11:37:58  robertj
  100.  * Added #line to generated code.
  101.  *
  102.  * Revision 1.11  1994/10/30  11:47:43  robertj
  103.  * Changed mechanism for doing notification callback functions.
  104.  *
  105.  * Revision 1.10  1994/07/02  03:25:39  robertj
  106.  * Fixed bug in program return value.
  107.  *
  108.  * Revision 1.9  1994/06/25  12:05:01  robertj
  109.  * Unix synchronisation.
  110.  *
  111.  * Revision 1.8  1994/04/20  12:47:01  robertj
  112.  * *** empty log message ***
  113.  *
  114.  * Revision 1.7  1994/04/03  08:37:00  robertj
  115.  * *** empty log message ***
  116.  *
  117.  * Revision 1.6  1994/04/01  14:29:16  robertj
  118.  * New format PRC file
  119.  *
  120.  * Revision 1.5  1993/12/31  07:05:07  robertj
  121.  * Changed pixmap images for one pixel one number in PRC file.
  122.  *
  123.  * Revision 1.4  1993/07/16  12:53:12  robertj
  124.  * Added converted form of C literal string to resource objects.
  125.  * Fixed header comment character.
  126.  *
  127.  * Revision 1.3  1993/07/15  04:38:31  robertj
  128.  * Rationalised lex.h, parse.h and main.h out of existance.
  129.  *
  130.  * Revision 1.2  1993/07/14  01:57:48  robertj
  131.  * Assure have a gray scale clut if none explicitly defined.
  132.  *
  133.  * Revision 1.1  1993/07/03  06:00:47  robertj
  134.  * Initial revision
  135.  *
  136.  * Revision 1.1  1993/06/24  19:23:17  craigs
  137.  * Initial revision
  138.  *
  139.  */
  140. #include <ptlib.h>
  141. #include "pwrc.h"
  142. extern void Decompile(PFile & in, PTextFile & out);
  143. ///////////////////////////////////////////////////////////////////////////////
  144. // Application class
  145. PDECLARE_CLASS(PwrcApp, PProcess)
  146.   public:
  147.     PwrcApp() : PProcess("Equivalence", "PWRC", 1, 0, AlphaCode, 22) { }
  148.   private:
  149.     virtual void Main();
  150.     PTextFile prcfile, resfile, cxxfile, hdrfile;
  151. };
  152. PCREATE_PROCESS(PwrcApp);
  153. extern PString OutputExtension;
  154. extern PString CxxExtension;
  155. PString InputExtension(".prc");
  156. #if defined (YYDEBUG)
  157. extern int yydebug;
  158. #endif
  159. ///////////////////////////////////////////////////////////////////////////////
  160. // Application class functions
  161. void PwrcApp::Main()
  162. {
  163.   // print the title
  164.   PError << "Portable Windows Resource Compiler v" << GetVersion(TRUE) << endl
  165.          << "Copyright (C) 1993 by Equivalence" << endl << endl;
  166.   // parse the options
  167.   PArgList & arguments = GetArguments();
  168.   arguments.Parse("?nhdyvwD:o:b:I:ag:");
  169.   SetTerminationValue(1);
  170.   // display help if requested
  171.   if (arguments.GetCount() < 1 ||
  172.                         arguments.HasOption('?') || arguments.HasOption('h')) {
  173.     PError << endl << "usage: " << GetName() << " -hdvni"
  174. #if defined (YYDEBUG)
  175.             "y"
  176. #endif
  177.             "[-D name[=integer]] [-o resfile] [ -b basename ] [-I path ] prcfilen"
  178.             "    -d:       decompile resourcen"
  179. #if defined (YYDEBUG)
  180.             "    -y:       enable parser debugging outputn"
  181. #endif
  182.             "    -v        verbosen"
  183.             "    -w        Do not show warningsn"
  184.             "    -D name   Define symbol "name" to value (default 1)n"
  185.             "    -o file   set output resource file namen"
  186.             "    -a        append resources to output filen"
  187.             "    -b base   set base name of .cxx and .h filesn"
  188.             "    -I path   set include file pathn"
  189.             "    -n        suppress output of #includes in header filen"
  190.             "    -i        decompile with resource idsn"
  191.             "    -g gui    set GUI variant (xlib,motif)n"
  192.             "    -h or -?  display helpn";
  193.     return;
  194.   }
  195. #if defined (YYDEBUG)
  196.   if (arguments.HasOption('y'))  // enable yacc debugging
  197.     yydebug = 1;
  198. #endif
  199.   if (arguments.HasOption('I'))
  200.     IncludePath = arguments.GetOptionString('I').Tokenise(';', FALSE);
  201.   else {
  202.     PConfig env(PConfig::Environment);
  203.     IncludePath = env.GetString("INCLUDE").Tokenise(';', FALSE);
  204.   }
  205.   PFilePath path = arguments[0];
  206.   if (path.GetType().IsEmpty())
  207.     path += (arguments.HasOption('d') ? OutputExtension : InputExtension);
  208.   // attempt to open the input file
  209.   if (!prcfile.Open(path, PFile::ReadOnly)) {
  210.     PError << GetName() << ": cannot open "" 
  211.          << prcfile.GetFilePath() << "" :" << prcfile.GetErrorText() << endl;
  212.     return;
  213.   }
  214.   PFilePath out_path;
  215.   if (arguments.HasOption('o'))
  216.     out_path = arguments.GetOptionString('o');
  217.   else
  218.     out_path = path.GetVolume() + path.GetPath() + path.GetTitle() +
  219.                 (arguments.HasOption('d') ? InputExtension : OutputExtension);
  220.   if (out_path == prcfile.GetFilePath()) {
  221.     PError << GetName() << ": input and output file are identical" << endl;
  222.     return;
  223.   }
  224.   BOOL appendResource = arguments.HasOption('a');
  225.   if (!resfile.Open(out_path, PFile::WriteOnly,
  226.                     PFile::Create|(appendResource ? 0 : PFile::Truncate))) {
  227.     PError << GetName() << ": cannot create "" 
  228.          << resfile.GetFilePath() << "" :" << resfile.GetErrorText() << endl;
  229.     return;
  230.   }
  231.   if (appendResource)
  232.     resfile.seekp(0, ios::end);
  233.   if (arguments.HasOption('d')) { // Are decompiling resource file
  234.     if (arguments.HasOption('v'))
  235.       cout << "Input file   : " << prcfile.GetFilePath() << endl
  236.            << "Resource file: " << resfile.GetFilePath() << endl;
  237.     Decompile(prcfile, resfile);
  238.     SetTerminationValue(0);
  239.     return;
  240.   }
  241.   // get the base name, if specified
  242.   if (arguments.HasOption('b')) {
  243.     path = arguments.GetOptionString('b');
  244.     if (!path.GetType().IsEmpty()) {
  245.       PError << GetName() << ": cannot specify extension on base name" << endl;
  246.       return;
  247.     }
  248.   }
  249.   else
  250.     path = path.GetVolume() + path.GetPath() + path.GetTitle();
  251.   if (!cxxfile.Open(path + CxxExtension, PFile::WriteOnly)) {
  252.     PError << GetName() << ": cannot create "" 
  253.          << cxxfile.GetFilePath() << "" :" << cxxfile.GetErrorText() << endl;
  254.     return;
  255.   }
  256.   if (!hdrfile.Open(path + ".h", PFile::WriteOnly)) {
  257.     PError << GetName() << ": cannot create "" 
  258.          << hdrfile.GetFilePath() << "" :" << hdrfile.GetErrorText() << endl;
  259.     return;
  260.   }
  261.   if (arguments.HasOption('v')) {
  262.     cout << "Input file   : " << prcfile.GetFilePath() << endl
  263.          << "Resource file: " << resfile.GetFilePath();
  264.     if (appendResource)
  265.       cout << " (appending)";
  266.     cout << endl
  267.          << "Source file  : " << cxxfile.GetFilePath() << endl
  268.          << "Header file  : " << hdrfile.GetFilePath() << endl;
  269.   }
  270.   // parse the file
  271.   ResourceFile res(prcfile, arguments.HasOption('w'), arguments.GetOptionString('D'));
  272.   // only continue with the build if we have no errors
  273.   if (res.Fatals() == 0) {
  274.     res.OutputCode(hdrfile.GetFilePath(),
  275.                                    hdrfile, cxxfile, arguments.HasOption('n'));
  276.     res.Backend(resfile);
  277.   }
  278.   // display number of errors and warnings
  279.   SetTerminationValue(0);
  280.   if (res.Warnings() == 0 && res.Fatals() == 0)
  281.     PError << "Portable resource compilation successful." << endl;
  282.   else {
  283.     PError << res.Warnings() << " warnings(s)" << endl;
  284.     PError << res.Fatals() << " error(s)" << endl;
  285.     if (res.Fatals() != 0) {
  286.       SetTerminationValue(2);
  287.       resfile.Remove();
  288.       cxxfile.Remove();
  289.       hdrfile.Remove();
  290.     }
  291.   }
  292. }
  293. /////////////////////////////////////////
  294. //
  295. //  key code structure
  296. //
  297. PObject * PKeyCode::Clone() const
  298. {
  299.   return new PKeyCode(value, modifiers);
  300. }
  301. PObject::Comparison PKeyCode::Compare(const PObject & obj) const
  302. {
  303.   const PKeyCode & other = (const PKeyCode &)obj;
  304.   if (value == other.value && modifiers == other.modifiers)
  305.     return EqualTo;
  306.   return value < other.value ? LessThan : GreaterThan;
  307. }
  308. PKeyCode::PKeyCode(Value theValue, int theMods)
  309. {
  310.   value = theValue;
  311.   modifiers = theMods;
  312. }
  313. PKeyCode::Value PKeyCode::GetValue() const
  314. {
  315.   return value;
  316. }
  317. int PKeyCode::GetModifiers() const
  318. {
  319.   return modifiers;
  320. }
  321. BOOL PKeyCode::IsModifier(int modmask) const
  322. {
  323.   return (modifiers&modmask) != 0;
  324. }
  325. void StringResource::EditResource(MainWindow *, ResourceFile *) { }
  326. void MenuBar::EditResource(MainWindow *, ResourceFile *) { }
  327. void Layout::EditResource(MainWindow *, ResourceFile *) { }
  328. void Icon::EditResource(MainWindow *, ResourceFile *) { }
  329. void CursorResource::EditResource(MainWindow *, ResourceFile *) { }
  330. void Pattern::EditResource(MainWindow *, ResourceFile *) { }
  331. void Image::EditResource(MainWindow *, ResourceFile *) { }
  332. void DataResource::EditResource(MainWindow *, ResourceFile *) { }
  333. // MAIN.CXX