oops, 16bit of course
[PyX/mjg.git] / pyx / font / _t1code.c
blob1c90e47908b2a838da6cc6cf9887ae80f706207d
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>
15 #include <stdint.h>
17 #define C1 52845
18 #define C2 22719
20 /*
21 def decoder(code, r, n):
22 c1 = 52845
23 c2 = 22719
24 data = array.array("B")
25 for x in array.array("B", code):
26 data.append(x ^ (r >> 8))
27 r = ((x + r) * c1 + c2) & 0xffff
28 return data.tostring()[n:]
32 static PyObject *py_decoder(PyObject *self, PyObject *args)
34 unsigned char *code;
35 int lcode, n;
36 uint16_t r;
38 /* XXX: should we use U (unsigned int) for argument r */
39 if (PyArg_ParseTuple(args, "s#ii", (char **) &code, &lcode, (int *) &r, &n)) {
40 unsigned char *data;
41 int i;
42 unsigned char x;
43 PyObject *result;
45 if (! (data = (unsigned char *) malloc(lcode)) )
46 return NULL;
48 for (i=0; i<lcode; i++) {
49 x = code[i];
50 data[i] = x ^ ( r >> 8);
51 r = (x + r) * C1 + C2;
54 /* convert result to string stripping first n chars */
55 result = PyString_FromStringAndSize((const char *)data + n, lcode - n);
56 free(data);
57 return result;
59 else return NULL;
64 def encoder(data, r, random):
65 c1 = 52845
66 c2 = 22719
67 code = array.array("B")
68 for x in array.array("B", random+data):
69 code.append(x ^ (r >> 8))
70 r = ((code[-1] + r) * c1 + c2) & 0xffff;
71 return code.tostring()
74 static PyObject *py_encoder(PyObject *self, PyObject *args)
76 unsigned char *data;
77 unsigned char *random;
78 int ldata, lrandom;
79 uint16_t r;
81 /* XXX: should we use U (unsigned int) for argument r */
82 if (PyArg_ParseTuple(args, "s#is#", (char **) &data, &ldata, (int *) &r, (char **) &random, &lrandom)) {
83 unsigned char *code;
84 int i;
85 PyObject *result;
87 if (! (code = (unsigned char *) malloc(ldata + lrandom)) )
88 return NULL;
90 for (i=0; i<lrandom; i++) {
91 code[i] = random[i] ^ ( r >> 8);
92 r = (code[i] + r) * C1 + C2;
95 for (i=0; i<ldata; i++) {
96 code[i+lrandom] = data[i] ^ ( r >> 8);
97 r = (code[i+lrandom] + r) * C1 + C2;
100 result = PyString_FromStringAndSize((const char *)code, ldata + lrandom);
101 free(code);
102 return result;
104 else return NULL;
110 /* exported methods */
112 static PyMethodDef t1code_methods[] = {
113 {"decoder", py_decoder, METH_VARARGS},
114 {"encoder", py_encoder, METH_VARARGS},
115 {NULL, NULL}
118 void init_t1code(void) {
119 (void) Py_InitModule("_t1code", t1code_methods);