makexindex.cpp
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:3k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // makexindex.cpp
  2. //
  3. // Copyright (C) 2004, Chris Laurel <claurel@shatters.net>
  4. //
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the GNU General Public License
  7. // as published by the Free Software Foundation; either version 2
  8. // of the License, or (at your option) any later version.
  9. //
  10. // Convert an ASCII cross index to binary
  11. #include <iostream>
  12. #include <fstream>
  13. #include <iomanip>
  14. #include <string>
  15. #include <celutil/basictypes.h>
  16. #include <celutil/bytes.h>
  17. using namespace std;
  18. static string inputFilename;
  19. static string outputFilename;
  20. void Usage()
  21. {
  22.     cerr << "Usage: makexindex [input file] [output file]n";
  23. }
  24. bool parseCommandLine(int argc, char* argv[])
  25. {
  26.     int i = 1;
  27.     int fileCount = 0;
  28.     while (i < argc)
  29.     {
  30.         if (argv[i][0] == '-')
  31.         {
  32.             cerr << "Unknown command line switch: " << argv[i] << 'n';
  33.             return false;
  34.         }
  35.         else
  36.         {
  37.             if (fileCount == 0)
  38.             {
  39.                 // input filename first
  40.                 inputFilename = string(argv[i]);
  41.                 fileCount++;
  42.             }
  43.             else if (fileCount == 1)
  44.             {
  45.                 // output filename second
  46.                 outputFilename = string(argv[i]);
  47.                 fileCount++;
  48.             }
  49.             else
  50.             {
  51.                 // more than two filenames on the command line is an error
  52.                 return false;
  53.             }
  54.             i++;
  55.         }
  56.     }
  57.     return true;
  58. }
  59. static void writeUint(ostream& out, uint32 n)
  60. {
  61.     LE_TO_CPU_INT32(n, n);
  62.     out.write(reinterpret_cast<char*>(&n), sizeof n);
  63. }
  64. static void writeShort(ostream& out, int16 n)
  65. {
  66.     LE_TO_CPU_INT16(n, n);
  67.     out.write(reinterpret_cast<char*>(&n), sizeof n);
  68. }
  69. bool WriteCrossIndex(istream& in, ostream& out)
  70. {
  71.     // Write the header
  72.     out.write("CELINDEX", 8);
  73.     // Write the version
  74.     writeShort(out, 0x0100);
  75.     
  76.     unsigned int record = 0;
  77.     while (!in.eof())
  78.     {
  79.         unsigned int catalogNumber;
  80.         unsigned int celCatalogNumber;
  81.         in >> catalogNumber;
  82.         if (in.eof())
  83.             return true;
  84.         in >> celCatalogNumber;
  85.         if (!in.good())
  86.         {
  87.             cerr << "Error parsing record #" << record << 'n';
  88.             return false;
  89.         }
  90.         writeUint(out, (uint32) catalogNumber);
  91.         writeUint(out, (uint32) celCatalogNumber);
  92.         record++;
  93.     }
  94.     return true;
  95. }
  96. int main(int argc, char* argv[])
  97. {
  98.     if (!parseCommandLine(argc, argv) || inputFilename.empty())
  99.     {
  100.         Usage();
  101.         return 1;
  102.     }
  103.     istream* inputFile = &cin;
  104.     if (!inputFilename.empty())
  105.     {
  106.         inputFile = new ifstream(inputFilename.c_str(), ios::in);
  107.         if (!inputFile->good())
  108.         {
  109.             cerr << "Error opening input file " << inputFilename << 'n';
  110.             return 1;
  111.         }
  112.     }
  113.     ostream* outputFile = &cout;
  114.     if (!outputFilename.empty())
  115.     {
  116.         outputFile = new ofstream(outputFilename.c_str(), ios::out | ios::binary);
  117.         if (!outputFile->good())
  118.         {
  119.             cerr << "Error opening output file " << outputFilename << 'n';
  120.             return 1;
  121.         }
  122.     }
  123.     bool success = WriteCrossIndex(*inputFile, *outputFile);
  124.     return success ? 0 : 1;
  125. }