which included commits to RCS files with non-trunk default branches. git-svn-id: svn://10.65.10.50/trunk@5403 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			305 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			305 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/*---------------------------------------------------------------------------
 | 
						|
 | 
						|
  tops20.c
 | 
						|
 | 
						|
  TOPS20-specific routines for use with Info-ZIP's UnZip 5.1 and later.
 | 
						|
 | 
						|
  Contains:  mapattr()
 | 
						|
             close_outfile()
 | 
						|
             version()
 | 
						|
             upper()
 | 
						|
             enquote()
 | 
						|
             dequote()
 | 
						|
             fnlegal()
 | 
						|
 | 
						|
  (not yet ported:  do_wild(), mapname(), checkdir(), ...)
 | 
						|
 | 
						|
  ---------------------------------------------------------------------------*/
 | 
						|
 | 
						|
 | 
						|
#define UNZIP_INTERNAL
 | 
						|
#include "unzip.h"
 | 
						|
 | 
						|
 | 
						|
/**********************/
 | 
						|
/* Function mapattr() */
 | 
						|
/**********************/
 | 
						|
 | 
						|
int mapattr(__G)        /* just like Unix except no umask() */
 | 
						|
    __GDEF
 | 
						|
{
 | 
						|
    ulg  tmp = G.crec.external_file_attributes;
 | 
						|
 | 
						|
    switch (G.pInfo->hostnum) {
 | 
						|
        case UNIX_:
 | 
						|
        case VMS_:
 | 
						|
            G.pInfo->file_attr = (unsigned)(tmp >> 16);
 | 
						|
            break;
 | 
						|
        case AMIGA_:
 | 
						|
            tmp = (unsigned)(tmp>>1 & 7);   /* Amiga RWE bits */
 | 
						|
            G.pInfo->file_attr = (unsigned)(tmp<<6 | tmp<<3 | tmp);
 | 
						|
            break;
 | 
						|
        case FS_FAT_:   /* MSDOS half of attributes should always be correct */
 | 
						|
        case FS_HPFS_:
 | 
						|
        case FS_NTFS_:
 | 
						|
        case MAC_:
 | 
						|
        case ATARI_:
 | 
						|
        case TOPS20_:
 | 
						|
        default:
 | 
						|
            tmp = !(tmp & 1) << 1;   /* read-only bit --> write perms bits */
 | 
						|
            G.pInfo->file_attr = (unsigned)(0444 | tmp<<6 | tmp<<3 | tmp);
 | 
						|
            break;
 | 
						|
#if 0
 | 
						|
        case ATARI_:
 | 
						|
        case TOPS20_:
 | 
						|
        default:
 | 
						|
            G.pInfo->file_attr = 0666;
 | 
						|
            break;
 | 
						|
#endif
 | 
						|
    } /* end switch (host-OS-created-by) */
 | 
						|
 | 
						|
    return 0;
 | 
						|
 | 
						|
} /* end function mapattr() */
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/****************************/
 | 
						|
/* Function close_outfile() */
 | 
						|
/****************************/
 | 
						|
 | 
						|
