tops20.c
上传用户:andy_li
上传日期:2007-01-06
资源大小:1019k
文件大小:7k
源码类别:

压缩解压

开发平台:

MultiPlatform

  1. /*---------------------------------------------------------------------------
  2.   tops20.c
  3.   TOPS20-specific routines for use with Info-ZIP's UnZip 5.1 and later.
  4.   Contains:  mapattr()
  5.              close_outfile()
  6.              version()
  7.              upper()
  8.              enquote()
  9.              dequote()
  10.              fnlegal()
  11.   (not yet ported:  do_wild(), mapname(), checkdir(), ...)
  12.   ---------------------------------------------------------------------------*/
  13. #define UNZIP_INTERNAL
  14. #include "unzip.h"
  15. /**********************/
  16. /* Function mapattr() */
  17. /**********************/
  18. int mapattr(__G)        /* just like Unix except no umask() */
  19.     __GDEF
  20. {
  21.     ulg  tmp = G.crec.external_file_attributes;
  22.     switch (G.pInfo->hostnum) {
  23.         case UNIX_:
  24.         case VMS_:
  25.         case ACORN_:
  26.         case ATARI_:
  27.         case BEOS_:
  28.         case QDOS_:
  29.             G.pInfo->file_attr = (unsigned)(tmp >> 16);
  30.             break;
  31.         case AMIGA_:
  32.             tmp = (unsigned)(tmp>>1 & 7);   /* Amiga RWE bits */
  33.             G.pInfo->file_attr = (unsigned)(tmp<<6 | tmp<<3 | tmp);
  34.             break;
  35.         case FS_FAT_:   /* MSDOS half of attributes should always be correct */
  36.         case FS_HPFS_:
  37.         case FS_NTFS_:
  38.         case MAC_:
  39.         case TOPS20_:
  40.         default:
  41.             tmp = !(tmp & 1) << 1;   /* read-only bit --> write perms bits */
  42.             G.pInfo->file_attr = (unsigned)(0444 | tmp<<6 | tmp<<3 | tmp);
  43.             break;
  44. #if 0
  45.         case ATARI_:
  46.         case TOPS20_:
  47.         default:
  48.             G.pInfo->file_attr = 0666;
  49.             break;
  50. #endif
  51.     } /* end switch (host-OS-created-by) */
  52.     return 0;
  53. } /* end function mapattr() */
  54. /****************************/
  55. /* Function close_outfile() */
  56. /****************************/
  57. void close_outfile(__G)
  58.     __GDEF
  59. {
  60. #   define JSYS_CLASS           0070000000000
  61. #   define FLD(val,mask)        (((unsigned)(val)*((mask)&(-(mask))))&(mask))
  62. #   define _DEFJS(name,class)   (FLD(class,JSYS_CLASS) | (monsym(name)&0777777))
  63. #   define IDTIM                _DEFJS("IDTIM%", 1)
  64. #   define SFTAD                _DEFJS("SFTAD%", 0)
  65. #   define YRBASE               1900
  66.     int ablock[5], tblock[2];
  67.     int yr, mo, dy, hh, mm, ss;
  68.     char temp[100];
  69.     unsigned tad;
  70. #ifdef USE_EF_UT_TIME
  71.     iztimes z_utime;
  72.     struct tm *t;
  73.     if (G.extra_field &&
  74. #ifdef IZ_CHECK_TZ
  75.         G.tz_is_valid &&
  76. #endif
  77.         (ef_scan_for_izux(G.extra_field, G.lrec.extra_field_length, 0,
  78.                           G.lrec.last_mod_dos_date, &z_utime, NULL)
  79.          & EB_UT_FL_MTIME))
  80.         t = localtime(&(z_utime.mtime));
  81.     else
  82.         t = (struct tm *)NULL;
  83.     if (t != (struct tm *)NULL)
  84.     {
  85.         yr = t->tm_year + 1900;
  86.         mo = t->tm_mon;
  87.         dy = t->tm_mday;
  88.         hh = t->tm_hour;
  89.         mm = t->tm_min;
  90.         ss = t->tm_sec;
  91.     }
  92.     else
  93.     {
  94.         /* dissect the date */
  95.         yr = ((G.lrec.last_mod_dos_date >> 9) & 0x7f) + 1980;
  96.         mo = ((G.lrec.last_mod_dos_date >> 5) & 0x0f) - 1;
  97.         dy = (G.lrec.last_mod_dos_date & 0x1f);
  98.         /* dissect the time */
  99.         hh = (G.lrec.last_mod_dos_time >> 11) & 0x1f;
  100.         mm = (G.lrec.last_mod_dos_time >> 5) & 0x3f;
  101.         ss = (G.lrec.last_mod_dos_time & 0x1f) * 2;
  102.     }
  103. #else /* !USE_EF_UT_TIME */
  104.     /* dissect the date */
  105.     yr = ((G.lrec.last_mod_dos_datetime >> 25) & 0x7f) + (1980 - YRBASE);
  106.     mo = (G.lrec.last_mod_dos_datetime >> 21) & 0x0f;
  107.     dy = (G.lrec.last_mod_dos_datetime >> 16) & 0x1f;
  108.     /* dissect the time */
  109.     hh = (G.lrec.last_mod_dos_datetime >> 11) & 0x1f;
  110.     mm = (G.lrec.last_mod_dos_datetime >> 5) & 0x3f;
  111.     ss = (G.lrec.last_mod_dos_datetime << 1) & 0x1f;
  112. #endif /* ?USE_EF_UT_TIME */
  113.     sprintf(temp, "%02d/%02d/%02d %02d:%02d:%02d", mo, dy, yr, hh, mm, ss);
  114.     ablock[1] = (int)(temp - 1);
  115.     ablock[2] = 0;
  116.     if (!jsys(IDTIM, ablock)) {
  117.         Info(slide, 1, ((char *)slide, "error:  IDTIM failure for %sn",
  118.           G.filename));
  119.         fclose(G.outfile);
  120.         return;
  121.     }
  122.     tad = ablock[2];
  123.     tblock[0] = tad;
  124.     tblock[1] = tad;
  125.     tblock[2] = -1;
  126.     ablock[1] = fcntl(fileno(G.outfile), F_GETSYSFD, 0);
  127.                                                 /* _uffd[outfd]->uf_ch */
  128.     ablock[2] = (int) tblock;
  129.     ablock[3] = 3;
  130.     if (!jsys(SFTAD, ablock))
  131.         Info(slide, 1,((char *)slide, "error:  cannot set the time for %sn",
  132.           G.filename));
  133.     fclose(G.outfile);
  134. } /* end function close_outfile() */
  135. #ifndef SFX
  136. /************************/
  137. /*  Function version()  */
  138. /************************/
  139. void version(__G)
  140.     __GDEF
  141. {
  142. #if 0
  143.     char buf[40];
  144. #endif
  145.     sprintf((char *)slide, LoadFarString(CompiledWith),
  146. #ifdef __GNUC__
  147.       "gcc ", __VERSION__,
  148. #else
  149. #  if 0
  150.       "cc ", (sprintf(buf, " version %d", _RELEASE), buf),
  151. #  else
  152. #  ifdef __COMPILER_KCC__
  153.       "KCC", "",
  154. #  else
  155.       "unknown compiler", "",
  156. #  endif
  157. #  endif
  158. #endif
  159.       "TOPS-20",
  160. #if defined(foobar) || defined(FOOBAR)
  161.       " (Foo BAR)",   /* OS version or hardware */
  162. #else
  163.       "",
  164. #endif /* Foo BAR */
  165. #ifdef __DATE__
  166.       " on ", __DATE__
  167. #else
  168.       "", ""
  169. #endif
  170.     );
  171.     (*G.message)((zvoid *)&G, slide, (ulg)strlen((char *)slide), 0);
  172. } /* end function version() */
  173. #endif /* !SFX */
  174. /**********************/
  175. /*  Function upper()  */
  176. /**********************/
  177. int upper(s)        /* returns s in uppercase */
  178.     char *s;        /* string to be uppercased */
  179. {
  180.     for (;  *s;  ++s)
  181.         *s = toupper(*s);
  182. }
  183. /************************/
  184. /*  Function enquote()  */
  185. /************************/
  186. int enquote(s)      /* calls dequote(s) to normalize string, then */
  187.     char *s;        /*  inserts ^Vs before otherwise illegal characters */
  188. {                   /*  in s, assuming that s is a TOPS-20 filename */
  189.     char d[100];
  190.     char *p, *q;
  191.     char c;
  192.     if (s && *s) {
  193.         dequote(s);
  194.         p = s - 1;
  195.         q = d - 1;
  196.         while (c = *++p) {
  197.             if (!fnlegal(c))
  198.                 *++q = '26';
  199.             *++q = c;
  200.         }
  201.         *++q = '';
  202.         strcpy(s, d);
  203.     }
  204.     return 0;
  205. }
  206. /************************/
  207. /*  Function dequote()  */
  208. /************************/
  209. int dequote(s)        /* returns s without ^Vs */
  210.     char *s;          /* string to be dequoted */
  211. {
  212.     char d[100];
  213.     char *p, *q;
  214.     int c;
  215.     if (s && *s) {
  216.         p = s - 1;
  217.         q = d - 1;
  218.         while (c = *++p)
  219.             if (c != '26')
  220.                 *++q = c;
  221.         *++q = '';
  222.         strcpy(s, d);
  223.     }
  224.     return 0;
  225. }
  226. /************************/
  227. /*  Function fnlegal()  */
  228. /************************/
  229. int fnlegal(c)         /* returns TRUE if c is a member of the */
  230.     char c;            /*  legal character set for filenames */
  231. {
  232.     char *q;
  233.     static char *legals = {"$%**-<>>AZ[[]]__az"};
  234.     q = legals;
  235.     while (*q)
  236.         if (c < *q++)
  237.             break;
  238.         else if (c <= *q++)
  239.             return TRUE;
  240.     return FALSE;
  241. }