summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1995-06-14 22:31:38 (GMT)
committerGuido van Rossum <guido@python.org>1995-06-14 22:31:38 (GMT)
commit31affb2e42eb49d798469777ef3313d5af0c6780 (patch)
treec9fe919a5b3bfe2754fda9c87a13563298e5f84a
parent30b6b2b0328a2dd26bec81b76e9fe68710937562 (diff)
downloadcpython-31affb2e42eb49d798469777ef3313d5af0c6780.zip
cpython-31affb2e42eb49d798469777ef3313d5af0c6780.tar.gz
cpython-31affb2e42eb49d798469777ef3313d5af0c6780.tar.bz2
new modules soundex.c and environment.c
-rw-r--r--Modules/Setup.in7
-rw-r--r--Modules/environment.c104
-rw-r--r--Modules/soundex.c141
3 files changed, 252 insertions, 0 deletions
diff --git a/Modules/Setup.in b/Modules/Setup.in
index b11c192..af9b1dc 100644
--- a/Modules/Setup.in
+++ b/Modules/Setup.in
@@ -272,5 +272,12 @@ rotor rotormodule.c # enigma-inspired encryption
#gdbm gdbmmodule.c -I/usr/local/include -L/usr/local/lib -lgdbm
+# Andy Bensky's "environment" module (contains putenv())
+#environment environment.c
+
+# David Wayne Williams' soundex module
+#soundex soundex.c
+
+
# Example -- included for reference only:
# xx xxmodule.c
diff --git a/Modules/environment.c b/Modules/environment.c
new file mode 100644
index 0000000..977e917
--- /dev/null
+++ b/Modules/environment.c
@@ -0,0 +1,104 @@
+/*
+# Copyright 1995, InfoSeek Corporation
+# All rights reserved.
+# Written by Andy Bensky
+#
+# Permission to use, copy, modify, and distribute this Python software
+# and its associated documentation for any purpose (subject to the
+# restriction in the following sentence) without fee is hereby granted,
+# provided that the above copyright notice appears in all copies, and
+# that both that copyright notice and this permission notice appear in
+# supporting documentation, and that the name of InfoSeek not be used in
+# advertising or publicity pertaining to distribution of the software
+# without specific, prior written permission. This permission is
+# explicitly restricted to the copying and modification of the software
+# to remain in Python, compiled Python, or other languages (such as C)
+# wherein the modified or derived code is exclusively imported into a
+# Python module.
+#
+# INFOSEEK CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+# SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+# FITNESS. IN NO EVENT SHALL INFOSEEK CORPORATION BE LIABLE FOR ANY
+# DIRECT, SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
+# AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+# OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE,
+# EVEN IF INFOSEEK SHALL HAVE BEEN MADE AWARE OF THE POSSIBILITY OF SUCH
+# DAMAGES.
+*/
+
+/* Hooks to call the Unix putenv() to modify the environment
+*/
+
+#include "allobjects.h"
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+
+/* Error conditions that can be raised */
+
+/* Headers for functions accessible from Python as module methods */
+static object *put_environ( object *self, object *args );
+
+static struct methodlist environ_methods[] = {
+ {"putenv", put_environ},
+ {NULL, NULL}
+};
+
+
+/*
+ * Name: initenvironment
+ * Description:
+ * Initialzation function that Python will use to establish callbacks to
+ * the methods of this module.
+ *
+ * Returns:
+ * void -
+ *
+ * Notes:
+ */
+void initenvironment()
+{
+ object *m, *d;
+
+ m = initmodule("environment", environ_methods);
+ d = getmoduledict(m);
+}
+
+/*
+ * Name: put_environ
+ * Description:
+ * accepts 2 string objects as arguments and forms a string of the
+ * form string1=string2 that can be passed to the putenv() system call.
+ *
+ * Returns:
+ * None object if successfull, otherwise raises a SystemError exception
+ *
+ *
+ * Notes:
+ */
+static object *put_environ( object *self, object *args )
+{
+ char *string1, *string2;
+ char *set_str;
+ object *return_object = None;
+
+ if (args && getargs(args, "(ss)", &string1, &string2))
+ {
+ set_str = malloc(strlen(string1) + strlen(string2) + 2);
+ assert( set_str );
+ (void) sprintf(set_str, "%s=%s", string1, string2);
+ if ( putenv( set_str ) )
+ {
+ err_setstr(SystemError, "Error in system putenv call.");
+ return_object = 0;
+ }
+ }
+ else
+ {
+ err_setstr(TypeError, "Usage: putenv(string1, string2)");
+ return_object = 0;
+ }
+
+ return( return_object );
+}
diff --git a/Modules/soundex.c b/Modules/soundex.c
new file mode 100644
index 0000000..b481e1c
--- /dev/null
+++ b/Modules/soundex.c
@@ -0,0 +1,141 @@
+/*
+ $Header$
+
+ Perform soundex comparisons on strings.
+
+ Soundex is an algorithm that hashes English strings into numerical value.
+ Strings that sound the same are hashed to the same value. This allows
+ for non-literal string matching.
+
+ From: David Wayne Williams <dwwillia@iucf.indiana.edu>
+*/
+
+#include <string.h>
+#include <ctype.h>
+#include "Python.h"
+
+void soundex_hash(char *str, char *result)
+{
+ char *sptr = str; /* pointer into str */
+ char *rptr = result; /* pointer into result */
+
+ if(*str == NULL)
+ {
+ strcpy(result,"000000");
+ return;
+ }
+
+ /* Preserve the first character of the input string.
+ */
+ *(rptr++) = toupper(*(sptr++));
+
+ /* Translate the rest of the input string into result. The following
+ transformations are used:
+
+ 1) All vowles, W, and H, are skipped.
+
+ 2) BFPV = 1
+ CGJKQSXZ = 2
+ DT = 3
+ L = 4
+ MN = 5
+
+ 3) Only translate the first of adjacent equal translations. I.E.
+ remove duplicate digits.
+ */
+
+ for(;(rptr - result) < 6 && *sptr != NULL;sptr++)
+ {
+ switch (toupper(*sptr))
+ {
+ case 'W':
+ case 'H':
+ case 'A':
+ case 'I':
+ case 'O':
+ case 'U':
+ case 'Y':
+ break;
+ case 'B':
+ case 'F':
+ case 'P':
+ case 'V':
+ if(*(rptr - 1) != '1')
+ *(rptr++) = '1';
+ break;
+ case 'C':
+ case 'G':
+ case 'J':
+ case 'K':
+ case 'Q':
+ case 'S':
+ case 'X':
+ case 'Z':
+ if(*(rptr - 1) != '2')
+ *(rptr++) = '2';
+ break;
+ case 'D':
+ case 'T':
+ if(*(rptr - 1) != '3')
+ *(rptr++) = '3';
+ break;
+ case 'L':
+ if(*(rptr - 1) != '4')
+ *(rptr++) = '4';
+ break;
+ case 'M':
+ case 'N':
+ if(*(rptr - 1) != '5')
+ *(rptr++) = '5';
+ break;
+ default:
+ break;
+ }
+ }
+
+ /* Pad 0's on right side of string out to 6 characters.
+ */
+ for(; rptr < result + 6; rptr++)
+ *rptr = '0';
+
+ /* Terminate the result string.
+ */
+ *(result + 6) = NULL;
+}
+
+
+static PyObject *
+sound_similar(PyObject *self, PyObject *args)
+{
+ char *str1, *str2;
+ int return_value;
+ char res1[7], res2[7];
+
+ if(!PyArg_ParseTuple(args, "ss", &str1, &str2))
+ return NULL;
+
+ soundex_hash(str1, res1);
+ soundex_hash(str2, res2);
+
+ if(!strcmp(res1,res2))
+ return Py_BuildValue("i",1);
+ else
+ return Py_BuildValue("i",0);
+}
+
+/* Python Method Table.
+ */
+static PyMethodDef SoundexMethods[] =
+{
+ {"sound_similar", sound_similar, 1},
+ {NULL, NULL } /* sentinel */
+};
+
+
+/* Register the method table.
+ */
+void
+initsoundex()
+{
+ (void) Py_InitModule("soundex",SoundexMethods);
+}