~ubuntu-branches/ubuntu/precise/unzip/precise-proposed

« back to all changes in this revision

Viewing changes to acorn/riscos.c

  • Committer: Bazaar Package Importer
  • Author(s): Santiago Vila
  • Date: 2004-06-06 17:57:46 UTC
  • Revision ID: james.westby@ubuntu.com-20040606175746-nl7p2dgp3aobyc2c
Tags: upstream-5.51
ImportĀ upstreamĀ versionĀ 5.51

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
}