home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 9 Archive / 09-Archive.zip / unzip531.zip / acorn / riscos.c < prev    next >
C/C++ Source or Header  |  1997-03-28  |  7KB  |  351 lines

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