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,
20 def decoder(code, r, n):
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
)
37 /* XXX: should we use U (unsigned int) for argument r */
38 if (PyArg_ParseTuple(args
, "s#ii", (char **) &code
, &lcode
, (int *) &r
, &n
)) {
44 if (! (data
= (unsigned char *) malloc(lcode
)) )
47 for (i
=0; i
<lcode
; i
++) {
49 data
[i
] = x
^ ( r
>> 8);
50 r
= (x
+ r
) * C1
+ C2
;
53 /* convert result to string stripping first n chars */
54 result
= PyString_FromStringAndSize((const char *)data
+ n
, lcode
- n
);
63 def encoder(data, r, random):
66 code = array.array("B")
67 for x in array.array("B", random+data):
68 code.append(x ^ (r >> 8))
69 r = ((code[-1] + r) * c1 + c2) & 0xffff;
70 return code.tostring()
73 static PyObject
*py_encoder(PyObject
*self
, PyObject
*args
)
76 unsigned char *random
;
80 /* XXX: should we use U (unsigned int) for argument r */
81 if (PyArg_ParseTuple(args
, "s#is#", (char **) &data
, &ldata
, (int *) &r
, (char **) &random
, &lrandom
)) {
86 if (! (code
= (unsigned char *) malloc(ldata
+ lrandom
)) )
89 for (i
=0; i
<lrandom
; i
++) {
90 code
[i
] = random
[i
] ^ ( r
>> 8);
91 r
= (code
[i
] + r
) * C1
+ C2
;
94 for (i
=0; i
<ldata
; i
++) {
95 code
[i
+lrandom
] = data
[i
] ^ ( r
>> 8);
96 r
= (code
[i
+lrandom
] + r
) * C1
+ C2
;
99 result
= PyString_FromStringAndSize((const char *)code
, ldata
+ lrandom
);
109 /* exported methods */
111 static PyMethodDef t1code_methods
[] = {
112 {"decoder", py_decoder
, METH_VARARGS
},
113 {"encoder", py_encoder
, METH_VARARGS
},
117 void init_t1code(void) {
118 (void) Py_InitModule("_t1code", t1code_methods
);