home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / fontutils-0.6-base.tgz / fontutils-0.6-base.tar / fsf / fontutils / include / cmdline.h < prev    next >
C/C++ Source or Header  |  1992-08-23  |  5KB  |  135 lines

  1. /* cmdline.h: macros to help process command-line arguments.
  2.  
  3. Copyright (C) 1992 Free Software Foundation, Inc.
  4.  
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2, or (at your option)
  8. any later version.
  9.  
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. GNU General Public License for more details.
  14.  
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  18.  
  19. #ifndef CMDLINE_H
  20. #define CMDLINE_H
  21.  
  22. #include "filename.h"
  23. #include "getopt.h"
  24. #include "global.h"
  25.  
  26.  
  27. /* Test whether getopt found an option ``A''.
  28.    Assumes the option index is in the variable `option_index', and the
  29.    option table in a variable `long_options'.  */
  30.  
  31. #define ARGUMENT_IS(a) STREQ (long_options[option_index].name, a)
  32.  
  33.  
  34. /* Read the string S as a percentage, i.e., a number between 0 and 100.  */
  35.  
  36. #define GET_PERCENT(s)                             \
  37.   ({                                     \
  38.     unsigned temp = atou (s);                         \
  39.     if (temp > 100)                             \
  40.       FATAL1 ("GET_PERCENT: The argument %u should be at most 100, since \
  41. it's a percentage", temp);                         \
  42.     temp / 100.0;                             \
  43.   })
  44.  
  45.  
  46. /* Read the string S as two character codes separated by a hyphen.  Put
  47.    the numeric values of the codes into START and END.  */
  48.  
  49. #define GET_RANGE(s, start, end)                    \
  50.   do                                    \
  51.     {                                    \
  52.       string str1 = strtok (s, "-");                    \
  53.       if (str1 == NULL)                            \
  54.         FATAL1 ("GET_RANGE: No character code in argument `%s'", s);    \
  55.       start = xparse_charcode (str1);                    \
  56.       end = xparse_charcode (s + strlen (str1) + 1);            \
  57.     }                                    \
  58.   while (0)
  59.  
  60.  
  61. /* In most programs, we want to deduce the resolution from the filename
  62.    given, if possible.  But in some we don't.  Correspondingly, we want
  63.    to remove the suffix if we do deduce the resolution (since the
  64.    resolution is the suffix (plus a format)). Assumes lots of
  65.    variables.  */
  66.  
  67. #ifdef CMDLINE_NO_DPI
  68. #define FIND_CMDLINE_DPI() /* as nothing */
  69. #define MAYBE_REMOVE_SUFFIX(s) s
  70. #else
  71. #define FIND_CMDLINE_DPI()                        \
  72.   if (!explicit_dpi)                            \
  73.     {                                    \
  74.       string test_dpi = find_dpi (argv[optind]);            \
  75.       if (test_dpi != NULL)                        \
  76.         dpi = test_dpi;                            \
  77.     }
  78. #define MAYBE_REMOVE_SUFFIX(s) remove_suffix (s)
  79. #endif
  80.  
  81.  
  82. /* Perform common actions at the end of parsing the arguments.  Assumes
  83.    lots of variables: `printed_version', a boolean for whether the
  84.    version number has been printed; `optind', the current option index;
  85.    `argc'; `argv'; and `explicit_dpi', for whether the resolution has
  86.    been assigned already.  */
  87.  
  88. #define FINISH_COMMAND_LINE()                        \
  89.   do                                    \
  90.     {                                    \
  91.       /* Just wanted to know the version number?  */            \
  92.       if (printed_version && optind == argc) exit (0);            \
  93.                                                                         \
  94.       /* Exactly one (non-empty) argument left?  */            \
  95.       if (optind + 1 == argc && *argv[optind] != 0)            \
  96.         {                                \
  97.           FIND_CMDLINE_DPI ();                        \
  98.           return MAYBE_REMOVE_SUFFIX (argv[optind]);            \
  99.         }                                \
  100.       else                                \
  101.         {                                \
  102.           fprintf (stderr, "Usage: %s [options] <font_name>.\n", argv[0]);\
  103.           fprintf (stderr, "(%s.)\n", optind == argc ? "Missing <font_name>"\
  104.                                       : "Too many <font_name>s");    \
  105.           fputs ("For more information, use ``-help''.\n", stderr);    \
  106.           exit (1);                            \
  107.         }                                \
  108.       return NULL; /* stop warnings */                    \
  109.     }                                    \
  110.   while (0)
  111.  
  112. #define GETOPT_USAGE \
  113. "  You can use `--' or `-' to start an option.
  114.   You can use any unambiguous abbreviation for an option name.
  115.   You can separate option names and values with `=' or ` '.
  116. "
  117.  
  118. /* What to pass to `strtok' to separate different arguments to an
  119.    option, as in `-option=arg1,arg2,arg3'.  It is useful to allow
  120.    whitespace as well so that the option value can come from a file, via
  121.    the shell construct "`cat file`" (including the quotes).  */
  122. #define ARG_SEP ", \t\n"
  123.  
  124.  
  125. /* This parses a string of unsigned integers separated by commas, and
  126.    returns a vector of the integers (as numbers).  A -1 is appended to
  127.    mark the end of the list, hence the return type.  */
  128. extern int *scan_unsigned_list (string);
  129.  
  130. /* If S has the form <name>.<number><stuff>, as in `foo.1200gf', return
  131.    <number>, as a string; otherwise, return NULL.  */
  132. extern string find_dpi (string s);
  133.  
  134. #endif /* not CMDLINE_H */
  135.