groff before CVS: release 1.06
[s-roff.git] / refer / ref.h
blob28e498dc5d83c2ab66c3e4b8064e246944eae520
1 // -*- C++ -*-
2 /* Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc.
3 Written by James Clark (jjc@jclark.com)
5 This file is part of groff.
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.
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.
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. */
21 struct label_info;
23 enum label_type { NORMAL_LABEL, SHORT_LABEL };
24 const int N_LABEL_TYPES = 2;
26 struct substring_position {
27 int start;
28 int length;
29 substring_position() : start(-1) { }
32 class int_set {
33 string v;
34 public:
35 int_set() { }
36 void set(int i);
37 int get(int i) const;
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;
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);
111 const char *find_year(const char *, const char *, const char **);
112 const char *find_last_name(const char *, const char *, const char **);
114 const char *nth_field(int i, const char *start, const char **endp);
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);