comparison Modules/arraymodule.c @ 1393:7d6a2d950f13 legacy-trunk

* nismodule.c: database keys and values can contain null bytes. be more careful about these. * arraymodule.c: added 8 byte swap; added 'i' format character; added reverse() method; rename read/write to fromfile/tofile. * config.c: Set version to 0.9.9++. * rotormodule.c (r_rand): declare k1..k5 as unsigned longs so the shifts will have a well-defined effect independent of word size. * bltinmodule.c: renamed bagof() to filter().
author Guido van Rossum <guido@python.org>
date Wed, 03 Nov 1993 15:01:26 +0000
parents 7c3245c18677
children 1ce2c0f565ef
comparison
equal deleted inserted replaced
1392:0ffff40d13ff 1393:7d6a2d950f13
142 ((short *)ap->ob_item)[i] = x; 142 ((short *)ap->ob_item)[i] = x;
143 return 0; 143 return 0;
144 } 144 }
145 145
146 static object * 146 static object *
147 i_getitem(ap, i)
148 arrayobject *ap;
149 int i;
150 {
151 return newintobject((long) ((int *)ap->ob_item)[i]);
152 }
153
154 static int
155 i_setitem(ap, i, v)
156 arrayobject *ap;
157 int i;
158 object *v;
159 {
160 int x;
161 if (!getargs(v, "i;array item must be integer", &x))
162 return -1;
163 if (i >= 0)
164 ((int *)ap->ob_item)[i] = x;
165 return 0;
166 }
167
168 static object *
147 l_getitem(ap, i) 169 l_getitem(ap, i)
148 arrayobject *ap; 170 arrayobject *ap;
149 int i; 171 int i;
150 { 172 {
151 return newintobject(((long *)ap->ob_item)[i]); 173 return newintobject(((long *)ap->ob_item)[i]);
212 /* Description of types */ 234 /* Description of types */
213 static struct arraydescr descriptors[] = { 235 static struct arraydescr descriptors[] = {
214 {'c', sizeof(char), c_getitem, c_setitem}, 236 {'c', sizeof(char), c_getitem, c_setitem},
215 {'b', sizeof(char), b_getitem, b_setitem}, 237 {'b', sizeof(char), b_getitem, b_setitem},
216 {'h', sizeof(short), h_getitem, h_setitem}, 238 {'h', sizeof(short), h_getitem, h_setitem},
239 {'i', sizeof(int), i_getitem, i_setitem},
217 {'l', sizeof(long), l_getitem, l_setitem}, 240 {'l', sizeof(long), l_getitem, l_setitem},
218 {'f', sizeof(float), f_getitem, f_setitem}, 241 {'f', sizeof(float), f_getitem, f_setitem},
219 {'d', sizeof(double), d_getitem, d_setitem}, 242 {'d', sizeof(double), d_getitem, d_setitem},
220 {'\0', 0, 0, 0} /* Sentinel */ 243 {'\0', 0, 0, 0} /* Sentinel */
221 }; 244 };
245 /* If we ever allow items larger than double, we must change reverse()! */
222 246
223 247
224 object * 248 object *
225 newarrayobject(size, descr) 249 newarrayobject(size, descr)
226 int size; 250 int size;
237 nbytes = size * descr->itemsize; 261 nbytes = size * descr->itemsize;
238 /* Check for overflow */ 262 /* Check for overflow */
239 if (nbytes / descr->itemsize != size) { 263 if (nbytes / descr->itemsize != size) {
240 return err_nomem(); 264 return err_nomem();
241 } 265 }
242 op = (arrayobject *) malloc(sizeof(arrayobject)); 266 op = NEW(arrayobject, 1);
243 if (op == NULL) { 267 if (op == NULL) {
244 return err_nomem(); 268 return err_nomem();
245 } 269 }
246 if (size <= 0) { 270 if (size <= 0) {
247 op->ob_item = NULL; 271 op->ob_item = NULL;
248 } 272 }
249 else { 273 else {
250 op->ob_item = malloc(nbytes); 274 op->ob_item = NEW(char, nbytes);
251 if (op->ob_item == NULL) { 275 if (op->ob_item == NULL) {
252 free((ANY *)op); 276 DEL(op);
253 return err_nomem(); 277 return err_nomem();
254 } 278 }
255 } 279 }
256 op->ob_type = &Arraytype; 280 op->ob_type = &Arraytype;
257 op->ob_size = size; 281 op->ob_size = size;
353 array_dealloc(op) 377 array_dealloc(op)
354 arrayobject *op; 378 arrayobject *op;
355 { 379 {
356 int i; 380 int i;
357 if (op->ob_item != NULL) 381 if (op->ob_item != NULL)
358 free((ANY *)op->ob_item); 382 DEL(op->ob_item);
359 free((ANY *)op); 383 DEL(op);
360 } 384 }
361 385
362 static int 386 static int
363 array_compare(v, w) 387 array_compare(v, w)
364 arrayobject *v, *w; 388 arrayobject *v, *w;
642 p[1] = p[2]; 666 p[1] = p[2];
643 p[2] = p1; 667 p[2] = p1;
644 p[3] = p0; 668 p[3] = p0;
645 } 669 }
646 break; 670 break;
671 case 8:
672 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
673 char p0 = p[0];
674 char p1 = p[1];
675 char p2 = p[2];
676 char p3 = p[3];
677 p[0] = p[7];
678 p[1] = p[6];
679 p[2] = p[5];
680 p[3] = p[4];
681 p[4] = p3;
682 p[5] = p2;
683 p[6] = p1;
684 p[7] = p0;
685 }
686 break;
647 default: 687 default:
648 err_setstr(RuntimeError, 688 err_setstr(RuntimeError,
649 "don't know how to byteswap this array type"); 689 "don't know how to byteswap this array type");
650 return NULL; 690 return NULL;
651 } 691 }
652 INCREF(None); 692 INCREF(None);
653 return None; 693 return None;
654 } 694 }
655 695
656 #if 0
657 static object * 696 static object *
658 array_reverse(self, args) 697 array_reverse(self, args)
659 arrayobject *self; 698 arrayobject *self;
660 object *args; 699 object *args;
661 { 700 {
662 register object **p, **q; 701 register int itemsize = self->ob_descr->itemsize;
663 register object *tmp; 702 register char *p, *q;
664 703 char tmp[sizeof(double)]; /* Assume that's the max item size */
704
665 if (args != NULL) { 705 if (args != NULL) {
666 err_badarg(); 706 err_badarg();
667 return NULL; 707 return NULL;
668 } 708 }
669 709
670 if (self->ob_size > 1) { 710 if (self->ob_size > 1) {
671 for (p = self->ob_item, q = self->ob_item + self->ob_size - 1; 711 for (p = self->ob_item,
672 p < q; p++, q--) { 712 q = self->ob_item + (self->ob_size - 1)*itemsize;
673 tmp = *p; 713 p < q;
674 *p = *q; 714 p += itemsize, q -= itemsize) {
675 *q = tmp; 715 memmove(tmp, p, itemsize);
716 memmove(p, q, itemsize);
717 memmove(q, tmp, itemsize);
676 } 718 }
677 } 719 }
678 720
679 INCREF(None); 721 INCREF(None);
680 return None; 722 return None;
681 } 723 }
682 #endif 724
725 /* The following routines were adapted from listobject.c but not converted.
726 To make them work you will have to work! */
683 727
684 #if 0 728 #if 0
685 static object * 729 static object *
686 array_index(self, args) 730 array_index(self, args)
687 arrayobject *self; 731 arrayobject *self;
748 return NULL; 792 return NULL;
749 } 793 }
750 #endif 794 #endif
751 795
752 static object * 796 static object *
753 array_read(self, args) 797 array_fromfile(self, args)
754 arrayobject *self; 798 arrayobject *self;
755 object *args; 799 object *args;
756 { 800 {
757 object *f; 801 object *f;
758 int n; 802 int n;
788 INCREF(None); 832 INCREF(None);
789 return None; 833 return None;
790 } 834 }
791 835
792 static object * 836 static object *
793 array_write(self, args) 837 array_tofile(self, args)
794 arrayobject *self; 838 arrayobject *self;
795 object *args; 839 object *args;
796 { 840 {
797 object *f; 841 object *f;
798 FILE *fp; 842 FILE *fp;
919 963
920 static struct methodlist array_methods[] = { 964 static struct methodlist array_methods[] = {
921 {"append", array_append}, 965 {"append", array_append},
922 {"byteswap", array_byteswap}, 966 {"byteswap", array_byteswap},
923 /* {"count", array_count},*/ 967 /* {"count", array_count},*/
968 {"fromfile", array_fromfile},
969 {"fromlist", array_fromlist},
970 {"fromstring", array_fromstring},
924 /* {"index", array_index},*/ 971 /* {"index", array_index},*/
925 {"insert", array_insert}, 972 {"insert", array_insert},
973 {"read", array_fromfile},
974 /* {"remove", array_remove},*/
975 {"reverse", array_reverse},
926 /* {"sort", array_sort},*/ 976 /* {"sort", array_sort},*/
927 /* {"remove", array_remove},*/ 977 {"tofile", array_tofile},
928 /* {"reverse", array_reverse},*/
929 {"read", array_read},
930 {"write", array_write},
931 {"fromlist", array_fromlist},
932 {"tolist", array_tolist}, 978 {"tolist", array_tolist},
933 {"fromstring", array_fromstring},
934 {"tostring", array_tostring}, 979 {"tostring", array_tostring},
980 {"write", array_tofile},
935 {NULL, NULL} /* sentinel */ 981 {NULL, NULL} /* sentinel */
936 }; 982 };
937 983
938 static object * 984 static object *
939 array_getattr(a, name) 985 array_getattr(a, name)