Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

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