file routines

This commit is contained in:
Elliot Nunn 2018-09-19 22:37:26 +08:00
parent a8344ada4f
commit e46b7c4215
1 changed files with 113 additions and 16 deletions

129
main.c
View File

@ -17,6 +17,7 @@
static const char NAME_HFSVOL[] = "hfsvol";
static const char NAME_HFSDIR[] = "hfsdir";
static const char NAME_HFSFILE[] = "hfsfile";
static PyObject *wrap_mount(PyObject *self, PyObject *args)
{
@ -167,6 +168,102 @@ static PyObject *wrap_closedir(PyObject *self, PyObject *args)
return Py_None;
}
static PyObject *wrap_create(PyObject *self, PyObject *args)
{
hfsvol *arg_vol; PyObject *arg_vol_c; char *arg_path;
char *arg_type; Py_ssize_t arg_type_len;
char *arg_creator; Py_ssize_t arg_creator_len;
if(!PyArg_ParseTuple(args, "Oyy#y#", &arg_vol_c, &arg_path, &arg_type, &arg_type_len, &arg_creator, &arg_creator_len)) return NULL;
if(arg_type_len != 4 || arg_creator_len != 4) return NULL;
if(arg_vol_c == Py_None) arg_vol = NULL;
else if(!(arg_vol = PyCapsule_GetPointer(arg_vol_c, NAME_HFSVOL))) return NULL;
return PyCapsule_New((void *)hfs_create(arg_vol, arg_path, arg_type, arg_creator), NAME_HFSFILE, NULL);
}
static PyObject *wrap_open(PyObject *self, PyObject *args)
{
hfsvol *arg_vol; PyObject *arg_vol_c; char *arg_path;
if(!PyArg_ParseTuple(args, "Oy", &arg_vol_c, &arg_path)) return NULL;
if(arg_vol_c == Py_None) arg_vol = NULL;
else if(!(arg_vol = PyCapsule_GetPointer(arg_vol_c, NAME_HFSVOL))) return NULL;
return PyCapsule_New((void *)hfs_open(arg_vol, arg_path), NAME_HFSFILE, NULL);
}
static PyObject *wrap_setfork(PyObject *self, PyObject *args)
{
hfsvol *arg_file; PyObject *arg_file_c; int arg_fork;
if(!PyArg_ParseTuple(args, "Oi", &arg_file_c, &arg_fork)) return NULL;
if(arg_file_c == Py_None) arg_file = NULL;
else if(!(arg_file = PyCapsule_GetPointer(arg_file_c, NAME_HFSFILE))) return NULL;
if(hfs_setfork(arg_file, arg_fork)) return NULL;
return Py_None;
}
static PyObject *wrap_getfork(PyObject *self, PyObject *args)
{
hfsvol *arg_file; PyObject *arg_file_c;
if(!PyArg_ParseTuple(args, "O", &arg_file_c, &arg_fork)) return NULL;
if(arg_file_c == Py_None) arg_file = NULL;
else if(!(arg_file = PyCapsule_GetPointer(arg_file_c, NAME_HFSFILE))) return NULL;
return Py_BuildValue("i", hfs_getfork(arg_file));
}
static PyObject *wrap_read(PyObject *self, PyObject *args) // pass in a bytearray and get it shrunk!
{
hfsvol *arg_file; PyObject *arg_file_c; PyObject *arg_bytearray;
if(!PyArg_ParseTuple(args, "OY", &arg_file_c, &arg_bytearray)) return NULL;
if(arg_file_c == Py_None) arg_file = NULL;
else if(!(arg_file = PyCapsule_GetPointer(arg_file_c, NAME_HFSFILE))) return NULL;
long bytesread = hfs_read(arg_file, PyByteArray_AsString(arg_bytearray), PyByteArray_Size(arg_bytearray));
if(bytesread == -1) return NULL;
PyByteArray_Resize(arg_bytearray, bytesread);
return Py_None;
}
static PyObject *wrap_write(PyObject *self, PyObject *args) // pass in a bytearray and get it shrunk!
{
hfsvol *arg_file; PyObject *arg_file_c; PyObject *arg_bytes; Py_ssize_t arg_bytes_len;
if(!PyArg_ParseTuple(args, "Oy#", &arg_file_c, &arg_bytes, &arg_bytes_len)) return NULL;
if(arg_file_c == Py_None) arg_file = NULL;
else if(!(arg_file = PyCapsule_GetPointer(arg_file_c, NAME_HFSFILE))) return NULL;
long byteswritten = hfs_write(arg_file, arg_bytes, arg_bytes_len);
if(byteswritten == -1) return NULL;
return Py_BuildValue("l", byteswritten);
}
static PyObject *wrap_truncate(PyObject *self, PyObject *args) // pass in a bytearray and get it shrunk!
{
hfsvol *arg_file; PyObject *arg_file_c; unsigned long *arg_len;
if(!PyArg_ParseTuple(args, "Ok", &arg_file_c, &arg_len)) return NULL;
if(arg_file_c == Py_None) arg_file = NULL;
else if(!(arg_file = PyCapsule_GetPointer(arg_file_c, NAME_HFSFILE))) return NULL;
if(hfs_truncate(arg_file, arg_len)) return NULL;
return Py_None;
}
static PyObject *wrap_seek(PyObject *self, PyObject *args) // pass in a bytearray and get it shrunk!
{
hfsvol *arg_file; PyObject *arg_file_c; long *arg_offset; int arg_from;
if(!PyArg_ParseTuple(args, "Oli", &arg_file_c, &arg_offset, &arg_from)) return NULL;
if(arg_file_c == Py_None) arg_file = NULL;
else if(!(arg_file = PyCapsule_GetPointer(arg_file_c, NAME_HFSFILE))) return NULL;
long absloc = hfs_seek(arg_file, arg_offset, arg_from);
if(absloc == -1) return NULL;
return Py_BuildValue("l", absloc);
}
static PyObject *wrap_close(PyObject *self, PyObject *args) // pass in a bytearray and get it shrunk!
{
hfsvol *arg_file; PyObject *arg_file_c;
if(!PyArg_ParseTuple(args, "O", &arg_file_c, &arg_offset, &arg_from)) return NULL;
if(arg_file_c == Py_None) arg_file = NULL;
else if(!(arg_file = PyCapsule_GetPointer(arg_file_c, NAME_HFSFILE))) return NULL;
if(hfs_close(arg_file, arg_offset, arg_from)) return NULL;
return Py_None;
}
static PyMethodDef module_methods[] = {
// Volume routines
{"mount", wrap_mount, METH_VARARGS, ""},
@ -179,23 +276,23 @@ static PyMethodDef module_methods[] = {
{"vstat", wrap_vstat, METH_VARARGS, ""},
{"vsetattr", wrap_vsetattr, METH_VARARGS, ""},
// Directory routines
// {"chdir", wrap_chdir, METH_VARARGS, ""},
// {"getcwd", wrap_getcwd, METH_VARARGS, ""},
// {"setcwd", wrap_setcwd, METH_VARARGS, ""},
// {"dirinfo", wrap_dirinfo, METH_VARARGS, ""},
// {"opendir", wrap_opendir, METH_VARARGS, ""},
// {"readdir", wrap_readdir, METH_VARARGS, ""},
// {"closedir", wrap_closedir, METH_VARARGS, ""},
{"chdir", wrap_chdir, METH_VARARGS, ""},
{"getcwd", wrap_getcwd, METH_VARARGS, ""},
{"setcwd", wrap_setcwd, METH_VARARGS, ""},
{"dirinfo", wrap_dirinfo, METH_VARARGS, ""},
{"opendir", wrap_opendir, METH_VARARGS, ""},
{"readdir", wrap_readdir, METH_VARARGS, ""},
{"closedir", wrap_closedir, METH_VARARGS, ""},
// File routines
// {"create", wrap_create, METH_VARARGS, ""},
// {"open", wrap_open, METH_VARARGS, ""},
// {"setfork", wrap_setfork, METH_VARARGS, ""},
// {"getfork", wrap_getfork, METH_VARARGS, ""},
// {"read", wrap_read, METH_VARARGS, ""},
// {"write", wrap_write, METH_VARARGS, ""},
// {"truncate", wrap_truncate, METH_VARARGS, ""},
// {"seek", wrap_seek, METH_VARARGS, ""},
// {"close", wrap_close, METH_VARARGS, ""},
{"create", wrap_create, METH_VARARGS, ""},
{"open", wrap_open, METH_VARARGS, ""},
{"setfork", wrap_setfork, METH_VARARGS, ""},
{"getfork", wrap_getfork, METH_VARARGS, ""},
{"read", wrap_read, METH_VARARGS, ""},
{"write", wrap_write, METH_VARARGS, ""},
{"truncate", wrap_truncate, METH_VARARGS, ""},
{"seek", wrap_seek, METH_VARARGS, ""},
{"close", wrap_close, METH_VARARGS, ""},
// Catalog routines
// {"stat", wrap_stat, METH_VARARGS, ""},
// {"fstat", wrap_fstat, METH_VARARGS, ""},