Description: <short summary of the patch>
TODO: Put a short summary on the line above and replace this paragraph
with a longer explanation of this change. Complete the meta-information
with other relevant fields (see below for details). To make it easier, the
information below has been extracted from the changelog. Adjust it or drop
it.
.
gcl (2.6.12-37) unstable; urgency=medium
.
* Version_2_6_13pre49
Author: Camm Maguire <camm@debian.org>
---
The information above should follow the Patch Tagging Guidelines, please
checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here
are templates for supplementary fields that you might want to add:
Origin: <vendor|upstream|other>, <url of original patch>
Bug: <url in upstream bugtracker>
Bug-Debian: https://bugs.debian.org/<bugnumber>
Bug-Ubuntu: https://launchpad.net/bugs/<bugnumber>
Forwarded: <no|not-needed|url proving that it has been forwarded>
Reviewed-By: <name and email of someone who approved the patch>
Last-Update: 2016-10-04
--- gcl-2.6.12.orig/o/array.c
+++ gcl-2.6.12/o/array.c
@@ -850,31 +850,33 @@ raw_aet_ptr(object x, short int typ)
*/
void
-gset(void *p1, void *val, int n, int typ)
-{ if (val==0)
+gset(void *p1, void *val, int n, int typ) {
+
+ if (val==0)
val = aet_types[typ].dflt;
- switch (typ){
+
+ switch (typ){
#define GSET(p,n,typ,val) {typ x = *((typ *) val); GSET1(p,n,typ,x)}
-#define GSET1(p,n,typ,val) while (n-- > 0) \
+#define GSET1(p,n,typ,val) while (n-- > 0) \
{ *((typ *) p) = val; \
- p = p + sizeof(typ); \
- } break;
+ p = p + sizeof(typ); \
+ } break;
- case aet_object: GSET(p1,n,object,val);
- case aet_ch: GSET(p1,n,char,val);
- /* Note n is number of fixnum WORDS for bit */
- case aet_bit: GSET(p1,n,fixnum,val);
- case aet_fix: GSET(p1,n,fixnum,val);
- case aet_sf: GSET(p1,n,shortfloat,val);
- case aet_lf: GSET(p1,n,longfloat,val);
- case aet_char: GSET(p1,n,char,val);
- case aet_uchar: GSET(p1,n,unsigned char,val);
- case aet_short: GSET(p1,n,short,val);
- case aet_ushort: GSET(p1,n,unsigned short,val);
- default: FEerror("bad elttype",0);
- }
+ case aet_object: GSET(p1,n,object,val);
+ case aet_ch: GSET(p1,n,char,val);
+ /* Note n is number of fixnum WORDS for bit */
+ case aet_bit: GSET(p1,n,fixnum,val);
+ case aet_fix: GSET(p1,n,fixnum,val);
+ case aet_sf: GSET(p1,n,shortfloat,val);
+ case aet_lf: GSET(p1,n,longfloat,val);
+ case aet_char: GSET(p1,n,char,val);
+ case aet_uchar: GSET(p1,n,unsigned char,val);
+ case aet_short: GSET(p1,n,short,val);
+ case aet_ushort: GSET(p1,n,unsigned short,val);
+ default: FEerror("bad elttype",0);
}
+}
#define W_SIZE (BV_BITS*sizeof(fixnum))
@@ -894,38 +896,43 @@ implementation dependent results.")
int n1=fix(n1o),nc;
if (VFUN_NARGS==4)
{ n1 = x->v.v_dim - i1;}
- if (typ1==aet_bit)
- {if (i1 % CHAR_SIZE)
- badcopy:
- FEerror("Bit copies only if aligned",0);
- else
- {int rest=n1%CHAR_SIZE;
- if (rest!=0 )
- {if (typ2!=aet_bit)
- goto badcopy;
- {while(rest> 0)
- { fSaset1(y,i2+n1-rest,(fLrow_major_aref(x,i1+n1-rest)));
- rest--;}
- }}
- i1=i1/CHAR_SIZE ;
- n1=n1/CHAR_SIZE;
- typ1=aet_char;
- }};
- if (typ2==aet_bit)
- {if (i2 % CHAR_SIZE)
- goto badcopy;
- i2=i2/CHAR_SIZE ;}
- if ((typ1 ==aet_object ||
- typ2 ==aet_object) && typ1 != typ2)
+ if (typ1==aet_bit) {
+ if (i1 % CHAR_SIZE)
+ badcopy:
+ FEerror("Bit copies only if aligned",0);
+ else {
+ int rest=n1%CHAR_SIZE;
+ if (rest!=0) {
+ if (typ2!=aet_bit)
+ goto badcopy;
+ while(rest> 0) {
+ fSaset1(y,i2+n1-rest,(fLrow_major_aref(x,i1+n1-rest)));
+ rest--;
+ }
+ }
+ i1=i1/CHAR_SIZE ;
+ n1=n1/CHAR_SIZE;
+ typ1=aet_char;
+ }
+ }
+
+ if (typ2==aet_bit) {
+ if (i2 % CHAR_SIZE)
+ goto badcopy;
+ i2=i2/CHAR_SIZE ;
+ }
+
+ if ((typ1 ==aet_object || typ2 ==aet_object) && typ1 != typ2)
FEerror("Can't copy between different array types",0);
nc=n1 * aet_sizes[(int)typ1];
- if (i1+n1 > x->a.a_dim
- || ((y->a.a_dim - i2) *aet_sizes[(int)typ2]) < nc)
+ if (i1+n1 > x->a.a_dim || ((y->a.a_dim - i2) *aet_sizes[(int)typ2]) < nc)
FEerror("Copy out of bounds",0);
bcopy(x->ust.ust_self + (i1*aet_sizes[(int)typ1]),
y->ust.ust_self + (i2*aet_sizes[(int)typ2]),
nc);
+
return x;
+
}
/* X is the header of an array. This supplies the body which
--- gcl-2.6.12.orig/o/predicate.c
+++ gcl-2.6.12/o/predicate.c
@@ -744,14 +744,13 @@ BEGIN:
if (tx == t_complex)
return(contains_sharp_comma(x->cmp.cmp_real) ||
contains_sharp_comma(x->cmp.cmp_imag));
- if (tx == t_vector)
- {
- int i;
- if (x->v.v_elttype == aet_object)
- for (i = 0; i < x->v.v_fillp; i++)
- if (contains_sharp_comma(x->v.v_self[i]))
- return(TRUE);
- return(FALSE);
+ if (tx == t_vector) {
+ int i;
+ if (x->v.v_elttype == aet_object)
+ for (i = 0; i < x->v.v_fillp; i++)
+ if (contains_sharp_comma(x->v.v_self[i]))
+ return(TRUE);
+ return(FALSE);
}
if (tx == t_cons) {
if (x->c.c_car == siSsharp_comma)
--- gcl-2.6.12.orig/o/unixsys.c
+++ gcl-2.6.12/o/unixsys.c
@@ -32,25 +32,39 @@ int
vsystem(const char *command) {
unsigned j,n=strlen(command)+1;
- char *z=alloca(n),**p1,**pp,*c;
+ char *z,*c;
+ const char *x1[]={"/bin/sh","-c",NULL,NULL},*spc=" \n\t",**p1,**pp;
int s;
pid_t pid;
- memcpy(z,command,n);
- for (j=1,c=z;strtok(c," \n\t");c=NULL,j++);
+ if (strpbrk(command,"\"'$<>"))
- memcpy(z,command,n);
- p1=alloca(j*sizeof(*p1));
- for (pp=p1,c=z;(*pp=strtok(c," \n\t"));c=NULL,pp++);
+ (p1=x1)[2]=command;
+
+ else {
+
+ z=alloca(n);
+ memcpy(z,command,n);
+ for (j=1,c=z;strtok(c,spc);c=NULL,j++);
+
+ memcpy(z,command,n);
+ p1=alloca(j*sizeof(*p1));
+ for (pp=p1,c=z;(*pp=strtok(c,spc));c=NULL,pp++);
+
+ }
if (!(pid=vfork())) {
- execvp(*p1,p1);
- _exit(2);
+ errno=0;
+ execvp(*p1,(void *)p1);
+ _exit(128|(errno&0x7f));
}
massert(pid>0);
massert(pid==waitpid(pid,&s,0));
+ if ((s>>8)&128)
+ emsg("execvp failure when executing '%s': %s\n",command,strerror((s>>8)&0x7f));
+
return s;
}