rcs.h revision 66528
117721Speter/*
217721Speter * Copyright (c) 1992, Brian Berliner and Jeff Polk
317721Speter * Copyright (c) 1989-1992, Brian Berliner
417721Speter *
517721Speter * You may distribute under the terms of the GNU General Public License as
632789Speter * specified in the README file that comes with the CVS source distribution.
717721Speter *
817721Speter * RCS source control definitions needed by rcs.c and friends
954431Speter *
1054431Speter * $FreeBSD: head/contrib/cvs/src/rcs.h 66528 2000-10-02 06:43:58Z peter $
1117721Speter */
1217721Speter
1366528Speter/* Strings which indicate a conflict if they occur at the start of a line.  */
1466528Speter#define	RCS_MERGE_PAT_1 "<<<<<<< "
1566528Speter#define	RCS_MERGE_PAT_2 "=======\n"
1666528Speter#define	RCS_MERGE_PAT_3 ">>>>>>> "
1725839Speter
1817721Speter#define	RCSEXT		",v"
1917721Speter#define RCSPAT		"*,v"
2017721Speter#define	RCSHEAD		"head"
2117721Speter#define	RCSBRANCH	"branch"
2217721Speter#define	RCSSYMBOLS	"symbols"
2317721Speter#define	RCSDATE		"date"
2417721Speter#define	RCSDESC		"desc"
2517721Speter#define RCSEXPAND	"expand"
2617721Speter
2717721Speter/* Used by the version of death support which resulted from old
2817721Speter   versions of CVS (e.g. 1.5 if you define DEATH_SUPPORT and not
2917721Speter   DEATH_STATE).  Only a hacked up RCS (used by those old versions of
3017721Speter   CVS) will put this into RCS files.  Considered obsolete.  */
3117721Speter#define RCSDEAD		"dead"
3217721Speter
3317721Speter#define	DATEFORM	"%02d.%02d.%02d.%02d.%02d.%02d"
3417721Speter#define	SDATEFORM	"%d.%d.%d.%d.%d.%d"
3517721Speter
3617721Speter/*
3717721Speter * Opaque structure definitions used by RCS specific lookup routines
3817721Speter */
3917721Speter#define VALID	0x1			/* flags field contains valid data */
4017721Speter#define	INATTIC	0x2			/* RCS file is located in the Attic */
4117721Speter#define PARTIAL 0x4			/* RCS file not completly parsed */
4217721Speter
4332789Speter/* All the "char *" fields in RCSNode, Deltatext, and RCSVers are
4432789Speter   '\0'-terminated (except "text" in Deltatext).  This means that we
4532789Speter   can't deal with fields containing '\0', which is a limitation that
4632789Speter   RCS does not have.  Would be nice to fix this some day.  */
4732789Speter
4817721Speterstruct rcsnode
4917721Speter{
5032789Speter    /* Reference count for this structure.  Used to deal with the
5132789Speter       fact that there might be a pointer from the Vers_TS or might
5232789Speter       not.  Callers who increment this field are responsible for
5332789Speter       calling freercsnode when they are done with their reference.  */
5417721Speter    int refcount;
5532789Speter
5632789Speter    /* Flags (INATTIC, PARTIAL, &c), see above.  */
5717721Speter    int flags;
5825839Speter
5925839Speter    /* File name of the RCS file.  This is not necessarily the name
6025839Speter       as specified by the user, but it is a name which can be passed to
6125839Speter       system calls and a name which is OK to print in error messages
6225839Speter       (the various names might differ in case).  */
6317721Speter    char *path;
6425839Speter
6532789Speter    /* Value for head keyword from RCS header, or NULL if empty.  */
6617721Speter    char *head;
6732789Speter
6832789Speter    /* Value for branch keyword from RCS header, or NULL if omitted.  */
6917721Speter    char *branch;
7032789Speter
7132789Speter    /* Raw data on symbolic revisions.  The first time that RCS_symbols is
7232789Speter       called, we parse these into ->symbols, and free ->symbols_data.  */
7317721Speter    char *symbols_data;
7432789Speter
7532789Speter    /* Value for expand keyword from RCS header, or NULL if omitted.  */
7617721Speter    char *expand;
7732789Speter
7832789Speter    /* List of nodes, the key of which is the symbolic name and the data
7932789Speter       of which is the numeric revision that it corresponds to (malloc'd).  */
8017721Speter    List *symbols;
8132789Speter
8232789Speter    /* List of nodes (type RCSVERS), the key of which the numeric revision
8332789Speter       number, and the data of which is an RCSVers * for the revision.  */
8417721Speter    List *versions;
8532789Speter
8632789Speter    /* Value for access keyword from RCS header, or NULL if empty.
8732789Speter       FIXME: RCS_delaccess would also seem to use "" for empty.  We
8832789Speter       should pick one or the other.  */
8932789Speter    char *access;
9032789Speter
9132789Speter    /* Raw data on locked revisions.  The first time that RCS_getlocks is
9232789Speter       called, we parse these into ->locks, and free ->locks_data.  */
9332789Speter    char *locks_data;
9432789Speter
9532789Speter    /* List of nodes, the key of which is the numeric revision and the
9632789Speter       data of which is the user that it corresponds to (malloc'd).  */
9732789Speter    List *locks;
9832789Speter
9932789Speter    /* Set for the strict keyword from the RCS header.  */
10032789Speter    int strict_locks;
10132789Speter
10232789Speter    /* Value for the comment keyword from RCS header (comment leader), or
10332789Speter       NULL if omitted.  */
10432789Speter    char *comment;
10532789Speter
10632789Speter    /* Value for the desc field in the RCS file, or NULL if empty.  */
10732789Speter    char *desc;
10832789Speter
10932789Speter    /* File offset of the first deltatext node, so we can seek there.  */
11025839Speter    long delta_pos;
11132789Speter
11232789Speter    /* Newphrases from the RCS header.  List of nodes, the key of which
11332789Speter       is the "id" which introduces the newphrase, and the value of which
11432789Speter       is the value from the newphrase.  */
11525839Speter    List *other;
11617721Speter};
11717721Speter
11817721Spetertypedef struct rcsnode RCSNode;
11917721Speter
12032789Speterstruct deltatext {
12132789Speter    char *version;
12232789Speter
12332789Speter    /* Log message, or NULL if we do not intend to change the log message
12432789Speter       (that is, RCS_copydeltas should just use the log message from the
12532789Speter       file).  */
12632789Speter    char *log;
12732789Speter
12832789Speter    /* Change text, or NULL if we do not intend to change the change text
12932789Speter       (that is, RCS_copydeltas should just use the change text from the
13032789Speter       file).  Note that it is perfectly legal to have log be NULL and
13132789Speter       text non-NULL, or vice-versa.  */
13232789Speter    char *text;
13332789Speter    size_t len;
13432789Speter
13532789Speter    /* Newphrase fields from deltatext nodes.  FIXME: duplicates the
13632789Speter       other field in the rcsversnode, I think.  */
13732789Speter    List *other;
13832789Speter};
13932789Spetertypedef struct deltatext Deltatext;
14032789Speter
14117721Speterstruct rcsversnode
14217721Speter{
14332789Speter    /* Duplicate of the key by which this structure is indexed.  */
14417721Speter    char *version;
14532789Speter
14617721Speter    char *date;
14717721Speter    char *author;
14825839Speter    char *state;
14917721Speter    char *next;
15017721Speter    int dead;
15132789Speter    int outdated;
15232789Speter    Deltatext *text;
15317721Speter    List *branches;
15432789Speter    /* Newphrase fields from deltatext nodes.  Also contains ";add" and
15532789Speter       ";delete" magic fields (see rcs.c, log.c).  I think this is
15632789Speter       only used by log.c (where it looks up "log").  Duplicates the
15732789Speter       other field in struct deltatext, I think.  */
15825839Speter    List *other;
15932789Speter    /* Newphrase fields from delta nodes.  */
16032789Speter    List *other_delta;
16144856Speter#ifdef PRESERVE_PERMISSIONS_SUPPORT
16244856Speter    /* Hard link information for each revision. */
16344856Speter    List *hardlinks;
16444856Speter#endif
16517721Speter};
16617721Spetertypedef struct rcsversnode RCSVers;
16717721Speter
16817721Speter/*
16917721Speter * CVS reserves all even-numbered branches for its own use.  "magic" branches
17017721Speter * (see rcs.c) are contained as virtual revision numbers (within symbolic
17117721Speter * tags only) off the RCS_MAGIC_BRANCH, which is 0.  CVS also reserves the
17217721Speter * ".1" branch for vendor revisions.  So, if you do your own branching, you
17317721Speter * should limit your use to odd branch numbers starting at 3.
17417721Speter */
17517721Speter#define	RCS_MAGIC_BRANCH	0
17617721Speter
17725839Speter/* The type of a function passed to RCS_checkout.  */
17825839Spetertypedef void (*RCSCHECKOUTPROC) PROTO ((void *, const char *, size_t));
17925839Speter
18034467Speter#ifdef __STDC__
18134467Speterstruct rcsbuffer;
18234467Speter#endif
18334467Speter
18417721Speter/*
18517721Speter * exported interfaces
18617721Speter */
18717721SpeterRCSNode *RCS_parse PROTO((const char *file, const char *repos));
18817721SpeterRCSNode *RCS_parsercsfile PROTO((char *rcsfile));
18925839Spetervoid RCS_fully_parse PROTO((RCSNode *));
19034467Spetervoid RCS_reparsercsfile PROTO((RCSNode *, FILE **, struct rcsbuffer *));
19154431Speterextern int RCS_setattic PROTO ((RCSNode *, int));
19232789Speter
19317721Speterchar *RCS_check_kflag PROTO((const char *arg));
19417721Speterchar *RCS_getdate PROTO((RCSNode * rcs, char *date, int force_tag_match));
19517721Speterchar *RCS_gettag PROTO((RCSNode * rcs, char *symtag, int force_tag_match,
19625839Speter			int *simple_tag));
19744856Speterint RCS_exist_rev PROTO((RCSNode *rcs, char *rev));
19844856Speterint RCS_exist_tag PROTO((RCSNode *rcs, char *tag));
19944856Speterchar *RCS_tag2rev PROTO((RCSNode *rcs, char *tag));
20017721Speterchar *RCS_getversion PROTO((RCSNode * rcs, char *tag, char *date,
20125839Speter		      int force_tag_match, int *simple_tag));
20217721Speterchar *RCS_magicrev PROTO((RCSNode *rcs, char *rev));
20317721Speterint RCS_isbranch PROTO((RCSNode *rcs, const char *rev));
20417721Speterint RCS_nodeisbranch PROTO((RCSNode *rcs, const char *tag));
20517721Speterchar *RCS_whatbranch PROTO((RCSNode *rcs, const char *tag));
20617721Speterchar *RCS_head PROTO((RCSNode * rcs));
20717721Speterint RCS_datecmp PROTO((char *date1, char *date2));
20817721Spetertime_t RCS_getrevtime PROTO((RCSNode * rcs, char *rev, char *date, int fudge));
20917721SpeterList *RCS_symbols PROTO((RCSNode *rcs));
21017721Spetervoid RCS_check_tag PROTO((const char *tag));
21144856Speterint RCS_valid_rev PROTO ((char *rev));
21232789SpeterList *RCS_getlocks PROTO((RCSNode *rcs));
21317721Spetervoid freercsnode PROTO((RCSNode ** rnodep));
21417721Speterchar *RCS_getbranch PROTO((RCSNode * rcs, char *tag, int force_tag_match));
21544856Speterchar *RCS_branch_head PROTO ((RCSNode *rcs, char *rev));
21617721Speter
21717721Speterint RCS_isdead PROTO((RCSNode *, const char *));
21817721Speterchar *RCS_getexpand PROTO ((RCSNode *));
21954431Spetervoid RCS_setexpand PROTO ((RCSNode *, char *));
22025839Speterint RCS_checkout PROTO ((RCSNode *, char *, char *, char *, char *, char *,
22125839Speter			 RCSCHECKOUTPROC, void *));
22232789Speterint RCS_checkin PROTO ((RCSNode *rcs, char *workfile, char *message,
22332789Speter			char *rev, int flags));
22425839Speterint RCS_cmp_file PROTO ((RCSNode *, char *, char *, const char *));
22525839Speterint RCS_settag PROTO ((RCSNode *, const char *, const char *));
22632789Speterint RCS_deltag PROTO ((RCSNode *, const char *));
22725839Speterint RCS_setbranch PROTO((RCSNode *, const char *));
22825839Speterint RCS_lock PROTO ((RCSNode *, const char *, int));
22925839Speterint RCS_unlock PROTO ((RCSNode *, const char *, int));
23032789Speterint RCS_delete_revs PROTO ((RCSNode *, char *, char *, int));
23132789Spetervoid RCS_addaccess PROTO ((RCSNode *, char *));
23232789Spetervoid RCS_delaccess PROTO ((RCSNode *, char *));
23332789Speterchar *RCS_getaccess PROTO ((RCSNode *));
23466528SpeterRETSIGTYPE rcs_cleanup PROTO ((void));
23532789Spetervoid RCS_rewrite PROTO ((RCSNode *, Deltatext *, char *));
23666528Spetervoid RCS_abandon PROTO ((RCSNode *));
23725839Speterint rcs_change_text PROTO ((const char *, char *, size_t, const char *,
23825839Speter			    size_t, char **, size_t *));
23932789Spetervoid RCS_setincexc PROTO ((const char *arg));
24025865Speter
24125865Spetervoid RCS_setlocalid PROTO ((const char *arg));
24232789Speterchar *make_file_label PROTO ((char *, char *, RCSNode *));
24326804Speter
24434467Speterextern int preserve_perms;
24534467Speter
24626804Speter/* From import.c.  */
24732789Speterextern int add_rcs_file PROTO ((char *, char *, char *, char *, char *,
24832789Speter				char *, char *, int, char **,
24932789Speter				char *, size_t, FILE *));
250