home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / txict100.zip / texicvt1.00 / source / main.cc < prev    next >
C/C++ Source or Header  |  1997-03-31  |  6KB  |  246 lines

  1. /*
  2. ================================================================================
  3.                         Texinfo converting Tools
  4.                          Release 1.00 28.03.97
  5.                        (c) 1996 by Andreas Kaiser
  6.                     (c) 1997 by Karl Heinz Marbaise
  7. ================================================================================
  8.  
  9. Discription:
  10.     Mainprogram for the Texinfo to IPF converter.
  11.  
  12. Authors:
  13.    Andreas Kaiser
  14.    Karl Heinz Marbaise
  15.  
  16. e-mail:
  17.    Internet: KHMarbaise@p69.ks.fido.de
  18.    Fido-net: 2:2452/117.69
  19.  
  20. Bugs, question:
  21.    to above e-mail adress.
  22.  
  23. Register:
  24.    Please send a e-mail to above adress to register.
  25.    (include the release you want to register)
  26.    This registration should be done to let me
  27.    know how many people using these tools and
  28.    if it is worth to invest more time in continuing
  29.    development these tools or let the first release
  30.    of them be the last.
  31.    That is the only reason to make a registration.
  32.    I think a e-mail is not to much, isn't it?
  33.  
  34. License:
  35.    The "Texinfo converting tools" are free software;
  36.    you can redistribute it and/or modify it under the terms of
  37.    the GNU General Public License as published by the Free
  38.    Software Foundation; either version 2, or (at your option)
  39.    any later version.
  40.  
  41.    The "Texinfo converting tools" are distributed in the hope that
  42.    they will be useful, but WITHOUT ANY WARRANTY; without even the
  43.    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
  44.    PURPOSE.  See the GNU General Public License for more details.
  45.  
  46.    You should have received a copy of the GNU General Public License
  47.    along with the "Texinfo converting tools" ; see the file COPYING.
  48.    If not, write to the:
  49.    Free Software Foundation,
  50.    59 Temple Place - Suite 330,
  51.    Boston, MA 02111-1307, USA.
  52.  
  53.    See \texicvt1.00\COPYING for details.
  54.  
  55. ================================================================================
  56. */
  57.  
  58. /*
  59. ------------------------------------------------------------------------------
  60.                       (R)evision (C)ontrol (S)ystem
  61. ------------------------------------------------------------------------------
  62. */
  63.  
  64. #if defined (__RCS__)
  65. static char *main_cc = "$Id: MAIN.CC 1.8 1997/03/30 15:08:19 KHM Exp $";
  66. #endif
  67.  
  68. #define EXTERN
  69. #define INIT(x) = x
  70. #include "info.h"
  71. #include <fstream.h>
  72. #include <stdio.h>
  73. #include <ctype.h>
  74. #if defined (__EMX__)
  75. #include <getopt.h>
  76. #include <process.h> /* spawnlp () */
  77. #else
  78. #include <GetOpt.h>
  79. #endif
  80.  
  81. #include "version.h"
  82.  
  83. void usage()
  84. {
  85.     cout <<"texi2ipf [options {in [out]]" << endl
  86.          <<" -Dflag    set Texinfo flag" << endl
  87.          <<" -Uflag    clear Texinfo flag" << endl
  88.          <<" -i    create IPF index" << endl
  89.          <<" -n    use @node to split into panels, not @chapter" << endl
  90.          <<" -d    debugging aid" << endl
  91.          <<" -f    flex scanner trace" << endl
  92.          <<" -v    print out version, copyright and" << endl
  93.              <<"        copying conditions." << endl
  94.          <<" in    texinfo file, default=stdin" << endl
  95.          <<" out    inf file (*.inf) or ipf source (else)" << endl;
  96. }
  97.  
  98. main(int argc, char **argv)
  99. {
  100.         int c;
  101.     int compile = 0;
  102.         int direct = 0;
  103.         char *fn = (char *)NULL;
  104. #if defined (__EMX__)
  105.         char s[_MAX_PATH];
  106.         char drive[_MAX_DRIVE];
  107.         char dir[_MAX_DIR];
  108.         char file[_MAX_FNAME];
  109.         char ext[_MAX_EXT];
  110. #endif
  111.     ofstream *outf = 0;
  112.  
  113.     extern int yy_flex_debug;
  114.  
  115.     yy_flex_debug = 0; /* usualy we don't put out debug information */
  116.  
  117.         f_node = 0; /* use chapter */
  118.         f_index = 0; /* don't create index */
  119.  
  120.         IncludeFile = 0;
  121.  
  122. #if defined (__EMX__)
  123.         GetOpt getopt(argc, argv, "?hdD:finU:ov");
  124. #else
  125.         GetOpt getopt(argc, argv, "?hdD:finU:v");
  126. #endif
  127.     for (c = 0; (c = getopt()) != EOF; )
  128.         switch (c) {
  129.                 case 'o':
  130.                         direct = 1;
  131.                         break;
  132.         case 'd':
  133.             ++debug;
  134.             break;
  135.         case 'D':
  136.             flags[(String &)getopt.optarg] = 1;
  137.             break;
  138.         case 'f':
  139.             ++yy_flex_debug;
  140.             break;
  141.         case 'i':
  142.             ++f_index;
  143.             break;
  144.         case 'n':
  145.             ++f_node;
  146.             break;
  147.         case 'U':
  148.             flags[(String &)getopt.optarg] = (const char *)0;
  149.             break;
  150.                 case 'v':
  151.                         PrintCopyright ();
  152.                 case '?':
  153.                 case 'h':
  154.         default:
  155.             usage();
  156.             exit(2);
  157.         }
  158.     if (getopt.optind < argc) {
  159.                 fn = argv[getopt.optind];
  160.         if (freopen(fn, "r", stdin) == NULL) {
  161.             perror(fn);
  162.             exit(1);
  163.         }
  164.     }
  165.     String ipfname, basename;
  166.  
  167.  
  168. #if defined (__EMX__)
  169.         if (direct)
  170.         {
  171.             sprintf (s, fn);
  172.             /* might not work on other systems like linux ! */
  173.             _splitpath(s,drive,dir,file,ext);
  174.             _makepath (s,drive,dir,file,".ipf");
  175.             fprintf (stderr, "converting %s to %s\n", fn, s);
  176.         out = outf = new ofstream(s);
  177.         if (!outf->good()) {
  178.             perror(s);
  179.             exit(1);
  180.         }
  181.         }
  182. #endif
  183.     if (++getopt.optind < argc) {
  184.         ipfname = argv[getopt.optind];
  185.         int ext = ipfname.index('.', -1);
  186.         if (ext >= 0) {
  187.             basename = ipfname.before(ext);
  188.             if (fcompare(ipfname.from(ext), ".inf") == 0) {
  189.                 compile = 1;
  190.                 ipfname.from(ext) = ".ipf";
  191.             }
  192.         }
  193.         out = outf = new ofstream(ipfname);
  194.         if (!outf->good()) {
  195.             perror(ipfname);
  196.             exit(1);
  197.         }
  198.     }
  199.  
  200.         *out << ".* " << RELEASENAME << endl;
  201.         *out << ".* " << COPYRIGHT << endl;
  202.  
  203.     *out << ":userdoc." << endl
  204.          << ":docprof toc=123456." << endl;
  205.  
  206.  
  207.     while ((c = yylex()) > 0)
  208.         if (c == '\n')
  209.             newline();
  210.         else
  211.             PUTS((char)c);
  212.  
  213.     *out << ":euserdoc." << endl;
  214.  
  215.     if (outf) {
  216.         outf->close();
  217.         if (IncludeFile)
  218.             cerr << endl;
  219. #if defined(__EMX__)
  220.         if (compile) {
  221.             Regex rpath ("[:\\\\/]");
  222.             int split = basename.index(rpath, -1);
  223.             if (split >= 0) {
  224.                 String path (basename.through(split));
  225.                 _chdrive(toupper(path[0])); // EMX library bug
  226.                 _chdir2(path);
  227.                 basename.del(0, split + 1);
  228.             }
  229.             int r = spawnlp(0, "ipfc", "ipfc",
  230.                 "/w1", "/codepage=850", "/inf",
  231.                 basename.chars(), NULL);
  232.             if (r < 0) {
  233.                 perror("starting ipfc");
  234.                 exit(1);
  235.             } else if (r == 0) {
  236.                 basename += ".ipf";
  237.                 remove(basename);
  238.             }
  239.         }
  240. #endif
  241.     }
  242.  
  243.     return c ? 1 : 0;
  244. }
  245.  
  246.