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