From ed7253ca507ab2755400b3aab612e18efc7249e2 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 23 Jul 1996 18:12:39 +0000 Subject: [PATCH] Added 3rd optional argument to translate(), a string of characters to delete. Added maketrans(), a utility to create a translation table. --- Lib/string.py | 32 +++++++++++++------ Lib/stringold.py | 32 +++++++++++++------ Modules/stropmodule.c | 71 ++++++++++++++++++++++++++++++++++++------- 3 files changed, 106 insertions(+), 29 deletions(-) diff --git a/Lib/string.py b/Lib/string.py index edf24a4e2f..afa0787eca 100644 --- a/Lib/string.py +++ b/Lib/string.py @@ -254,23 +254,37 @@ def expandtabs(s, tabsize=8): return res + line # Character translation through look-up table. -def translate(s, table): - if type(table) != type('') or len(table) != 256: - raise TypeError, "translation table must be 256-char string" - res = "" - for c in s: - res = res + table[ord(c)] - return res +def translate(s, table, deletions=""): + if type(table) != type('') or len(table) != 256: + raise TypeError, "translation table must be 256 characters long" + res = "" + for c in s: + if c not in deletions: + res = res + table[ord(c)] + return res # Capitalize a string, e.g. "aBc dEf" -> "Abc def". def capitalize(s): - return upper(s[:1]) + lower(s[1:]) + return upper(s[:1]) + lower(s[1:]) # Capitalize the words in a string, e.g. " aBc dEf " -> "Abc Def". # See also regsub.capwords(). def capwords(s): - return join(map(capitalize, split(s))) + return join(map(capitalize, split(s))) +# Construct a translation string +_idmapL = None +def maketrans(fromstr, tostr): + if len(fromstr) != len(tostr): + raise ValueError, "maketrans arguments must have same length" + global _idmapL + if not _idmapL: + _idmapL = map(None, _idmap) + L = _idmapL[:] + fromstr = map(ord, fromstr) + for i in range(len(fromstr)): + L[fromstr[i]] = tostr[i] + return joinfields(L, "") # Try importing optional built-in module "strop" -- if it exists, # it redefines some string operations that are 100-1000 times faster. diff --git a/Lib/stringold.py b/Lib/stringold.py index edf24a4e2f..afa0787eca 100644 --- a/Lib/stringold.py +++ b/Lib/stringold.py @@ -254,23 +254,37 @@ def expandtabs(s, tabsize=8): return res + line # Character translation through look-up table. -def translate(s, table): - if type(table) != type('') or len(table) != 256: - raise TypeError, "translation table must be 256-char string" - res = "" - for c in s: - res = res + table[ord(c)] - return res +def translate(s, table, deletions=""): + if type(table) != type('') or len(table) != 256: + raise TypeError, "translation table must be 256 characters long" + res = "" + for c in s: + if c not in deletions: + res = res + table[ord(c)] + return res # Capitalize a string, e.g. "aBc dEf" -> "Abc def". def capitalize(s): - return upper(s[:1]) + lower(s[1:]) + return upper(s[:1]) + lower(s[1:]) # Capitalize the words in a string, e.g. " aBc dEf " -> "Abc Def". # See also regsub.capwords(). def capwords(s): - return join(map(capitalize, split(s))) + return join(map(capitalize, split(s))) +# Construct a translation string +_idmapL = None +def maketrans(fromstr, tostr): + if len(fromstr) != len(tostr): + raise ValueError, "maketrans arguments must have same length" + global _idmapL + if not _idmapL: + _idmapL = map(None, _idmap) + L = _idmapL[:] + fromstr = map(ord, fromstr) + for i in range(len(fromstr)): + L[fromstr[i]] = tostr[i] + return joinfields(L, "") # Try importing optional built-in module "strop" -- if it exists, # it redefines some string operations that are 100-1000 times faster. diff --git a/Modules/stropmodule.c b/Modules/stropmodule.c index 069d5f4447..7e44e0ee63 100644 --- a/Modules/stropmodule.c +++ b/Modules/stropmodule.c @@ -547,30 +547,78 @@ strop_atof(self, args) } +static PyObject * +strop_maketrans(self, args) + PyObject *self; /* Not used */ + PyObject *args; +{ + unsigned char c[256], *from=NULL, *to=NULL; + int i, fromlen=0, tolen=0; + + if (PyTuple_Size(args)!=0) { + if (!PyArg_ParseTuple(args, "s#s#", &from, &fromlen, + &to, &tolen)) + return NULL; + } + + if (fromlen!=tolen) { + PyErr_SetString(ValueError, + "maketrans arguments must have same length"); + return NULL; + } + for(i=0; i<256; i++) + c[i]=(unsigned char)i; + for(i=0; i 0 &&_PyString_Resize(&result, output-output_start)) + return NULL; + } else { + /* If no deletions are required, use a faster loop */ + for (i = 0; i < inlen; i++) { + int c = Py_CHARMASK(*input++); + *output++ = (char)trans_table[c]; + } } return result; } @@ -592,6 +640,7 @@ static struct methodlist strop_methods[] = { {"splitfields", strop_splitfields, 1}, {"strip", strop_strip}, {"swapcase", strop_swapcase}, + {"maketrans", strop_maketrans, 1}, {"translate", strop_translate, 1}, {"upper", strop_upper}, {NULL, NULL} /* sentinel */ -- 2.50.1