annotate xl.c @ 0:e0bbaa717f41 draft default tip

lol J
author Jordi Gutiérrez Hermoso <jordigh@octave.org>
date Mon, 25 Nov 2013 11:56:30 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
1 /* Copyright 1990-2011, Jsoftware Inc. All rights reserved. */
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
2 /* License in license.txt. */
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
3 /* */
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
4 /* Xenos: File Lock/Unlock */
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
5
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
6 #include "j.h"
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
7 #include "x.h"
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
8
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
9 #if SY_WINCE || !(SYS & SYS_DOS+SYS_MACINTOSH)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
10 #define LOCK 1
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
11 static B jtdolock(J jt,B lk,F f,I i,I n){ASSERT(0,EVNONCE);}
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
12 #endif
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
13
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
14 #if SY_WIN32 && SYS&SYS_DOS && !SY_WINCE
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
15 #define LOCK 1
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
16 #include <sys/locking.h>
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
17
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
18 extern int _locking(int,int,long);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
19
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
20 static B jtdolock(J jt,B lk,F f,I i,I n){I e;long c;fpos_t v; fpos_t q;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
21 c=fgetpos(f,(fpos_t*)&q);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
22 if(0!=c)R (B)jerrno();
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
23 v=i;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
24 c=fsetpos(f,(fpos_t*)&v);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
25 if(0!=c)R (B)jerrno();
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
26 e=_locking(_fileno(f),lk?_LK_NBLCK:_LK_UNLCK,(long)n);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
27 fsetpos(f,(fpos_t*)&q);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
28 R !e?1:errno==EACCES?0:(B)jerrno();
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
29 }
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
30 #endif
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
31
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
32 #ifndef LOCK
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
33 static B jtdolock(J jt,B lk,F f,I i,I n){I e;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
34 e=lk?lock(fileno(f),i,n):unlock(fileno(f),i,n);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
35 R !e?1:errno==EACCES?0:jerrno();
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
36 }
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
37 #endif
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
38
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
39 #define LKC 3 /* number of columns in jt->flkd table */
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
40
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
41 B jtxlinit(J jt){A x;I*s;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
42 GA(x,INT,20*LKC,2,0); s=AS(x); s[0]=20; s[1]=LKC; ra(x);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
43 jt->flkd=x;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
44 R 1;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
45 }
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
46
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
47 F1(jtjlocks){A y; ASSERTMTV(w); y=take(sc(jt->flkn),jt->flkd); R grade2(y,y);}
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
48 /* return the locks, a 3-column table of (number,index,length) */
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
49
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
50 F1(jtjlock){B b;I*v;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
51 F1RANK(1,jtjlock,0);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
52 RZ(w=vi(w));
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
53 ASSERT(LKC==AN(w),EVLENGTH);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
54 v=AV(w); RE(vfn((F)*v)); ASSERT(0<=v[1]&&0<=v[2],EVDOMAIN);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
55 if(jt->flkn==*AS(jt->flkd))RZ(jt->flkd=ext(1,jt->flkd));
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
56 RE(b=dolock(1,(F)v[0],v[1],v[2]));
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
57 if(!b)R zero;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
58 ICPY(AV(jt->flkd)+LKC*jt->flkn,v,LKC); ++jt->flkn;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
59 R one;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
60 } /* w is (number,index,length); lock the specified region */
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
61
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
62 static A jtunlj(J jt,I j){B b;I*u,*v;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
63 RE(j);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
64 ASSERT(0<=j&&j<jt->flkn,EVINDEX);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
65 u=AV(jt->flkd); v=u+j*LKC;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
66 RE(b=dolock(0,(F)v[0],v[1],v[2]));
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
67 if(!b)R zero;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
68 --jt->flkn;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
69 if(j<jt->flkn)ICPY(v,u+jt->flkn*LKC,LKC); else *v=0;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
70 R one;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
71 } /* unlock the j-th entry in jt->flkd */
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
72
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
73 B jtunlk(J jt,I x){I j=0,*v=AV(jt->flkd);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
74 while(j<jt->flkn){while(x==*v)RZ(unlj(j)); ++j; v+=LKC;}
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
75 R 1;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
76 } /* unlock all existing locks for file# x */
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
77
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
78 F1(jtjunlock){
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
79 F1RANK(1,jtjunlock,0);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
80 ASSERT(INT&AT(w),EVDOMAIN);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
81 R unlj(i0(indexof(jt->flkd,w)));
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
82 } /* w is (number,index,length); unlock the specified region */