fl@tools.uucp (Frank Lancaster) (01/23/91)
Here are my file name and time conversion routines.
Frank Lancaster
/*****************************************************************************/
/* */
/* File name conversion routines */
/* */
/*****************************************************************************/
#define UNIX_DIRSEP '/'
#define FS_DIRSEP '.'
#define REPLACE_CHR '_'
#define MAXLEAFLEN 10
#define MAXPATHLEN 256
int sflag; /* see tar documentation */
int zflag;
int Eflag;
int Sflag;
static char Buffer[MAXPATHLEN];
int name_to_unix(char *Name) {
char *LastSep, *cp, *Ext;
LastSep = NULL;
Ext = Name;
cp = Name;
while (*cp) {
if (*cp == FS_DIRSEP) {
if (LastSep != NULL)
Ext = LastSep + 1;
LastSep = cp;
*cp = UNIX_DIRSEP;
} else if (*cp == UNIX_DIRSEP)
*cp = REPLACE_CHR;
else if (*cp == '!')
*cp = '.';
cp++;
}
if (LastSep != NULL) {
*LastSep = '\0';
if (strlen(Ext) > MaxExtLength)
*LastSep = UNIX_DIRSEP;
else {
if (*(LastSep + 1) == '\0')
return 0;
strcpy(Buffer,Ext);
*Ext = 0;
strcpy(Ext,LastSep + 1);
strcat(Name,".");
strcat(Name,Buffer);
}
}
return 1;
} /* name_to_unix */
static int chktruncate(char *leaf, char *rest) {
int len,n;
char *cp,*cp2;
n = 0;
if ((len = strlen(leaf)) > MAXLEAFLEN) {
fprintf(stderr,"tar: shorten: %s -> ",leaf);
cp = leaf;
while (*cp && len > MAXLEAFLEN) {
switch (*cp) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
case '-':
if (cp != leaf) {
n += 1;
len -= 1;
cp2 = cp+1;
while (*cp2) {
*(cp2-1) = *cp2;
cp2++;
}
*(cp2-1) = 0;
break;
}
default:
cp++;
break;
}
}
if ((len = strlen(leaf)) > MAXLEAFLEN) {
n += len-MAXLEAFLEN;
*(leaf+MAXLEAFLEN) = 0;
}
if (n > 0 && rest != NULL) {
cp++;
cp2 = rest;
while (*cp2)
*cp++ = *cp2++;
}
fprintf(stderr,"%s\n",leaf);
}
return(n);
} /* truncate */
void name_to_fs(char *name) {
char *cp, *leaf, *ext;
int extlen;
Buffer[0] = '\0';
leaf = name;
ext = NULL;
for (cp = name; *cp; cp++) {
if (*cp == UNIX_DIRSEP) {
*cp = 0;
cp -= chktruncate(leaf,cp + 1);
if ((sflag || Sflag) && Buffer[0] != '\0') {
if (Sflag) {
}
Buffer[0] = '\0';
}
*cp = FS_DIRSEP;
leaf = cp + 1;
} else if (*cp == FS_DIRSEP) {
if (sflag || Sflag) {
*cp = '\0';
if (Zflag && *(cp + 1) && strcmp(cp + 1, "Z") == 0) {
if (Buffer[0] == '\0')
strcpy(Buffer,leaf);
strcat(Buffer,CompressExt);
cp++;
} else {
strcpy(Buffer,leaf);
if (Eflag)
*cp = REPLACE_CHR;
else
*cp = FS_DIRSEP;
ext = cp + 1;
}
} else if (Eflag)
*cp = REPLACE_CHR;
else {
*cp = 0;
cp -= chktruncate(leaf,cp+1);
*cp = FS_DIRSEP;
leaf =cp + 1;
}
} else if (Eflag && *cp == REPLACE_CHR) {
*cp = 0;
strcpy(Buffer,name);
strcat(Buffer,cp+1);
strcpy(name,Buffer);
cp--;
}
}
if ((sflag || Sflag) && Buffer[0] != '\0') {
if (ext != NULL) {
extlen = strlen(ext);
strcpy(leaf,ext);
leaf += extlen;
*leaf++ = '.';
}
strcpy(leaf,Buffer);
Buffer[0] = '\0';
}
chktruncate(leaf,(char *)NULL);
} /* name_to_fs */
/*****************************************************************************/
/* */
/* Time conversion routines */
/* */
/*****************************************************************************/
#include <limits.h>
/* 5 byte time value for 1970 in centi-seconds: */
static unsigned char TimeShift[5] = { 96, 106, 153, 110, 51 };
void unix_to_fs_time(unsigned char *fstime, unsigned long unixtime) {
int Cnt;
signed long Carry,tmp;
fstime[4] = 0;
fstime[3] = (unsigned char)(unixtime >> 24);
fstime[2] = (unsigned char)(unixtime >> 16) & 255;
fstime[1] = (unsigned char)(unixtime >> 8) & 255;
fstime[0] = (unsigned char)(unixtime & 255);
Carry = 0;
Cnt = 0;
while (Cnt <= 4) {
tmp = fstime[Cnt] * 100 + Carry;
Carry = 0;
while (tmp >= 256) {
Carry++;
tmp -= 256;
}
fstime[Cnt] = (unsigned char)tmp;
Cnt++;
}
Carry = 0;
Cnt = 0;
while (Cnt <= 4) {
tmp = fstime[Cnt] + TimeShift[Cnt] + Carry;
Carry = 0;
if (tmp >= 256) {
Carry = 1;
tmp -= 256;
}
fstime[Cnt] = (unsigned char)tmp;
Cnt++;
}
} /* unix_to_fs_time */
unsigned long fs_to_unix_time(unsigned char *FStime) {
signed int Cnt;
signed long tmp,Carry,divident;
unsigned char fstime[5];
Cnt = 0;
Carry = 0;
while (Cnt <= 4) {
tmp = FStime[Cnt] - TimeShift[Cnt] - Carry;
Carry = 0;
if (tmp < 0) {
tmp += 256;
Carry = 1;
}
fstime[Cnt] = (unsigned char)tmp;
Cnt++;
}
if (Carry > 0) {
fprintf(stderr,"tar: warning: UNIX time underflow\n");
return 0;
}
Cnt = 4;
Carry = 0;
while (Cnt >= 0) {
divident = (Carry * 256 + fstime[Cnt]);
tmp = divident / 100;
Carry = divident - tmp * 100;
fstime[Cnt] = (unsigned char)tmp;
Cnt--;
}
if (Carry * 256 / 100 >= 128)
fstime[0]++;
if (fstime[4] > 0) {
fprintf(stderr,"tar: warning: UNIX time overflow");
return ULONG_MAX;
} else
return fstime[0] +
fstime[1] * 256 +
fstime[2] * 256 * 256 +
fstime[3] * 256 * 256 * 256;
} /* fs_to_unix_time */OSmith@acorn.co.uk (Owen Smith) (01/24/91)
In article <1399@karl.UUCP> fl@tools.uucp (Frank Lancaster) writes: >Here are my file name and time conversion routines. How about some comments? A readable layout style would be helpful too. You don't have to copy the Unix hackers' dreadful coding style you know :-) The views expressed are my own and are not necessarily those of Acorn.
gtoal@tharr.UUCP (Graham Toal) (01/27/91)
In article <4767@acorn.co.uk> OSmith@acorn.co.uk (Owen Smith) writes: >In article <1399@karl.UUCP> fl@tools.uucp (Frank Lancaster) writes: > >>Here are my file name and time conversion routines. > >How about some comments? A readable layout style would be helpful too. >You don't have to copy the Unix hackers' dreadful coding style you know :-) >The views expressed are my own and are not necessarily those of Acorn. Come on, Owen, give the guy a break. Real Programmers (tm) don't need comments anyway. The code was perfectly readable to me, and I'd like to thank Frank for posting the source in a readable format. It's the first posting I've been able to download from this group in months. G PS Anyone for 'indent'? I think I have it kicking around somewhere... -- (* Posted from tharr.uucp - Public Access Unix - +44 (234) 261804 *)
fl@tools.uucp (Frank Lancaster) (01/28/91)
Owen Smith writes: >How about some comments? A readable layout style would be helpful too. Well, maybe if I were employed by Acorn, I would have enough time to comment PD sources. I find my layout style more readable than the normal C hack style. These opions are mine, and only mine. Frank Lancaster