Initial import from FreeBSD RELENG_4:
[dragonfly.git] / contrib / groff / src / preproc / refer / ref.h
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 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);