152419Sjulian// -*- C++ -*-
252419Sjulian/* Copyright (C) 1989, 1990, 1991, 1992, 2005 Free Software Foundation, Inc.
3139823Simp     Written by James Clark (jjc@jclark.com)
4139823Simp
5139823SimpThis file is part of groff.
652419Sjulian
752419Sjuliangroff is free software; you can redistribute it and/or modify it under
852419Sjulianthe terms of the GNU General Public License as published by the Free
952419SjulianSoftware Foundation; either version 2, or (at your option) any later
1052419Sjulianversion.
1152419Sjulian
1252419Sjuliangroff is distributed in the hope that it will be useful, but WITHOUT ANY
1352419SjulianWARRANTY; without even the implied warranty of MERCHANTABILITY or
1452419SjulianFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1552419Sjulianfor more details.
1652419Sjulian
1752419SjulianYou should have received a copy of the GNU General Public License along
1852419Sjulianwith groff; see the file COPYING.  If not, write to the Free Software
1952419SjulianFoundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */
2052419Sjulian
2152419Sjulian// declarations to avoid friend name injection problems
2252419Sjulianint compare_reference(const reference &, const reference &);
2352419Sjulianint same_reference(const reference &, const reference &);
2452419Sjulianint same_year(const reference &, const reference &);
2552419Sjulianint same_date(const reference &, const reference &);
2652419Sjulianint same_author_last_name(const reference &, const reference &, int);
2752419Sjulianint same_author_name(const reference &, const reference &, int);
2852419Sjulian
2952419Sjulianstruct label_info;
3052419Sjulian
3152419Sjulianenum label_type { NORMAL_LABEL, SHORT_LABEL };
3252419Sjulianconst int N_LABEL_TYPES = 2;
3352419Sjulian
3452419Sjulianstruct substring_position {
3552419Sjulian  int start;
3652419Sjulian  int length;
3752419Sjulian  substring_position() : start(-1) { }
3867506Sjulian};
3952419Sjulian
4052419Sjulianclass int_set {
4152419Sjulian  string v;
4252419Sjulianpublic:
4352419Sjulian  int_set() { }
44122481Sru  void set(int i);
45122481Sru  int get(int i) const;
4652419Sjulian};
4752419Sjulian
4852419Sjulianclass reference {
4952419Sjulianprivate:
5052419Sjulian  unsigned h;
5152562Sjulian  reference_id rid;
5252419Sjulian  int merged;
53132703Sglebius  string sort_key;
5452419Sjulian  int no;
5552419Sjulian  string *field;
5652419Sjulian  int nfields;
5752419Sjulian  unsigned char field_index[256];
5852419Sjulian  enum { NULL_FIELD_INDEX = 255 };
5952419Sjulian  string label;
6052419Sjulian  substring_position separator_pos;
6152419Sjulian  string short_label;
6252419Sjulian  substring_position short_separator_pos;
6352419Sjulian  label_info *label_ptr;
6452419Sjulian  string authors;
6552419Sjulian  int computed_authors;
66132703Sglebius  int last_needed_author;
67132703Sglebius  int nauthors;
68154901Sglebius  int_set last_name_unambiguous;
69154901Sglebius
70154901Sglebius  int contains_field(char) const;
71132703Sglebius  void insert_field(unsigned char, string &s);
7252419Sjulian  void delete_field(unsigned char);
7352419Sjulian  void set_date(string &);
7490973Sbrian  const char *get_sort_field(int i, int si, int ssi, const char **endp) const;
7552419Sjulian  int merge_labels_by_parts(reference **, int, label_type, string &);
7652441Sjulian  int merge_labels_by_number(reference **, int, label_type, string &);
7752419Sjulianpublic:
7852419Sjulian  reference(const char * = 0, int = -1, reference_id * = 0);
7952419Sjulian  ~reference();
8052419Sjulian  void output(FILE *);
8152419Sjulian  void print_sort_key_comment(FILE *);
8252419Sjulian  void set_number(int);
8352419Sjulian  int get_number() const { return no; }
8469934Sjulian  unsigned hash() const { return h; }
8590973Sbrian  const string &get_label(label_type type) const;
8696578Sbrian  const substring_position &get_separator_pos(label_type) const;
87132703Sglebius  int is_merged() const { return merged; }
88161117Sglebius  void compute_sort_key();
89132703Sglebius  void compute_hash_code();
90161117Sglebius  void pre_compute_label();
9152419Sjulian  void compute_label();
9252419Sjulian  void immediate_compute_label();
9352419Sjulian  int classify();
9452419Sjulian  void merge(reference &);
9552419Sjulian  int merge_labels(reference **, int, label_type, string &);
9652419Sjulian  int get_nauthors() const;
9752562Sjulian  void need_author(int);
9852722Sjulian  void set_last_name_unambiguous(int);
9952722Sjulian  void sortify_authors(int, string &) const;
10052419Sjulian  void canonicalize_authors(string &) const;
10152419Sjulian  void sortify_field(unsigned char, int, string &) const;
10268031Sbrian  const char *get_author(int, const char **) const;
10368031Sbrian  const char *get_author_last_name(int, const char **) const;
10468031Sbrian  const char *get_date(const char **) const;
10568031Sbrian  const char *get_year(const char **) const;
10668031Sbrian  const char *get_field(unsigned char, const char **) const;
10768031Sbrian  const label_info *get_label_ptr() const { return label_ptr; }
10868031Sbrian  const char *get_authors(const char **) const;
10952419Sjulian  // for sorting
11052419Sjulian  friend int compare_reference(const reference &r1, const reference &r2);
11152419Sjulian  // for merging
11252419Sjulian  friend int same_reference(const reference &, const reference &);
11352419Sjulian  friend int same_year(const reference &, const reference &);
11452419Sjulian  friend int same_date(const reference &, const reference &);
11569934Sjulian  friend int same_author_last_name(const reference &, const reference &, int);
11652419Sjulian  friend int same_author_name(const reference &, const reference &, int);
11753042Sjulian};
11852419Sjulian
11952419Sjulianconst char *find_year(const char *, const char *, const char **);
12052419Sjulianconst char *find_last_name(const char *, const char *, const char **);
12152419Sjulian
12252419Sjulianconst char *nth_field(int i, const char *start, const char **endp);
12352419Sjulian
12452419Sjulianvoid capitalize(const char *ptr, const char *end, string &result);
12552419Sjulianvoid reverse_name(const char *ptr, const char *end, string &result);
12652419Sjulianvoid uppercase(const char *ptr, const char *end, string &result);
12752562Sjulianvoid lowercase(const char *ptr, const char *end, string &result);
128125028Shartivoid abbreviate_name(const char *ptr, const char *end, string &result);
12968845Sbrian