Skip to content
This repository was archived by the owner on Feb 18, 2020. It is now read-only.

Commit 4a43b17

Browse files
Save and Load of CArrays.
1 parent fe59c5f commit 4a43b17

File tree

4 files changed

+139
-0
lines changed

4 files changed

+139
-0
lines changed

config.m4

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ PHP_NEW_EXTENSION(carray,
129129
kernel/common/compare.c \
130130
kernel/exp_logs.c \
131131
kernel/random.c \
132+
kernel/storage.c \
132133
kernel/range.c \
133134
kernel/conversion_utils.c \
134135
kernel/buffer.c ,

kernel/storage.c

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
#include "carray.h"
2+
#include "storage.h"
3+
#include "buffer.h"
4+
5+
/**
6+
* Save CArrray to binary file
7+
*
8+
* @param filename
9+
* @param target
10+
* @return 1 - Success or 0 error
11+
*/
12+
int
13+
CArrayStorage_SaveBin(char * filename, CArray *target)
14+
{
15+
char * fullname = emalloc(sizeof(char) * (strlen(filename) + 4));
16+
17+
strcpy(fullname, filename);
18+
strcat(fullname, ".carray");
19+
20+
FILE* fp = fopen(fullname, "wb");
21+
22+
if (fp == NULL || fp == 0) {
23+
return 0;
24+
}
25+
26+
assert(fp != 0);
27+
28+
fwrite(&(target->ndim), sizeof(int), 1, fp);
29+
fwrite(target->dimensions, sizeof(int) * CArray_NDIM(target), 1, fp);
30+
fwrite(target->strides, sizeof(int), CArray_NDIM(target), fp);
31+
fwrite(&(target->flags), sizeof(int), 1, fp);
32+
fwrite(&(target->descriptor->type_num), sizeof(int), 1, fp);
33+
fwrite(target->data, CArray_DESCR(target)->elsize, CArray_MultiplyList(CArray_DIMS(target), CArray_NDIM(target)), fp);
34+
35+
fclose(fp);
36+
efree(fullname);
37+
38+
return 1;
39+
}
40+
41+
int
42+
CArrayStorage_LoadBin(char *filename, MemoryPointer *out)
43+
{
44+
CArrayDescriptor *descr;
45+
CArray *array;
46+
char * fullname = emalloc(sizeof(char) * (strlen(filename) + 4));
47+
int type_num;
48+
49+
strcpy(fullname, filename);
50+
strcat(fullname, ".carray");
51+
52+
FILE* fp = fopen(fullname, "r");
53+
54+
if (fp == NULL || fp == 0) {
55+
return 0;
56+
}
57+
58+
assert(fp != 0);
59+
60+
array = emalloc(sizeof(CArray));
61+
fread(&(array->ndim), sizeof(int), 1, fp);
62+
63+
array->dimensions = emalloc(sizeof(int) * array->ndim);
64+
fread(array->dimensions, sizeof(int) * array->ndim, 1, fp);
65+
66+
array->strides = emalloc(sizeof(int) * array->ndim);
67+
fread(array->strides, sizeof(int), array->ndim, fp);
68+
fread(&(array->flags), sizeof(int), 1, fp);
69+
fread(&type_num, sizeof(int), 1, fp);
70+
71+
descr = CArray_DescrFromType(type_num);
72+
array->descriptor = descr;
73+
74+
array->data = emalloc(array->descriptor->elsize * CArray_MultiplyList(CArray_DIMS(array), CArray_NDIM(array)));
75+
fread(array->data, array->descriptor->elsize, CArray_MultiplyList(CArray_DIMS(array), CArray_NDIM(array)), fp);
76+
77+
array->descriptor->numElements = CArray_MultiplyList(CArray_DIMS(array), CArray_NDIM(array));
78+
array->refcount = 0;
79+
80+
81+
array->flags |= CARRAY_ARRAY_OWNDATA;
82+
83+
add_to_buffer(out, array, sizeof(CArray));
84+
efree(fullname);
85+
return 1;
86+
}

kernel/storage.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#ifndef CARRAY_STORAGE_H
2+
#define CARRAY_STORAGE_H
3+
4+
#include "carray.h"
5+
6+
int CArrayStorage_SaveBin(char * filename, CArray *target);
7+
int CArrayStorage_LoadBin(char * filename, MemoryPointer * out);
8+
#endif //CARRAY_STORAGE_H

phpsci.c

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
#include "kernel/search.h"
5757
#include "kernel/exp_logs.h"
5858
#include "kernel/clip.h"
59+
#include "kernel/storage.h"
5960
#include "kernel/round.h"
6061

6162
typedef struct _zend_carray_cdata {
@@ -2566,6 +2567,45 @@ PHP_METHOD(CArray, __invoke)
25662567
throw_notimplemented_exception();
25672568
}
25682569

2570+
/**
2571+
* STORAGE
2572+
*/
2573+
PHP_METHOD(CArray, save)
2574+
{
2575+
MemoryPointer ptr;
2576+
zval * obj = getThis();
2577+
char * filename;
2578+
size_t filename_len;
2579+
ZEND_PARSE_PARAMETERS_START(1, 1)
2580+
Z_PARAM_STRING(filename, filename_len)
2581+
ZEND_PARSE_PARAMETERS_END();
2582+
2583+
ZVAL_TO_MEMORYPOINTER(obj, &ptr, NULL);
2584+
2585+
CArray *target = CArray_FromMemoryPointer(&ptr);
2586+
if(!CArrayStorage_SaveBin(filename, target)){
2587+
throw_memory_exception("An error occurred");
2588+
return;
2589+
}
2590+
}
2591+
PHP_METHOD(CArray, load)
2592+
{
2593+
MemoryPointer rtn;
2594+
char * filename;
2595+
size_t filename_len;
2596+
ZEND_PARSE_PARAMETERS_START(1, 1)
2597+
Z_PARAM_STRING(filename, filename_len)
2598+
ZEND_PARSE_PARAMETERS_END();
2599+
2600+
if(!CArrayStorage_LoadBin(filename, &rtn)){
2601+
throw_memory_exception("An error occurred");
2602+
return;
2603+
}
2604+
2605+
RETURN_MEMORYPOINTER(return_value, &rtn);
2606+
}
2607+
2608+
25692609
/**
25702610
* CLASS METHODS
25712611
*/
@@ -2704,6 +2744,10 @@ static zend_function_entry carray_class_methods[] =
27042744
PHP_ME(CArray, cosh, NULL, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
27052745
PHP_ME(CArray, tanh, NULL, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
27062746

2747+
// STORAGAE
2748+
PHP_ME(CArray, save, NULL, ZEND_ACC_PUBLIC)
2749+
PHP_ME(CArray, load, NULL, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
2750+
27072751
// CARRAY ITERATOR
27082752
PHP_ME(CArray, offsetUnset, arginfo_array_offsetGet, ZEND_ACC_PUBLIC)
27092753
PHP_ME(CArray, offsetSet, arginfo_offsetSet, ZEND_ACC_PUBLIC)

0 commit comments

Comments
 (0)