home *** CD-ROM | disk | FTP | other *** search
/ Aminet 10 / aminetcdnumber101996.iso / Aminet / util / gnu / groff_src.lha / groff-1.10src / addftinfo / addftinfo.cc next >
C/C++ Source or Header  |  1995-06-22  |  5KB  |  197 lines

  1. // -*- C++ -*-
  2. /* Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc.
  3.      Written by James Clark (jjc@jclark.com)
  4.  
  5. This file is part of groff.
  6.  
  7. groff is free software; you can redistribute it and/or modify it under
  8. the terms of the GNU General Public License as published by the Free
  9. Software Foundation; either version 2, or (at your option) any later
  10. version.
  11.  
  12. groff is distributed in the hope that it will be useful, but WITHOUT ANY
  13. WARRANTY; without even the implied warranty of MERCHANTABILITY or
  14. FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  15. for more details.
  16.  
  17. You should have received a copy of the GNU General Public License along
  18. with groff; see the file COPYING.  If not, write to the Free Software
  19. Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
  20.  
  21. #include <stdio.h>
  22. #include <ctype.h>
  23. #include <string.h>
  24. #include <assert.h>
  25. #include <stdlib.h>
  26. #include <errno.h>
  27. #include "lib.h"
  28. #include "errarg.h"
  29. #include "error.h"
  30. #include "stringclass.h"
  31. #include "cset.h"
  32. #include "guess.h"
  33.  
  34. static void usage();
  35. static void convert_font(const font_params &, FILE *, FILE *);
  36.  
  37. typedef int font_params::*param_t;
  38.  
  39. static struct {
  40.   const char *name;
  41.   param_t par;
  42. } param_table[] = {
  43.   { "x-height", &font_params::x_height },
  44.   { "fig-height", &font_params::fig_height },
  45.   { "asc-height", &font_params::asc_height },
  46.   { "body-height", &font_params::body_height },
  47.   { "cap-height", &font_params::cap_height },
  48.   { "comma-depth", &font_params::comma_depth },
  49.   { "desc-depth", &font_params::desc_depth },
  50.   { "body-depth", &font_params::body_depth },
  51. };
  52.  
  53. // These are all in thousandths of an em.
  54. // These values are correct for PostScript Times Roman.
  55.  
  56. #define DEFAULT_X_HEIGHT 448
  57. #define DEFAULT_FIG_HEIGHT 676
  58. #define DEFAULT_ASC_HEIGHT 682
  59. #define DEFAULT_BODY_HEIGHT 676
  60. #define DEFAULT_CAP_HEIGHT 662
  61. #define DEFAULT_COMMA_DEPTH 143
  62. #define DEFAULT_DESC_DEPTH 217
  63. #define DEFAULT_BODY_DEPTH 177
  64.  
  65. int main(int argc, char **argv)
  66. {
  67.   program_name = argv[0];
  68.   if (argc < 4)
  69.     usage();
  70.   int resolution;
  71.   if (sscanf(argv[argc-3], "%d", &resolution) != 1)
  72.     usage();
  73.   if (resolution <= 0)
  74.     fatal("resolution must be > 0");
  75.   int unitwidth;
  76.   if (sscanf(argv[argc-2], "%d", &unitwidth) != 1)
  77.     usage();
  78.   if (unitwidth <= 0)
  79.     fatal("unitwidth must be > 0");
  80.   font_params param;
  81.   const char *font = argv[argc-1];
  82.   param.italic = (font[0] != '\0' && strchr(font, '\0')[-1] == 'I');
  83.   param.em = (resolution*unitwidth)/72;
  84.   param.x_height = DEFAULT_X_HEIGHT;
  85.   param.fig_height = DEFAULT_FIG_HEIGHT;
  86.   param.asc_height = DEFAULT_ASC_HEIGHT;
  87.   param.body_height = DEFAULT_BODY_HEIGHT;
  88.   param.cap_height = DEFAULT_CAP_HEIGHT;
  89.   param.comma_depth = DEFAULT_COMMA_DEPTH;
  90.   param.desc_depth = DEFAULT_DESC_DEPTH;
  91.   param.body_depth = DEFAULT_BODY_DEPTH;
  92.   int i;
  93.   for (i = 1; i < argc && argv[i][0] == '-'; i++) {
  94.     if (argv[i][1] == '-' && argv[i][2] == '\0') {
  95.       i++;
  96.       break;
  97.     }
  98.     if (i + 1 >= argc)
  99.       usage();
  100.     int j;
  101.     for (j = 0;; j++) {
  102.       if (j >= sizeof(param_table)/sizeof(param_table[0]))
  103.     fatal("parameter `%1' not recognized", argv[i] + 1);
  104.       if (strcmp(param_table[j].name, argv[i] + 1) == 0)
  105.     break;
  106.     }
  107.     if (sscanf(argv[i+1], "%d", &(param.*(param_table[j].par))) != 1)
  108.       fatal("invalid argument `%1'", argv[i+1]);
  109.     i++;
  110.   }    
  111.   if (argc - i != 3)
  112.     usage();
  113.   errno = 0;
  114.   FILE *infp = fopen(font, "r");
  115.   if (infp == 0)
  116.     fatal("can't open `%1': %2", font, strerror(errno));
  117.   convert_font(param, infp, stdout);
  118.   return 0;
  119. }
  120.  
  121. static void usage()
  122. {
  123.   fprintf(stderr, "usage: %s [-param value] ... resolution unitwidth font\n",
  124.       program_name);
  125.   exit(1);
  126. }
  127.  
  128. static int get_line(FILE *fp, string *p)
  129. {
  130.   int c;
  131.   p->clear();
  132.   while ((c = getc(fp)) != EOF) {
  133.     *p += char(c);
  134.     if (c == '\n')
  135.       break;
  136.   }
  137.   return p->length() > 0;
  138. }
  139.   
  140. static void convert_font(const font_params ¶m, FILE *infp, FILE *outfp)
  141. {
  142.   string s;
  143.   while (get_line(infp, &s)) {
  144.     put_string(s, outfp);
  145.     if (s.length() >= 8
  146.     && strncmp(&s[0], "charset", 7))
  147.       break;
  148.   }
  149.   while (get_line(infp, &s)) {
  150.     s += '\0';
  151.     string name;
  152.     const char *p = s.contents();
  153.     while (csspace(*p))
  154.       p++;
  155.     while (*p != '\0' && !csspace(*p))
  156.       name += *p++;
  157.     while (csspace(*p))
  158.       p++;
  159.     for (const char *q = s.contents(); q < p; q++)
  160.       putc(*q, outfp);
  161.     char *next;
  162.     char_metric metric;
  163.     metric.width = (int)strtol(p, &next, 10);
  164.     if (next != p) {
  165.       printf("%d", metric.width);
  166.       p = next;
  167.       metric.type = (int)strtol(p, &next, 10);
  168.       if (next != p) {
  169.     name += '\0';
  170.     guess(name.contents(), param, &metric);
  171.     if (metric.sk == 0) {
  172.       if (metric.left_ic == 0) {
  173.         if (metric.ic == 0) {
  174.           if (metric.depth == 0) {
  175.         if (metric.height != 0)
  176.           printf(",%d", metric.height);
  177.           }
  178.           else
  179.         printf(",%d,%d", metric.height, metric.depth);
  180.         }
  181.         else
  182.           printf(",%d,%d,%d", metric.height, metric.depth, metric.ic);
  183.       }
  184.       else
  185.         printf(",%d,%d,%d,%d", metric.height, metric.depth, metric.ic,
  186.            metric.left_ic);
  187.     }
  188.     else
  189.       printf(",%d,%d,%d,%d,%d", metric.height, metric.depth, metric.ic,
  190.          metric.left_ic, metric.sk);
  191.       }
  192.     }
  193.     fputs(p, outfp);
  194.   }
  195. }
  196.  
  197.