- ws cleanup
[PyX/mjg.git] / pyx / font / _t1code.c
blob10837f0e5d576ff0578d2c1e0a1cc70b6158968e
1 /* t1code.c: Copyright 2005 Jörg Lehmann
2 * This program is distributed in the hope that it will be useful,
3 * but WITHOUT ANY WARRANTY; without even the implied warranty of
4 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5 * GNU General Public License for more details.
7 * You should have received a copy of the GNU General Public License
8 * along with this program; if not, write to the Free Software
9 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
10 * USA.
13 #include <Python.h>
14 #include <stdlib.h>
16 #define C1 52845
17 #define C2 22719
19 /*
20 def decoder(code, r, n):
21 c1 = 52845
22 c2 = 22719
23 data = array.array("B")
24 for x in array.array("B", code):
25 data.append(x ^ (r >> 8))
26 r = ((x + r) * c1 + c2) & 0xffff
27 return data.tostring()[n:]
31 static PyObject *py_decoder(PyObject *self, PyObject *args)
33 unsigned char *code;
34 int lcode, r, n;
36 if (PyArg_ParseTuple(args, "s#ii", (char **) &code, &lcode, &r, &n)) {
37 unsigned char *data;
38 int i;
39 unsigned char x;
40 PyObject *result;
42 if (! (data = (unsigned char *) malloc(lcode)) )
43 return NULL;
45 for (i=0; i<lcode; i++) {
46 x = code[i];
47 data[i] = x ^ ( r >> 8);
48 r = ((x + r) * C1 + C2) & 0xFFFF;
51 /* convert result to string stripping first n chars */
52 result = PyString_FromStringAndSize((const char *)data + n, lcode - n);
53 free(data);
54 return result;
56 else return NULL;
61 def encoder(data, r, random):
62 c1 = 52845
63 c2 = 22719
64 code = array.array("B")
65 for x in array.array("B", random+data):
66 code.append(x ^ (r >> 8))
67 r = ((code[-1] + r) * c1 + c2) & 0xffff;
68 return code.tostring()
71 static PyObject *py_encoder(PyObject *self, PyObject *args)
73 unsigned char *data;
74 unsigned char *random;
75 int ldata, lrandom, r;
77 if (PyArg_ParseTuple(args, "s#is#", (char **) &data, &ldata, &r, (char **) &random, &lrandom)) {
78 unsigned char *code;
79 int i;
80 PyObject *result;
82 if (! (code = (unsigned char *) malloc(ldata + lrandom)) )
83 return NULL;
85 for (i=0; i<lrandom; i++) {
86 code[i] = random[i] ^ ( r >> 8);
87 r = ((code[i] + r) * C1 + C2) & 0xFFFF;
90 for (i=0; i<ldata; i++) {
91 code[i+lrandom] = data[i] ^ ( r >> 8);
92 r = ((code[i+lrandom] + r) * C1 + C2) & 0xFFFF;
95 result = PyString_FromStringAndSize((const char *)code, ldata + lrandom);
96 free(code);
97 return result;
99 else return NULL;
105 /* exported methods */
107 static PyMethodDef t1code_methods[] = {
108 {"decoder", py_decoder, METH_VARARGS},
109 {"encoder", py_encoder, METH_VARARGS},
110 {NULL, NULL}
113 void init_t1code(void) {
114 (void) Py_InitModule("_t1code", t1code_methods);