mirror of
https://github.com/python/cpython.git
synced 2025-07-24 11:44:31 +00:00
* 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().
This commit is contained in:
parent
78ed420314
commit
e77a757094
5 changed files with 101 additions and 36 deletions
|
@ -143,6 +143,28 @@ h_setitem(ap, i, v)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static object *
|
||||||
|
i_getitem(ap, i)
|
||||||
|
arrayobject *ap;
|
||||||
|
int i;
|
||||||
|
{
|
||||||
|
return newintobject((long) ((int *)ap->ob_item)[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
i_setitem(ap, i, v)
|
||||||
|
arrayobject *ap;
|
||||||
|
int i;
|
||||||
|
object *v;
|
||||||
|
{
|
||||||
|
int x;
|
||||||
|
if (!getargs(v, "i;array item must be integer", &x))
|
||||||
|
return -1;
|
||||||
|
if (i >= 0)
|
||||||
|
((int *)ap->ob_item)[i] = x;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static object *
|
static object *
|
||||||
l_getitem(ap, i)
|
l_getitem(ap, i)
|
||||||
arrayobject *ap;
|
arrayobject *ap;
|
||||||
|
@ -214,11 +236,13 @@ static struct arraydescr descriptors[] = {
|
||||||
{'c', sizeof(char), c_getitem, c_setitem},
|
{'c', sizeof(char), c_getitem, c_setitem},
|
||||||
{'b', sizeof(char), b_getitem, b_setitem},
|
{'b', sizeof(char), b_getitem, b_setitem},
|
||||||
{'h', sizeof(short), h_getitem, h_setitem},
|
{'h', sizeof(short), h_getitem, h_setitem},
|
||||||
|
{'i', sizeof(int), i_getitem, i_setitem},
|
||||||
{'l', sizeof(long), l_getitem, l_setitem},
|
{'l', sizeof(long), l_getitem, l_setitem},
|
||||||
{'f', sizeof(float), f_getitem, f_setitem},
|
{'f', sizeof(float), f_getitem, f_setitem},
|
||||||
{'d', sizeof(double), d_getitem, d_setitem},
|
{'d', sizeof(double), d_getitem, d_setitem},
|
||||||
{'\0', 0, 0, 0} /* Sentinel */
|
{'\0', 0, 0, 0} /* Sentinel */
|
||||||
};
|
};
|
||||||
|
/* If we ever allow items larger than double, we must change reverse()! */
|
||||||
|
|
||||||
|
|
||||||
object *
|
object *
|
||||||
|
@ -239,7 +263,7 @@ newarrayobject(size, descr)
|
||||||
if (nbytes / descr->itemsize != size) {
|
if (nbytes / descr->itemsize != size) {
|
||||||
return err_nomem();
|
return err_nomem();
|
||||||
}
|
}
|
||||||
op = (arrayobject *) malloc(sizeof(arrayobject));
|
op = NEW(arrayobject, 1);
|
||||||
if (op == NULL) {
|
if (op == NULL) {
|
||||||
return err_nomem();
|
return err_nomem();
|
||||||
}
|
}
|
||||||
|
@ -247,9 +271,9 @@ newarrayobject(size, descr)
|
||||||
op->ob_item = NULL;
|
op->ob_item = NULL;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
op->ob_item = malloc(nbytes);
|
op->ob_item = NEW(char, nbytes);
|
||||||
if (op->ob_item == NULL) {
|
if (op->ob_item == NULL) {
|
||||||
free((ANY *)op);
|
DEL(op);
|
||||||
return err_nomem();
|
return err_nomem();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -355,8 +379,8 @@ array_dealloc(op)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
if (op->ob_item != NULL)
|
if (op->ob_item != NULL)
|
||||||
free((ANY *)op->ob_item);
|
DEL(op->ob_item);
|
||||||
free((ANY *)op);
|
DEL(op);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -644,6 +668,22 @@ array_byteswap(self, args)
|
||||||
p[3] = p0;
|
p[3] = p0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 8:
|
||||||
|
for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
|
||||||
|
char p0 = p[0];
|
||||||
|
char p1 = p[1];
|
||||||
|
char p2 = p[2];
|
||||||
|
char p3 = p[3];
|
||||||
|
p[0] = p[7];
|
||||||
|
p[1] = p[6];
|
||||||
|
p[2] = p[5];
|
||||||
|
p[3] = p[4];
|
||||||
|
p[4] = p3;
|
||||||
|
p[5] = p2;
|
||||||
|
p[6] = p1;
|
||||||
|
p[7] = p0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
err_setstr(RuntimeError,
|
err_setstr(RuntimeError,
|
||||||
"don't know how to byteswap this array type");
|
"don't know how to byteswap this array type");
|
||||||
|
@ -653,33 +693,37 @@ array_byteswap(self, args)
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
static object *
|
static object *
|
||||||
array_reverse(self, args)
|
array_reverse(self, args)
|
||||||
arrayobject *self;
|
arrayobject *self;
|
||||||
object *args;
|
object *args;
|
||||||
{
|
{
|
||||||
register object **p, **q;
|
register int itemsize = self->ob_descr->itemsize;
|
||||||
register object *tmp;
|
register char *p, *q;
|
||||||
|
char tmp[sizeof(double)]; /* Assume that's the max item size */
|
||||||
|
|
||||||
if (args != NULL) {
|
if (args != NULL) {
|
||||||
err_badarg();
|
err_badarg();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (self->ob_size > 1) {
|
if (self->ob_size > 1) {
|
||||||
for (p = self->ob_item, q = self->ob_item + self->ob_size - 1;
|
for (p = self->ob_item,
|
||||||
p < q; p++, q--) {
|
q = self->ob_item + (self->ob_size - 1)*itemsize;
|
||||||
tmp = *p;
|
p < q;
|
||||||
*p = *q;
|
p += itemsize, q -= itemsize) {
|
||||||
*q = tmp;
|
memmove(tmp, p, itemsize);
|
||||||
|
memmove(p, q, itemsize);
|
||||||
|
memmove(q, tmp, itemsize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
INCREF(None);
|
INCREF(None);
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
/* The following routines were adapted from listobject.c but not converted.
|
||||||
|
To make them work you will have to work! */
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
static object *
|
static object *
|
||||||
|
@ -750,7 +794,7 @@ array_remove(self, args)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static object *
|
static object *
|
||||||
array_read(self, args)
|
array_fromfile(self, args)
|
||||||
arrayobject *self;
|
arrayobject *self;
|
||||||
object *args;
|
object *args;
|
||||||
{
|
{
|
||||||
|
@ -790,7 +834,7 @@ array_read(self, args)
|
||||||
}
|
}
|
||||||
|
|
||||||
static object *
|
static object *
|
||||||
array_write(self, args)
|
array_tofile(self, args)
|
||||||
arrayobject *self;
|
arrayobject *self;
|
||||||
object *args;
|
object *args;
|
||||||
{
|
{
|
||||||
|
@ -921,17 +965,19 @@ static struct methodlist array_methods[] = {
|
||||||
{"append", array_append},
|
{"append", array_append},
|
||||||
{"byteswap", array_byteswap},
|
{"byteswap", array_byteswap},
|
||||||
/* {"count", array_count},*/
|
/* {"count", array_count},*/
|
||||||
|
{"fromfile", array_fromfile},
|
||||||
|
{"fromlist", array_fromlist},
|
||||||
|
{"fromstring", array_fromstring},
|
||||||
/* {"index", array_index},*/
|
/* {"index", array_index},*/
|
||||||
{"insert", array_insert},
|
{"insert", array_insert},
|
||||||
/* {"sort", array_sort},*/
|
{"read", array_fromfile},
|
||||||
/* {"remove", array_remove},*/
|
/* {"remove", array_remove},*/
|
||||||
/* {"reverse", array_reverse},*/
|
{"reverse", array_reverse},
|
||||||
{"read", array_read},
|
/* {"sort", array_sort},*/
|
||||||
{"write", array_write},
|
{"tofile", array_tofile},
|
||||||
{"fromlist", array_fromlist},
|
|
||||||
{"tolist", array_tolist},
|
{"tolist", array_tolist},
|
||||||
{"fromstring", array_fromstring},
|
|
||||||
{"tostring", array_tostring},
|
{"tostring", array_tostring},
|
||||||
|
{"write", array_tofile},
|
||||||
{NULL, NULL} /* sentinel */
|
{NULL, NULL} /* sentinel */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -62,12 +62,12 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
|
||||||
#include "patchlevel.h"
|
#include "patchlevel.h"
|
||||||
|
|
||||||
#define VERSION "0.9.%d (%s)"
|
#define VERSION "0.9.%d++ (%s)"
|
||||||
|
|
||||||
#ifdef __DATE__
|
#ifdef __DATE__
|
||||||
#define DATE __DATE__
|
#define DATE __DATE__
|
||||||
#else
|
#else
|
||||||
#define DATE ">= 29 Jul 1993"
|
#define DATE ">= 3 Nov 1993"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
char version[80];
|
char version[80];
|
||||||
|
|
|
@ -67,9 +67,23 @@ nis_foreach (instatus, inkey, inkeylen, inval, invallen, indata)
|
||||||
object *indata;
|
object *indata;
|
||||||
{
|
{
|
||||||
if (instatus == YP_TRUE) {
|
if (instatus == YP_TRUE) {
|
||||||
inkey[inkeylen]=0;
|
object *key = newsizedstringobject(inkey, inkeylen);
|
||||||
inval[invallen]=0;
|
object *val = newsizedstringobject(inval, invallen);
|
||||||
dictinsert (indata, inkey, newstringobject (inval));
|
int err;
|
||||||
|
if (key == NULL || val == NULL) {
|
||||||
|
/* XXX error -- don't know how to handle */
|
||||||
|
err_clear();
|
||||||
|
XDECREF(key);
|
||||||
|
XDECREF(val);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
err = mappinginsert(indata, key, val);
|
||||||
|
DECREF(key);
|
||||||
|
DECREF(val);
|
||||||
|
if (err != 0) {
|
||||||
|
err_clear();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -82,18 +96,18 @@ nis_match (self, args)
|
||||||
{
|
{
|
||||||
char *match;
|
char *match;
|
||||||
char *domain;
|
char *domain;
|
||||||
int len;
|
int keylen, len;
|
||||||
char *key, *map;
|
char *key, *map;
|
||||||
int err;
|
int err;
|
||||||
object *res;
|
object *res;
|
||||||
|
|
||||||
if (!getargs(args, "(ss)", &key, &map))
|
if (!getargs(args, "(s#s)", &key, &keylen, &map))
|
||||||
return NULL;
|
return NULL;
|
||||||
if ((err = yp_get_default_domain(&domain)) != 0)
|
if ((err = yp_get_default_domain(&domain)) != 0)
|
||||||
return nis_error(err);
|
return nis_error(err);
|
||||||
BGN_SAVE
|
BGN_SAVE
|
||||||
map = nis_mapname (map);
|
map = nis_mapname (map);
|
||||||
err = yp_match (domain, map, key, strlen (key), &match, &len);
|
err = yp_match (domain, map, key, keylen, &match, &len);
|
||||||
END_SAVE
|
END_SAVE
|
||||||
if (err != 0)
|
if (err != 0)
|
||||||
return nis_error(err);
|
return nis_error(err);
|
||||||
|
|
|
@ -154,7 +154,12 @@ static void set_key(r, key)
|
||||||
rotorobject *r;
|
rotorobject *r;
|
||||||
char *key;
|
char *key;
|
||||||
{
|
{
|
||||||
|
#ifdef BUGGY_CODE_BW_COMPAT
|
||||||
|
/* See comments below */
|
||||||
int k1=995, k2=576, k3=767, k4=671, k5=463;
|
int k1=995, k2=576, k3=767, k4=671, k5=463;
|
||||||
|
#else
|
||||||
|
unsigned long k1=995, k2=576, k3=767, k4=671, k5=463;
|
||||||
|
#endif
|
||||||
int i;
|
int i;
|
||||||
int len=strlen(key);
|
int len=strlen(key);
|
||||||
for (i=0;i<len;i++) {
|
for (i=0;i<len;i++) {
|
||||||
|
|
|
@ -67,7 +67,7 @@ builtin_apply(self, args)
|
||||||
}
|
}
|
||||||
|
|
||||||
static object *
|
static object *
|
||||||
builtin_bagof(self, args)
|
builtin_filter(self, args)
|
||||||
object *self;
|
object *self;
|
||||||
object *args;
|
object *args;
|
||||||
{
|
{
|
||||||
|
@ -101,7 +101,7 @@ builtin_bagof(self, args)
|
||||||
|
|
||||||
if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
|
if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
|
||||||
err_setstr(TypeError,
|
err_setstr(TypeError,
|
||||||
"argument 2 to bagof() must be a sequence type");
|
"argument 2 to filter() must be a sequence type");
|
||||||
goto Fail_2;
|
goto Fail_2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1121,7 +1121,6 @@ builtin_type(self, v)
|
||||||
static struct methodlist builtin_methods[] = {
|
static struct methodlist builtin_methods[] = {
|
||||||
{"abs", builtin_abs},
|
{"abs", builtin_abs},
|
||||||
{"apply", builtin_apply},
|
{"apply", builtin_apply},
|
||||||
{"bagof", builtin_bagof},
|
|
||||||
{"chr", builtin_chr},
|
{"chr", builtin_chr},
|
||||||
{"cmp", builtin_cmp},
|
{"cmp", builtin_cmp},
|
||||||
{"coerce", builtin_coerce},
|
{"coerce", builtin_coerce},
|
||||||
|
@ -1130,6 +1129,7 @@ static struct methodlist builtin_methods[] = {
|
||||||
{"divmod", builtin_divmod},
|
{"divmod", builtin_divmod},
|
||||||
{"eval", builtin_eval},
|
{"eval", builtin_eval},
|
||||||
{"execfile", builtin_execfile},
|
{"execfile", builtin_execfile},
|
||||||
|
{"filter", builtin_filter},
|
||||||
{"float", builtin_float},
|
{"float", builtin_float},
|
||||||
{"getattr", builtin_getattr},
|
{"getattr", builtin_getattr},
|
||||||
{"hasattr", builtin_hasattr},
|
{"hasattr", builtin_hasattr},
|
||||||
|
@ -1271,7 +1271,7 @@ coerce(pv, pw)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Helper for bagof(): filter a tuple through a function */
|
/* Helper for filter(): filter a tuple through a function */
|
||||||
|
|
||||||
static object *
|
static object *
|
||||||
filtertuple(func, tuple)
|
filtertuple(func, tuple)
|
||||||
|
@ -1324,7 +1324,7 @@ Fail_1:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Helper for bagof(): filter a string through a function */
|
/* Helper for filter(): filter a string through a function */
|
||||||
|
|
||||||
static object *
|
static object *
|
||||||
filterstring(func, strobj)
|
filterstring(func, strobj)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue