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