summaryrefslogtreecommitdiff
path: root/src/SWIG/_rand.i
diff options
context:
space:
mode:
Diffstat (limited to 'src/SWIG/_rand.i')
-rw-r--r--src/SWIG/_rand.i150
1 files changed, 150 insertions, 0 deletions
diff --git a/src/SWIG/_rand.i b/src/SWIG/_rand.i
new file mode 100644
index 0000000..01ab4ef
--- /dev/null
+++ b/src/SWIG/_rand.i
@@ -0,0 +1,150 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* Copyright (c) 1999-2004 Ng Pheng Siong. All rights reserved.
+ * Copyright (c) 2009-2010 Heikki Toivonen. All rights reserved.
+*/
+/* $Id: _rand.i 721 2010-02-13 06:30:33Z heikki $ */
+
+%module _rand
+
+%rename(rand_file_name) RAND_file_name;
+extern const char *RAND_file_name(char *, size_t );
+%rename(rand_load_file) RAND_load_file;
+extern int RAND_load_file(const char *, long);
+%rename(rand_save_file) RAND_write_file;
+extern int RAND_write_file(const char *);
+%rename(rand_poll) RAND_poll;
+extern int RAND_poll(void);
+%rename(rand_status) RAND_status;
+extern int RAND_status(void);
+%rename(rand_cleanup) RAND_cleanup;
+extern void RAND_cleanup(void);
+
+%warnfilter(454) _rand_err;
+%inline %{
+static PyObject *_rand_err;
+
+void rand_init(PyObject *rand_err) {
+ Py_INCREF(rand_err);
+ _rand_err = rand_err;
+}
+
+PyObject *rand_seed(PyObject *seed) {
+ const void *buf;
+ int len = 0;
+
+ m2_PyObject_AsReadBufferInt(seed, &buf, &len);
+
+ RAND_seed(buf, len);
+ Py_RETURN_NONE;
+}
+
+PyObject *rand_add(PyObject *blob, double entropy) {
+ const void *buf;
+ int len = 0;
+
+ m2_PyObject_AsReadBufferInt(blob, &buf, &len);
+
+ RAND_add(buf, len, entropy);
+ Py_RETURN_NONE;
+}
+
+PyObject *rand_bytes(int n) {
+ void *blob;
+ int ret;
+ PyObject *obj;
+
+ if (!(blob = PyMem_Malloc(n))) {
+ PyErr_SetString(PyExc_MemoryError,
+ "Insufficient memory for rand_bytes.");
+ return NULL;
+ }
+ if ((ret = RAND_bytes(blob, n)) == 1) {
+ obj = PyBytes_FromStringAndSize(blob, n);
+ PyMem_Free(blob);
+ return obj;
+ } else if (ret == 0) {
+ PyErr_SetString(_rand_err, "Not enough randomness.");
+ PyMem_Free(blob);
+ return NULL;
+ } else if (ret == -1) {
+ PyErr_SetString(_rand_err,
+ "Not supported by the current RAND method.");
+ PyMem_Free(blob);
+ return NULL;
+ } else {
+ PyMem_Free(blob);
+ m2_PyErr_Msg(_rand_err);
+ return NULL;
+ }
+}
+
+PyObject *rand_pseudo_bytes(int n) {
+ int ret;
+ unsigned char *blob;
+ PyObject *tuple;
+
+ if (!(blob=(unsigned char *)PyMem_Malloc(n))) {
+ PyErr_SetString(PyExc_MemoryError, "Insufficient memory for rand_pseudo_bytes.");
+ return NULL;
+ }
+ if (!(tuple=PyTuple_New(2))) {
+ PyErr_SetString(PyExc_RuntimeError, "PyTuple_New() fails");
+ PyMem_Free(blob);
+ return NULL;
+ }
+ ret = RAND_pseudo_bytes(blob, n);
+ if (ret == -1) {
+ PyMem_Free(blob);
+ Py_DECREF(tuple);
+ PyErr_SetString(_rand_err,
+ "Function RAND_pseudo_bytes not supported by the current RAND method.");
+ return NULL;
+ } else {
+ PyTuple_SET_ITEM(tuple, 0, PyBytes_FromStringAndSize((char*)blob, n));
+
+ PyMem_Free(blob);
+ PyTuple_SET_ITEM(tuple, 1, PyLong_FromLong((long)ret));
+ return tuple;
+ }
+}
+
+PyObject *rand_file_name(void) {
+ PyObject *obj;
+ char *str;
+ if ((obj = PyBytes_FromStringAndSize(NULL, BUFSIZ))==NULL) {
+ PyErr_SetString(PyExc_MemoryError, "rand_file_name");
+ return NULL;
+ }
+ str=PyBytes_AS_STRING(obj);
+ if (RAND_file_name(str, BUFSIZ)==NULL) {
+ PyErr_SetString(PyExc_RuntimeError, "rand_file_name");
+ return NULL;
+ }
+ if (_PyBytes_Resize(&obj, (Py_ssize_t)strlen(str))!=0)
+ return NULL; /* mem exception set by _PyBytes_Resize */
+ return obj;
+}
+
+void rand_screen(void) {
+#ifdef _WIN32
+ RAND_screen();
+#endif
+}
+
+int rand_win32_event(unsigned int imsg, int wparam, long lparam) {
+#ifdef _WIN32
+ return RAND_event(imsg, wparam, lparam);
+#else
+ return 0;
+#endif
+}
+%}
+
+/*
+2004-04-05, ngps: Still missing:
+ RAND_egd
+ RAND_egd_bytes
+ RAND_query_egd_bytes
+*/
+
+