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

压缩解压

开发平台:

MultiPlatform

  1. /* riscos.c */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. /* #define NO_UNZIPH_STUFF */
  6. #define UNZIP_INTERNAL
  7. #include "unzip.h"
  8. #include "riscos.h"
  9. #define MAXEXT 16
  10. char *exts2swap = ""; /* Extensions to swap (actually, directory names) */
  11. int stat(char *filename,struct stat *res)
  12. {
  13.  int attr;              /* object attributes */
  14.  unsigned int load;     /* load address */
  15.  unsigned int exec;     /* exec address */
  16.  int type;              /* type: 0 not found, 1 file, 2 dir, 3 image */
  17.  if (!res)
  18.    return -1;
  19.  if (SWI_OS_File_5(filename,&type,&load,&exec,(int *)&res->st_size,&attr)!=NULL)
  20.    return -1;
  21.  if (type==0)
  22.    return -1;
  23.  res->st_dev=0;
  24.  res->st_ino=0;
  25.  res->st_nlink=0;
  26.  res->st_uid=1;
  27.  res->st_gid=1;
  28.  res->st_rdev=0;
  29.  res->st_blksize=1024;
  30.  res->st_mode = ((attr & 0001) << 8) | ((attr & 0002) << 6) |
  31.                 ((attr & 0020) >> 2) | ((attr & 0040) >> 4);
  32.  switch (type) {
  33.    case 1:                        /* File */
  34.     res->st_mode |= S_IFREG;
  35.     break;
  36.    case 2:                        /* Directory */
  37.     res->st_mode |= S_IFDIR | 0700;
  38.     break;
  39.    case 3:                        /* Image file */
  40.     if (uO.scanimage)
  41.       res->st_mode |= S_IFDIR | 0700;
  42.     else
  43.       res->st_mode |= S_IFREG;
  44.     break;
  45.  }
  46.  if ((((unsigned int) load) >> 20) == 0xfff) {     /* date stamped file */
  47.    register unsigned int t1, t2, tc;
  48.    t1 = (unsigned int) (exec);
  49.    t2 = (unsigned int) (load & 0xff);
  50.    tc = 0x6e996a00U;
  51.    if (t1 < tc)
  52.      t2--;
  53.    t1 -= tc;
  54.    t2 -= 0x33;          /* 00:00:00 Jan. 1 1970 = 0x336e996a00 */
  55.    t1 = (t1 / 100) + (t2 * 42949673U);  /* 0x100000000 / 100 = 42949672.96 */
  56.    t1 -= (t2 / 25);             /* compensate for .04 error */
  57.    res->st_atime = res->st_mtime = res->st_ctime = t1;
  58.  }
  59.  else
  60.    res->st_atime = res->st_mtime = res->st_ctime = 0;
  61.  return 0;
  62. }
  63. #ifndef SFX
  64. DIR *opendir(char *dirname)
  65. {
  66.  DIR *thisdir;
  67.  int type;
  68.  int attr;
  69.  os_error *er;
  70.  thisdir=(DIR *)malloc(sizeof(DIR));
  71.  if (thisdir==NULL)
  72.    return NULL;
  73.  thisdir->dirname=(char *)malloc(strlen(dirname)+1);
  74.  if (thisdir->dirname==NULL) {
  75.    free(thisdir);
  76.    return NULL;
  77.  }
  78.  strcpy(thisdir->dirname,dirname);
  79.  if (thisdir->dirname[strlen(thisdir->dirname)-1]=='.')
  80.    thisdir->dirname[strlen(thisdir->dirname)-1]=0;
  81.  if (er=SWI_OS_File_5(thisdir->dirname,&type,NULL,NULL,NULL,&attr),er!=NULL ||
  82.      type<=1 || (type==3 && !uO.scanimage))
  83.  {
  84.    free(thisdir->dirname);
  85.    free(thisdir);
  86.    return NULL;
  87.  }
  88.  thisdir->buf=malloc(DIR_BUFSIZE);
  89.  if (thisdir->buf==NULL) {
  90.    free(thisdir->dirname);
  91.    free(thisdir);
  92.    return NULL;
  93.  }
  94.  thisdir->size=DIR_BUFSIZE;
  95.  thisdir->offset=0;
  96.  thisdir->read=0;
  97.  return thisdir;
  98. }
  99. struct dirent *readdir(DIR *d)
  100. {
  101.  static struct dirent dent;
  102.  if (d->read==0) {    /* no more objects read in the buffer */
  103.    if (d->offset==-1) {    /* no more objects to read */
  104.      return NULL;
  105.    }
  106.    d->read=255;
  107.    if (SWI_OS_GBPB_9(d->dirname,d->buf,&d->read,&d->offset,DIR_BUFSIZE,NULL)!=NULL)
  108.      return NULL;
  109.    if (d->read==0) {
  110.      d->offset=-1;
  111.      return NULL;
  112.    }
  113.    d->read--;
  114.    d->act=(char *)d->buf;
  115.  }
  116.  else {     /* some object is ready in buffer */
  117.    d->read--;
  118.    d->act=(char *)(d->act+strlen(d->act)+1);
  119.  }
  120.  strcpy(dent.d_name,d->act);
  121.  dent.d_namlen=strlen(dent.d_name);
  122.  return &dent;
  123. }
  124. void closedir(DIR *d)
  125. {
  126.  if (d->buf!=NULL)
  127.    free(d->buf);
  128.  if (d->dirname!=NULL)
  129.    free(d->dirname);
  130.  free(d);
  131. }
  132. int unlink(f)
  133. char *f;                /* file to delete */
  134. /* Delete the file *f, returning non-zero on failure. */
  135. {
  136.  os_error *er;
  137.  char canon[256];
  138.  int size=255;
  139.  er=SWI_OS_FSControl_37(f,canon,&size);
  140.  if (er==NULL) {
  141.    er=SWI_OS_FSControl_27(canon,0x100);
  142.  }
  143.  else {
  144.    er=SWI_OS_FSControl_27(f,0x100);
  145.  }
  146.  return (int)er;
  147. }
  148. int rmdir(char *d)
  149. {
  150.  int objtype;
  151.  char *s;
  152.  int len;
  153.  len = strlen(d);
  154.  if ((s = malloc(len + 1)) == NULL)
  155.    return -1;
  156.  strcpy(s,d);
  157.  if (s[len-1]=='.')
  158.    s[len-1]=0;
  159.  if (SWI_OS_File_5(s,&objtype,NULL,NULL,NULL,NULL)!=NULL) {
  160.    free(s);
  161.    return -1;
  162.  }
  163.  if (objtype<2 || (!uO.scanimage && objtype==3)) {
  164. /* this is a file or it doesn't exist */
  165.    free(s);
  166.    return -1;
  167.  }
  168.  if (SWI_OS_File_6(s)!=NULL) {
  169.    free(s);
  170.    return -1;
  171.  }
  172.  free(s);
  173.  return 0;
  174. }
  175. #endif /* !SFX */
  176. int chmod(char *file, int mode)
  177. {
  178. /*************** NOT YET IMPLEMENTED!!!!!! ******************/
  179. /* I don't know if this will be needed or not... */
  180.  file=file;
  181.  mode=mode;
  182.  return 0;
  183. }
  184. void setfiletype(char *fname,int ftype)
  185. {
  186.  char str[256];
  187.  sprintf(str,"SetType %s &%3.3X",fname,ftype);
  188.  SWI_OS_CLI(str);
  189. }
  190. void getRISCOSexts(char *envstr)
  191. {
  192.  char *envptr;                               /* value returned by getenv */
  193.  envptr = getenv(envstr);
  194.  if (envptr == NULL || *envptr == 0) return;
  195.  exts2swap=malloc(1+strlen(envptr));
  196.  if (exts2swap == NULL)
  197.    return;
  198.  strcpy(exts2swap, envptr);
  199. }
  200. int checkext(char *suff)
  201. {
  202.  register char *extptr=exts2swap;
  203.  register char *suffptr;
  204.  register int e,s;
  205.  while(*extptr) {
  206.    suffptr=suff;
  207.    e=*extptr; s=*suffptr;
  208.    while (e && e!=':' && s && s!='.' && s!='/' && e==s) {
  209.      e=*++extptr; s=*++suffptr;
  210.    }
  211.    if (e==':') e=0;
  212.    if (s=='.' || s=='/') s=0;
  213.    if (!e && !s) {
  214.      return 1;
  215.    }
  216.    while(*extptr!=':' && *extptr!='')    /* skip to next extension */
  217.      extptr++;
  218.    if (*extptr!='')
  219.      extptr++;
  220.  }
  221.  return 0;
  222. }
  223. void swapext(char *name, char *exptr)
  224. {
  225.  char ext[MAXEXT];
  226.  register char *p1=exptr+1;
  227.  register char *p2=ext;
  228.  int extchar=*exptr;
  229.  while(*p1 && *p1!='.' && *p1!='/')
  230.    *p2++=*p1++;
  231.  *p2=0;
  232.  p2=exptr-1;
  233.  p1--;
  234.  while(p2 >= name)
  235.    *p1--=*p2--;
  236.  p1=name;
  237.  p2=ext;
  238.  while(*p2)
  239.    *p1++=*p2++;
  240.  *p1=(extchar=='/'?'.':'/');
  241. }
  242. void remove_prefix(void)
  243. {
  244.  SWI_DDEUtils_Prefix(NULL);
  245. }
  246. void set_prefix(void)
  247. {
  248.  char *pref;
  249.  int size=0;
  250.  if (SWI_OS_FSControl_37("@",pref,&size)!=NULL)
  251.    return;
  252.  size=1-size;
  253.  if (pref=malloc(size),pref!=NULL) {
  254.  if (SWI_OS_FSControl_37("@",pref,&size)!=NULL) {
  255.    free(pref);
  256.    return;
  257.  }
  258.  if (SWI_DDEUtils_Prefix(pref)==NULL) {
  259.    atexit(remove_prefix);
  260.  }
  261.  free(pref);
  262.  }
  263. }
  264. #ifdef localtime
  265. #  undef localtime
  266. #endif
  267. #ifdef gmtime
  268. #  undef gmtime
  269. #endif
  270. /* Acorn's implementation of localtime() and gmtime()
  271.  * doesn't consider the timezone offset, so we have to
  272.  * add it before calling the library functions
  273.  */
  274. struct tm *riscos_localtime(const time_t *timer)
  275. {
  276.  time_t localt=*timer;
  277.  localt+=SWI_Read_Timezone()/100;
  278.  return localtime(&localt);
  279. }
  280. struct tm *riscos_gmtime(const time_t *timer)
  281. {
  282.  time_t localt=*timer;
  283.  localt+=SWI_Read_Timezone()/100;
  284.  return gmtime(&localt);
  285. }