void close_outfile(__G)
 | 
						|
    __GDEF
 | 
						|
{
 | 
						|
#   define JSYS_CLASS           0070000000000
 | 
						|
#   define FLD(val,mask)        (((unsigned)(val)*((mask)&(-(mask))))&(mask))
 | 
						|
#   define _DEFJS(name,class)   (FLD(class,JSYS_CLASS) | (monsym(name)&0777777))
 | 
						|
#   define IDTIM                _DEFJS("IDTIM%", 1)
 | 
						|
#   define SFTAD                _DEFJS("SFTAD%", 0)
 | 
						|
#   define YRBASE               1900
 | 
						|
    int ablock[5], tblock[2];
 | 
						|
    int yr, mo, dy, hh, mm, ss;
 | 
						|
    char temp[100];
 | 
						|
    unsigned tad;
 | 
						|
#ifdef USE_EF_UT_TIME
 | 
						|
    iztimes z_utime;
 | 
						|
 | 
						|
 | 
						|
    if (G.extra_field &&
 | 
						|
        (ef_scan_for_izux(G.extra_field, G.lrec.extra_field_length, 0,
 | 
						|
                          &z_utime, NULL) & EB_UT_FL_MTIME))
 | 
						|
    {
 | 
						|
        struct tm *t = localtime(&(z_utime.mtime));
 | 
						|
 | 
						|
        yr = t->tm_year + 1900;
 | 
						|
        mo = t->tm_mon;
 | 
						|
        dy = t->tm_mday;
 | 
						|
        hh = t->tm_hour;
 | 
						|
        mm = t->tm_min;
 | 
						|
        ss = t->tm_sec;
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
        /* dissect the date */
 | 
						|
        yr = ((G.lrec.last_mod_file_date >> 9) & 0x7f) + 1980;
 | 
						|
        mo = ((G.lrec.last_mod_file_date >> 5) & 0x0f) - 1;
 | 
						|
        dy = (G.lrec.last_mod_file_date & 0x1f);
 | 
						|
 | 
						|
        /* dissect the time */
 | 
						|
        hh = (G.lrec.last_mod_file_time >> 11) & 0x1f;
 | 
						|
        mm = (G.lrec.last_mod_file_time >> 5) & 0x3f;
 | 
						|
        ss = (G.lrec.last_mod_file_time & 0x1f) * 2;
 | 
						|
    }
 | 
						|
#else /* !USE_EF_UT_TIME */
 | 
						|
 | 
						|
    /* dissect the date */
 | 
						|
    yr = ((G.lrec.last_mod_file_date >> 9) & 0x7f) + (1980 - YRBASE);
 | 
						|
    mo = (G.lrec.last_mod_file_date >> 5) & 0x0f;
 | 
						|
    dy = G.lrec.last_mod_file_date & 0x1f;
 | 
						|
 | 
						|
    /* dissect the time */
 | 
						|
    hh = (G.lrec.last_mod_file_time >> 11) & 0x1f;
 | 
						|
    mm = (G.lrec.last_mod_file_time >> 5) & 0x3f;
 | 
						|
    ss = (G.lrec.last_mod_file_time & 0x1f) * 2;
 | 
						|
#endif /* ?USE_EF_UT_TIME */
 | 
						|
 | 
						|
    sprintf(temp, "%02d/%02d/%02d %02d:%02d:%02d", mo, dy, yr, hh, mm, ss);
 | 
						|
 | 
						|
    ablock[1] = (int)(temp - 1);
 | 
						|
    ablock[2] = 0;
 | 
						|
    if (!jsys(IDTIM, ablock)) {
 | 
						|
        Info(slide, 1, ((char *)slide, "error:  IDTIM failure for %s\n",
 | 
						|
          G.filename));
 | 
						|
        fclose(G.outfile);
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    tad = ablock[2];
 | 
						|
    tblock[0] = tad;
 | 
						|
    tblock[1] = tad;
 | 
						|
    tblock[2] = -1;
 | 
						|
 | 
						|
    ablock[1] = fcntl(fileno(G.outfile), F_GETSYSFD, 0);
 | 
						|
                                                /* _uffd[outfd]->uf_ch */
 | 
						|
    ablock[2] = (int) tblock;
 | 
						|
    ablock[3] = 3;
 | 
						|
    if (!jsys(SFTAD, ablock))
 | 
						|
        Info(slide, 1,((char *)slide, "error:  can't set the time for %s\n",
 | 
						|
          G.filename));
 | 
						|
 | 
						|
    fclose(G.outfile);
 | 
						|
 | 
						|
} /* end function close_outfile() */
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
#ifndef SFX
 | 
						|
 | 
						|
/************************/
 | 
						|
/*  Function version()  */
 | 
						|
/************************/
 | 
						|
 | 
						|
void version(__G)
 | 
						|
    __GDEF
 | 
						|
{
 | 
						|
#if 0
 | 
						|
    char buf[40];
 | 
						|
#endif
 | 
						|
 | 
						|
    sprintf((char *)slide, LoadFarString(CompiledWith),
 | 
						|
 | 
						|
#ifdef __GNUC__
 | 
						|
      "gcc ", __VERSION__,
 | 
						|
#else
 | 
						|
#  if 0
 | 
						|
      "cc ", (sprintf(buf, " version %d", _RELEASE), buf),
 | 
						|
#  else
 | 
						|
#  ifdef __COMPILER_KCC__
 | 
						|
      "KCC", "",
 | 
						|
#  else
 | 
						|
      "unknown compiler", "",
 | 
						|
#  endif
 | 
						|
#  endif
 | 
						|
#endif
 | 
						|
 | 
						|
      "TOPS-20",
 | 
						|
 | 
						|
#if defined(foobar) || defined(FOOBAR)
 | 
						|
      " (Foo BAR)",   /* OS version or hardware */
 | 
						|
#else
 | 
						|
      "",
 | 
						|
#endif /* Foo BAR */
 | 
						|
 | 
						|
#ifdef __DATE__
 | 
						|
      " on ", __DATE__
 | 
						|
#else
 | 
						|
      "", ""
 | 
						|
#endif
 | 
						|
    );
 | 
						|
 | 
						|
    (*G.message)((zvoid *)&G, slide, (ulg)strlen((char *)slide), 0);
 | 
						|
 | 
						|
} /* end function version() */
 | 
						|
 | 
						|
#endif /* !SFX */
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/**********************/
 | 
						|
/*  Function upper()  */
 | 
						|
/**********************/
 | 
						|
 | 
						|
int upper(s)        /* returns s in uppercase */
 | 
						|
    char *s;        /* string to be uppercased */
 | 
						|
{
 | 
						|
    for (;  *s;  ++s)
 | 
						|
        *s = toupper(*s);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/************************/
 | 
						|
/*  Function enquote()  */
 | 
						|
/************************/
 | 
						|
 | 
						|
int enquote(s)      /* calls dequote(s) to normalize string, then */
 | 
						|
    char *s;        /*  inserts ^Vs before otherwise illegal characters */
 | 
						|
{                   /*  in s, assuming that s is a TOPS-20 filename */
 | 
						|
    char d[100];
 | 
						|
    char *p, *q;
 | 
						|
    char c;
 | 
						|
 | 
						|
    if (s && *s) {
 | 
						|
        dequote(s);
 | 
						|
        p = s - 1;
 | 
						|
        q = d - 1;
 | 
						|
        while (c = *++p) {
 | 
						|
            if (!fnlegal(c))
 | 
						|
                *++q = '\026';
 | 
						|
            *++q = c;
 | 
						|
        }
 | 
						|
        *++q = '\0';
 | 
						|
        strcpy(s, d);
 | 
						|
    }
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/************************/
 | 
						|
/*  Function dequote()  */
 | 
						|
/************************/
 | 
						|
 | 
						|
int dequote(s)        /* returns s without ^Vs */
 | 
						|
    char *s;          /* string to be dequoted */
 | 
						|
{
 | 
						|
    char d[100];
 | 
						|
    char *p, *q;
 | 
						|
    int c;
 | 
						|
 | 
						|
    if (s && *s) {
 | 
						|
        p = s - 1;
 | 
						|
        q = d - 1;
 | 
						|
        while (c = *++p)
 | 
						|
            if (c != '\026')
 | 
						|
                *++q = c;
 | 
						|
        *++q = '\0';
 | 
						|
        strcpy(s, d);
 | 
						|
    }
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/************************/
 | 
						|
/*  Function fnlegal()  */
 | 
						|
/************************/
 | 
						|
 | 
						|
int fnlegal(c)         /* returns TRUE if c is a member of the */
 | 
						|
    char c;            /*  legal character set for filenames */
 | 
						|
{
 | 
						|
    char *q;
 | 
						|
    static char *legals = {"$%**-<>>AZ[[]]__az"};
 | 
						|
 | 
						|
    q = legals;
 | 
						|
    while (*q)
 | 
						|
        if (c < *q++)
 | 
						|
            break;
 | 
						|
        else if (c <= *q++)
 | 
						|
            return TRUE;
 | 
						|
 | 
						|
    return FALSE;
 | 
						|
}
 |