SCCS to RCS convertor - (nf)

rich at cfib.UUCP rich at cfib.UUCP
Sun Aug 28 23:39:42 AEST 1983


#N:cfib:10100003:000:7555
cfib!rich    Aug 25 17:10:00 1983

For those of you contemplating switching from SCCS to RCS, this should
make your job somewhat easier.  RCS is a much nicer system, easier to
use, etc., etc.  If you do not have RCS but are interested, it should
be coming on the 4.2BSD tape.  Alternatively, contact:

    Walter F. Tichy
    Purdue University
    West Layfayette, IN 47907

    purdue!tichy

This will create a csh script and C program that converts sccs files
to rcs files, preserving all back versions, their numbers, their access
dates, and comments.  A line in the source file that matches the regular
expression
    /.*static char sid.*/
is replaced with the appropriate rcs string 'static char sid[]="$Header$";'.

If called with the -l flag, an rcs "$Log$" line is placed immediately
before the first line containing a closing C comment metastring in the
first column (i.e., "/^\*\/$/").

Requirements:
    SCCS system (including 'prs' command from System III)
    RCS system (version 3.0 or later)
    touch (need System III version to set dates on files) (OPTIONAL)
    LOTS of time - this runs very slowly.  Suggest you run it in
	background with stdout and stderr routed to a file so you can
	check it later for error messages.

CAUTION:
    No guarantee is granted as to the reliability of the conversion - I
    wrote this for the way we used sccs (formerly) and use rcs (now).
    We converted over 50 sccs files with no problems.

Example:
    If you have two sccs files called 's.foo.c' and 's.mumble.c',

	csh -f sccstorcs.csh s.foo.c s.mumble.c

    will create the files 'foo.c,v' and 'mumble.c,v' with access/modification
    times the same as their corresponding sccs files (so the next 'make' will
    not recompile the world).  It will also leave the original sccs files
    intact - these should be deleted after checking the rcs files.

The last file is a set of 'make' (S.III) rules for rcs.

Send flaming criticisms to /dev/null; constructive suggestions or
improvements to:

	Rich Baughman
	The Consumer Financial Institute
	...!ima!cfib!rich


RUN THE BOURNE SHELL AGAINST THE REST OF THIS FILE TO PRODUCE THE DESIRED
FILES; then compile ftime.c and you are ready to run.
	
***********************************************************************
# The rest of this file is a shell script which will extract:
# sccstorcs.csh ftime.c makefile.rcs
echo x - sccstorcs.csh
cat >sccstorcs.csh <<'!Funky!Stuff!'
# csh program to convert an sccs file to an rcs file with all revisions
# and comments kept intact

cat > awk.tmp <<EOF
\$0 ~ /^D [0-9][0-9]*\.[0-9][0-9]*/ {
    IDS = \$2 " " IDS
    }
END {
    print IDS
    }
EOF

cat > sed1.tmp <<EOF
1h
1d
/static char sid/g
EOF

