rcs.h revision 128269
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 128269 2004-04-15 01:17:28Z 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
18481407Speter/* What RCS_deltas is supposed to do.  */
18581407Speterenum rcs_delta_op {RCS_ANNOTATE, RCS_FETCH};
18681407Speter
18717721Speter/*
18817721Speter * exported interfaces
18917721Speter */
19017721SpeterRCSNode *RCS_parse PROTO((const char *file, const char *repos));
191128269SpeterRCSNode *RCS_parsercsfile PROTO((const char *rcsfile));
19225839Spetervoid RCS_fully_parse PROTO((RCSNode *));
19334467Spetervoid RCS_reparsercsfile PROTO((RCSNode *, FILE **, struct rcsbuffer *));
19454431Speterextern int RCS_setattic PROTO ((RCSNode *, int));
19532789Speter
19617721Speterchar *RCS_check_kflag PROTO((const char *arg));
197128269Speterchar *RCS_getdate PROTO((RCSNode * rcs, const char *date,
198128269Speter                         int force_tag_match));
199128269Speterchar *RCS_gettag PROTO((RCSNode * rcs, const char *symtag, int force_tag_match,
200128269Speter                        int *simple_tag));
20144856Speterint RCS_exist_rev PROTO((RCSNode *rcs, char *rev));
20244856Speterint RCS_exist_tag PROTO((RCSNode *rcs, char *tag));
20344856Speterchar *RCS_tag2rev PROTO((RCSNode *rcs, char *tag));
204128269Speterchar *RCS_getversion PROTO((RCSNode * rcs, const char *tag, const char *date,
205128269Speter                            int force_tag_match, int *simple_tag));
20617721Speterchar *RCS_magicrev PROTO((RCSNode *rcs, char *rev));
20717721Speterint RCS_isbranch PROTO((RCSNode *rcs, const char *rev));
20817721Speterint RCS_nodeisbranch PROTO((RCSNode *rcs, const char *tag));
20917721Speterchar *RCS_whatbranch PROTO((RCSNode *rcs, const char *tag));
21017721Speterchar *RCS_head PROTO((RCSNode * rcs));
211128269Speterint RCS_datecmp PROTO((const char *date1, const char *date2));
212128269Spetertime_t RCS_getrevtime PROTO((RCSNode * rcs, const char *rev, char *date,
213128269Speter                             int fudge));
21417721SpeterList *RCS_symbols PROTO((RCSNode *rcs));
21517721Spetervoid RCS_check_tag PROTO((const char *tag));
21644856Speterint RCS_valid_rev PROTO ((char *rev));
21732789SpeterList *RCS_getlocks PROTO((RCSNode *rcs));
21817721Spetervoid freercsnode PROTO((RCSNode ** rnodep));
219128269Speterchar *RCS_getbranch PROTO((RCSNode * rcs, const char *tag,
220128269Speter                           int force_tag_match));
22144856Speterchar *RCS_branch_head PROTO ((RCSNode *rcs, char *rev));
22217721Speter
22317721Speterint RCS_isdead PROTO((RCSNode *, const char *));
22417721Speterchar *RCS_getexpand PROTO ((RCSNode *));
225128269Spetervoid RCS_setexpand PROTO ((RCSNode *, const char *));
226128269Speterint RCS_checkout PROTO ((RCSNode *, const char *, const char *, const char *,
227128269Speter                         const char *, const char *, RCSCHECKOUTPROC, void *));
228128269Speterint RCS_checkin PROTO ((RCSNode *rcs, const char *workfile,
229128269Speter                        const char *message, const char *rev, int flags));
230128269Speterint RCS_cmp_file PROTO((RCSNode *, const char *, char **, const char *,
231128269Speter                        const char *, const char *));
23225839Speterint RCS_settag PROTO ((RCSNode *, const char *, const char *));
23332789Speterint RCS_deltag PROTO ((RCSNode *, const char *));
23425839Speterint RCS_setbranch PROTO((RCSNode *, const char *));
235128269Speterint RCS_lock PROTO ((RCSNode *, const char *, int));
23681407Speterint RCS_unlock PROTO ((RCSNode *, char *, int));
23732789Speterint RCS_delete_revs PROTO ((RCSNode *, char *, char *, int));
23832789Spetervoid RCS_addaccess PROTO ((RCSNode *, char *));
23932789Spetervoid RCS_delaccess PROTO ((RCSNode *, char *));
24032789Speterchar *RCS_getaccess PROTO ((RCSNode *));
24166528SpeterRETSIGTYPE rcs_cleanup PROTO ((void));
24232789Spetervoid RCS_rewrite PROTO ((RCSNode *, Deltatext *, char *));
24366528Spetervoid RCS_abandon PROTO ((RCSNode *));
24425839Speterint rcs_change_text PROTO ((const char *, char *, size_t, const char *,
24525839Speter			    size_t, char **, size_t *));
246128269Spetervoid RCS_deltas PROTO ((RCSNode *, FILE *, struct rcsbuffer *, const char *,
24781407Speter			enum rcs_delta_op, char **, size_t *,
24881407Speter			char **, size_t *));
24932789Spetervoid RCS_setincexc PROTO ((const char *arg));
25025865Spetervoid RCS_setlocalid PROTO ((const char *arg));
251128269Speterchar *make_file_label PROTO ((const char *, const char *, RCSNode *));
25226804Speter
25334467Speterextern int preserve_perms;
25434467Speter
25526804Speter/* From import.c.  */
256128269Speterextern int add_rcs_file PROTO ((const char *, const char *, const char *,
257128269Speter                                const char *, const char *, const char *,
258128269Speter                                const char *, int, char **, const char *,
259128269Speter                                size_t, FILE *));
260