home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 4 / FreshFish_May-June1994.bin / bbs / gnu / groff-1.09-src.lha / src / amiga / groff-1.09 / refer / ref.h < prev    next >
C/C++ Source or Header  |  1992-08-03  |  4KB  |  121 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, 675 Mass Ave, Cambridge, MA 02139, USA. */
  20.  
  21. struct label_info;
  22.  
  23. enum label_type { NORMAL_LABEL, SHORT_LABEL };
  24. const int N_LABEL_TYPES = 2;
  25.  
  26. struct substring_position {
  27.   int start;
  28.   int length;
  29.   substring_position() : start(-1) { }
  30. };
  31.  
  32. class int_set {
  33.   string v;
  34. public:
  35.   int_set() { }
  36.   void set(int i);
  37.   int get(int i) const;
  38. };
  39.  
  40. class reference {
  41. private:
  42.   unsigned h;
  43.   reference_id rid;
  44.   int merged;
  45.   string sort_key;
  46.   int no;
  47.   string *field;
  48.   int nfields;
  49.   unsigned char field_index[256];
  50.   enum { NULL_FIELD_INDEX = 255 };
  51.   string label;
  52.   substring_position separator_pos;
  53.   string short_label;
  54.   substring_position short_separator_pos;
  55.   label_info *label_ptr;
  56.   string authors;
  57.   int computed_authors;
  58.   int last_needed_author;
  59.   int nauthors;
  60.   int_set last_name_unambiguous;
  61.  
  62.   int contains_field(char) const;
  63.   void insert_field(unsigned char, string &s);
  64.   void delete_field(unsigned char);
  65.   void set_date(string &);
  66.   const char *get_sort_field(int i, int si, int ssi, const char **endp) const;
  67.   int merge_labels_by_parts(reference **, int, label_type, string &);
  68.   int merge_labels_by_number(reference **, int, label_type, string &);
  69. public:
  70.   reference(const char * = 0, int = -1, reference_id * = 0);
  71.   ~reference();
  72.   void output(FILE *);
  73.   void print_sort_key_comment(FILE *);
  74.   void set_number(int);
  75.   int get_number() const { return no; }
  76.   unsigned hash() const { return h; }
  77.   const string &get_label(label_type type) const;
  78.   const substring_position &get_separator_pos(label_type) const;
  79.   int is_merged() const { return merged; }
  80.   void compute_sort_key();
  81.   void compute_hash_code();
  82.   void pre_compute_label();
  83.   void compute_label();
  84.   void immediate_compute_label();
  85.   int classify();
  86.   void merge(reference &);
  87.   int merge_labels(reference **, int, label_type, string &);
  88.   int get_nauthors() const;
  89.   void need_author(int);
  90.   void set_last_name_unambiguous(int);
  91.   void sortify_authors(int, string &) const;
  92.   void canonicalize_authors(string &) const;
  93.   void sortify_field(unsigned char, int, string &) const;
  94.   const char *get_author(int, const char **) const;
  95.   const char *get_author_last_name(int, const char **) const;
  96.   const char *get_date(const char **) const;
  97.   const char *get_year(const char **) const;
  98.   const char *get_field(unsigned char, const char **) const;
  99.   const label_info *get_label_ptr() const { return label_ptr; }
  100.   const char *get_authors(const char **) const;
  101.   // for sorting
  102.   friend int compare_reference(const reference &r1, const reference &r2);
  103.   // for merging
  104.   friend int same_reference(const reference &, const reference &);
  105.   friend int same_year(const reference &, const reference &);
  106.   friend int same_date(const reference &, const reference &);
  107.   friend int same_author_last_name(const reference &, const reference &, int);
  108.   friend int same_author_name(const reference &, const reference &, int);
  109. };
  110.  
  111. const char *find_year(const char *, const char *, const char **);
  112. const char *find_last_name(const char *, const char *, const char **);
  113.  
  114. const char *nth_field(int i, const char *start, const char **endp);
  115.  
  116. void capitalize(const char *ptr, const char *end, string &result);
  117. void reverse_name(const char *ptr, const char *end, string &result);
  118. void uppercase(const char *ptr, const char *end, string &result);
  119. void lowercase(const char *ptr, const char *end, string &result);
  120. void abbreviate_name(const char *ptr, const char *end, string &result);
  121.