set ADDLOG = 0
while ($#argv > 0)
    set SFILE = ""
    switch ($argv[1])
    case -l:
	set ADDLOG = 1
	breaksw
    default:
	set SFILE = "$argv[1]"
	breaksw
    endsw
    shift
    if ("$SFILE" == "") continue

    set REVS=`prs $SFILE | awk -f awk.tmp`
    if ($status != 0) then
	echo "?$SFILE not an SCCS file - skipping"
	continue
    endif
    set TIME = `ftime $SFILE`
    echo "$#REVS revisions for $SFILE (TIME=$TIME)"
    foreach REL ($REVS)
	set RFILE=`expr $SFILE : "s\.\(.*\)"`
	prs -r$REL $SFILE -d":C:" > comments.tmp
	prs -r$REL $SFILE \
-d'static char sid[]="$Header: :PN:,v :I: :Dy:/:Dm:/:Dd: :T: :P: Exp $";\n:GB:' \
	    > sccs.tmp
	if (`grep -c "static char sid" sccs.tmp` > 1) then
	    sed -f sed1.tmp sccs.tmp > $RFILE
	else
	    mv sccs.tmp $RFILE
	endif
	if ($ADDLOG == 1 && "$REL" == "$REVS[$#REVS]") then
	    awk '$0 ~ /^\*\// && DONE == 0 {print "$Log$"; DONE = 1}; {print}' \
		$RFILE > sccs.tmp
	    mv sccs.tmp $RFILE
	endif
	ci -f -l -k$REL $RFILE < comments.tmp
    end
    rcs -u $RFILE
    rm -f $RFILE
    touch $TIME $RFILE,v
end

rm -f *.tmp
!Funky!Stuff!
echo x - ftime.c
cat >ftime.c <<'!Funky!Stuff!'
#include  <time.h>
#include  <sys/types.h>
#include  <sys/stat.h>

struct tm  *localtime();

static char  *Wdays[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
static char  *Months[] = {
    "Jan", "Feb", "Mar", "Apr", "May", "Jun",
    "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };

char  *dodate();

main (ac,av)
    int  ac;
    char  *av[];
{
    struct stat  sbuf;
    long  ftime;

    if (stat (*++av, &sbuf) == 0)
	ftime = (long)sbuf.st_mtime;
    else
	ftime = 0L;

    puts (dodate ((*++av == 0 ? "%m%d%H%M%y" : *av), ftime));

}  /* main */

char *dodate (pfmt, ldate)
    register char  *pfmt;	/* ptr to date fmt string - see S.III date(1) */
    long  ldate;		/* date to be formatted (like time() returns) */
{	/* format a date using a System III date(1) format string */
    register struct tm  *ptime;
    register char  c, *padate;
    register int  i;
    static char  adate[80];

    ptime = localtime(&ldate);
    padate = adate;
    while ((c = *pfmt++))
    {
	if (c != '%')
	{
	    *padate++ = c;
	    continue;
	}
	switch (c = *pfmt++)
	{
	  case '%':	/* "%%" - print a percent sign */
	    *padate++ = '%';
	    break;

	  case 'n':	/* "%n" - print a newline */
	    *padate++ = '\n';
	    break;

	  case 't':	/* "%t" - print a tab */
	    *padate++ = '\t';
	    break;

	  case 'm':	/* "%m" - print month of year (01 to 12) */
	    sprintf (padate, "%02d", ptime->tm_mon+1);
	    padate += 2;
	    break;

	  case 'd':	/* "%d" - print day of month (01 to 31) */
	    sprintf (padate, "%02d", ptime->tm_mday);
	    padate += 2;
	    break;

	  case 'y':	/* "%y" - print last 2 digits of year (00 to 99) */
	    sprintf (padate, "%02d", ptime->tm_year);
	    padate += 2;
	    break;

	  case 'D':	/* "%D" - print date as mm/dd/yy */
	    sprintf (padate, "%02d/%02d/%02d",
		ptime->tm_mon+1, ptime->tm_mday, ptime->tm_year);
	    padate += 8;
	    break;

	  case 'H':	/* "%H" - print hour (00 to 23) */
	    sprintf (padate, "%02d", ptime->tm_hour);
	    padate += 2;
	    break;

	  case 'M':	/* "%M" - print minute (00 to 59) */
	    sprintf (padate, "%02d", ptime->tm_min);
	    padate += 2;
	    break;

	  case 'S':	/* "%S" - print second (00 to 59) */
	    sprintf (padate, "%02d", ptime->tm_sec);
	    padate += 2;
	    break;

	  case 'T':	/* "%T" - print time as HH:MM:SS */
	    sprintf (padate, "%02d:%02d:%02d",
		ptime->tm_hour, ptime->tm_min, ptime->tm_sec);
	    padate += 8;
	    break;

	  case 'j':	/* "%j" - print julian date (001 to 366) */
	    sprintf (padate, "%03d", ptime->tm_yday+1);
	    padate += 3;
	    break;

	  case 'w':	/* "%w" - print day of week (0 to 6) (0=Sunday) */
	    sprintf (padate, "%1d", ptime->tm_wday);
	    padate += 1;
	    break;

	  case 'a':	/* "%a" - print abbreviated weekday (Sun to Sat) */
	    sprintf (padate, "%3.3s", Wdays[ptime->tm_wday]);
	    padate += 3;
	    break;

	  case 'h':	/* "%h" - print abbreviated month (Jan to Dec) */
	    sprintf (padate, "%3.3s", Months[ptime->tm_mon]);
	    padate += 3;
	    break;

	  case 'r':	/* "%r" - print time in AM/PM notation */
	    i = ptime->tm_hour;
	    if (i > 12)
		i -= 12;
	    sprintf (padate, "%02d:%02d:%02d %2.2s",
		i, ptime->tm_min, ptime->tm_sec,
		ptime->tm_hour >= 12 ? "PM" : "AM");
	    padate += 11;
	    break;

	  default:
	    *padate++ = '%';
	    *padate++ = c;
	    *padate++ = '?';
	    break;
	}
    }
    *padate = '\0';
    return (&adate[0]);

}  /* dodate */
!Funky!Stuff!
echo x - makefile.rcs
cat >makefile.rcs <<'!Funky!Stuff!'
.SUFFIXES:  .c,v

.c,v.o:
	co -q $*.c
	$(CC) $(CFLAGS) -c $*.c
	rm -f $*.c

.c,v.a:
	co -q $*.c
	$(CC) $(CFLAGS) -c $*.c
	ar rv $@ $*.o
	rm -f $*.c $*.o

.c,v:
	co -q $*.c
	$(CC) $(CFLAGS) $(LFLAGS) $*.c -o $@
	rm -f $*.c
!Funky!Stuff!



More information about the Comp.sources.unix mailing list