2
2
#include "php_git2_priv.h"
3
3
#include "tree.h"
4
4
5
+ typedef struct tree_walk_cb_t {
6
+ zval * payload ;
7
+ zend_fcall_info * fci ;
8
+ zend_fcall_info_cache * fcc ;
9
+ GIT2_TSRMLS_DECL
10
+ };
11
+
12
+ static int tree_walk_cb (const char * root , const git_tree_entry * entry , void * payload )
13
+ {
14
+ php_git2_t * result ;
15
+ zval * param_root , * param_rsrc , * retval_ptr = NULL;
16
+ struct tree_walk_cb_t * p = (struct tree_walk_cb_t * )payload ;
17
+ int i = 0 ;
18
+ GIT2_TSRMLS_SET (p -> tsrm_ls )
19
+
20
+ Z_ADDREF_P (p -> payload );
21
+ MAKE_STD_ZVAL (param_root );
22
+ MAKE_STD_ZVAL (param_rsrc );
23
+
24
+ ZVAL_STRING (param_root , root , 1 );
25
+ php_git2_make_resource (& result , PHP_GIT2_TYPE_TREE_ENTRY , entry , 0 TSRMLS_CC );
26
+ zend_list_addref (result -> resource_id );
27
+ ZVAL_RESOURCE (param_rsrc , result -> resource_id );
28
+
29
+ if (php_git2_call_function_v (p -> fci , p -> fcc TSRMLS_CC , & retval_ptr , 3 , & param_root , & param_rsrc , & p -> payload )) {
30
+ zval_ptr_dtor (& retval_ptr );
31
+ zend_list_delete (result -> resource_id );
32
+ return 0 ;
33
+ }
34
+ zval_ptr_dtor (& retval_ptr );
35
+ zend_list_delete (result -> resource_id );
36
+
37
+ return 1 ;
38
+ }
39
+
40
+ static int php_git2_tree_walk_cb_init (struct tree_walk_cb * * out , zend_fcall_info * fci , zend_fcall_info_cache * fcc , void * payload TSRMLS_DC )
41
+ {
42
+ struct tree_walk_cb_t * cb ;
43
+
44
+ cb = (struct tree_walk_cb_t * )emalloc (sizeof (struct tree_walk_cb_t ));
45
+ if (cb == NULL ) {
46
+ return 1 ;
47
+ }
48
+
49
+ cb -> payload = payload ;
50
+ cb -> fci = fci ;
51
+ cb -> fcc = fcc ;
52
+ GIT2_TSRMLS_SET2 (cb , TSRMLS_C );
53
+
54
+ * out = cb ;
55
+ return 0 ;
56
+ }
57
+
58
+ static void php_git2_tree_walk_cb_free (struct tree_walk_cb * target )
59
+ {
60
+ efree (target );
61
+ }
62
+
5
63
/* {{{ proto resource git_tree_entry_byindex(resource $tree, string $name)
6
64
*/
7
65
PHP_FUNCTION (git_tree_entry_byindex )
@@ -128,7 +186,6 @@ PHP_FUNCTION(git_tree_entry_id)
128
186
zval * tree_entry ;
129
187
php_git2_t * git2 ;
130
188
char out [GIT2_OID_HEXSIZE ] = {0 };
131
-
132
189
const git_oid * id ;
133
190
134
191
if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC ,
@@ -138,7 +195,6 @@ PHP_FUNCTION(git_tree_entry_id)
138
195
139
196
ZEND_FETCH_RESOURCE (git2 , php_git2_t * , & tree_entry , -1 , PHP_GIT2_RESOURCE_NAME , git2_resource_handle );
140
197
id = git_tree_entry_id (PHP_GIT2_V (git2 , tree_entry ));
141
-
142
198
git_oid_fmt (out , id );
143
199
RETURN_STRING (out , 1 );
144
200
}
@@ -159,7 +215,6 @@ PHP_FUNCTION(git_tree_entry_type)
159
215
160
216
ZEND_FETCH_RESOURCE (git2 , php_git2_t * , & tree , -1 , PHP_GIT2_RESOURCE_NAME , git2_resource_handle );
161
217
type = git_tree_entry_type (PHP_GIT2_V (git2 , tree ));
162
-
163
218
RETURN_LONG (type );
164
219
}
165
220
@@ -178,7 +233,6 @@ PHP_FUNCTION(git_tree_entry_name)
178
233
179
234
ZEND_FETCH_RESOURCE (git2 , php_git2_t * , & tree_entry , -1 , PHP_GIT2_RESOURCE_NAME , git2_resource_handle );
180
235
name = git_tree_entry_name (PHP_GIT2_V (git2 , tree_entry ));
181
-
182
236
RETURN_STRING (name , 1 );
183
237
}
184
238
@@ -197,7 +251,6 @@ PHP_FUNCTION(git_tree_entrycount)
197
251
198
252
ZEND_FETCH_RESOURCE (git2 , php_git2_t * , & tree , -1 , PHP_GIT2_RESOURCE_NAME , git2_resource_handle );
199
253
count = git_tree_entrycount (PHP_GIT2_V (git2 , tree ));
200
-
201
254
RETURN_LONG (count );
202
255
}
203
256
@@ -216,7 +269,6 @@ PHP_FUNCTION(git_tree_entry_filemode)
216
269
217
270
ZEND_FETCH_RESOURCE (git2 , php_git2_t * , & tree_entry , -1 , PHP_GIT2_RESOURCE_NAME , git2_resource_handle );
218
271
filemode = git_tree_entry_filemode (PHP_GIT2_V (git2 , tree_entry ));
219
-
220
272
RETURN_LONG (filemode );
221
273
}
222
274
@@ -235,7 +287,6 @@ PHP_FUNCTION(git_tree_entry_filemode_raw)
235
287
236
288
ZEND_FETCH_RESOURCE (git2 , php_git2_t * , & tree_entry , -1 , PHP_GIT2_RESOURCE_NAME , git2_resource_handle );
237
289
filemode = git_tree_entry_filemode_raw (PHP_GIT2_V (git2 , tree_entry ));
238
-
239
290
RETURN_LONG (filemode );
240
291
}
241
292
@@ -254,7 +305,6 @@ PHP_FUNCTION(git_tree_entry_cmp)
254
305
255
306
ZEND_FETCH_RESOURCE (g_e1 , php_git2_t * , & e1 , -1 , PHP_GIT2_RESOURCE_NAME , git2_resource_handle );
256
307
ZEND_FETCH_RESOURCE (g_e2 , php_git2_t * , & e2 , -1 , PHP_GIT2_RESOURCE_NAME , git2_resource_handle );
257
-
258
308
result = git_tree_entry_cmp (PHP_GIT2_V (g_e1 , tree_entry ), PHP_GIT2_V (g_e2 , tree_entry ));
259
309
RETURN_LONG (result );
260
310
}
@@ -334,7 +384,6 @@ PHP_FUNCTION(git_tree_id)
334
384
zval * tree ;
335
385
php_git2_t * git2 ;
336
386
char out [GIT2_OID_HEXSIZE ] = {0 };
337
-
338
387
const git_oid * id ;
339
388
340
389
if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC ,
@@ -344,7 +393,6 @@ PHP_FUNCTION(git_tree_id)
344
393
345
394
ZEND_FETCH_RESOURCE (git2 , php_git2_t * , & tree , -1 , PHP_GIT2_RESOURCE_NAME , git2_resource_handle );
346
395
id = git_tree_id (PHP_GIT2_V (git2 , tree ));
347
-
348
396
git_oid_fmt (out , id );
349
397
RETURN_STRING (out , 1 );
350
398
}
@@ -389,88 +437,27 @@ PHP_FUNCTION(git_tree_lookup)
389
437
/* }}} */
390
438
391
439
/* {{{ proto resource git_tree_owner(resource $tree)
392
- */
440
+ */
393
441
PHP_FUNCTION (git_tree_owner )
394
442
{
395
- zval * tree ;
396
- php_git2_t * git2 , * result ;
397
- git_repository * repository ;
443
+ git_repository * result = NULL ;
444
+ zval * tree = NULL ;
445
+ php_git2_t * _tree = NULL , * __result = NULL ;
398
446
399
447
if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC ,
400
448
"r" , & tree ) == FAILURE ) {
401
449
return ;
402
450
}
403
451
404
- ZEND_FETCH_RESOURCE (git2 , php_git2_t * , & tree , -1 , PHP_GIT2_RESOURCE_NAME , git2_resource_handle );
405
-
406
- PHP_GIT2_MAKE_RESOURCE (result );
407
- repository = git_tree_owner (PHP_GIT2_V (git2 , tree ));
408
-
409
- PHP_GIT2_V (result , repository ) = repository ;
410
- result -> type = PHP_GIT2_TYPE_REPOSITORY ;
411
- result -> resource_id = PHP_GIT2_LIST_INSERT (result , git2_resource_handle );
412
- result -> should_free_v = 0 ;
413
-
414
- ZVAL_RESOURCE (return_value , result -> resource_id );
452
+ ZEND_FETCH_RESOURCE (_tree , php_git2_t * , & tree , -1 , PHP_GIT2_RESOURCE_NAME , git2_resource_handle );
453
+ result = git_tree_owner (PHP_GIT2_V (_tree , tree ));
454
+ if (php_git2_make_resource (& __result , PHP_GIT2_TYPE_TREE , result , 0 TSRMLS_CC )) {
455
+ RETURN_FALSE ;
456
+ }
457
+ ZVAL_RESOURCE (return_value , GIT2_RVAL_P (__result ));
415
458
}
416
459
/* }}} */
417
460
418
- typedef struct tree_walk_cb_t {
419
- zval * payload ;
420
- zend_fcall_info * fci ;
421
- zend_fcall_info_cache * fcc ;
422
- #ifdef ZTS
423
- void * * * tsrmls ;
424
- #endif
425
- } ;
426
-
427
- static int tree_walk_cb (const char * root , const git_tree_entry * entry , void * payload )
428
- {
429
- php_git2_t * result ;
430
- zval * * params [3 ], * param_root , * param_rsrc , * retval_ptr = NULL ;
431
- struct tree_walk_cb_t * p = (struct tree_walk_cb_t * )payload ;
432
- #ifdef ZTS
433
- void * * * tsrm_ls = p -> tsrmls ;
434
- #endif
435
-
436
- MAKE_STD_ZVAL (param_root );
437
- ZVAL_STRING (param_root , root , 1 );
438
- MAKE_STD_ZVAL (param_rsrc );
439
- //MAKE_STD_ZVAL(retval_ptr);
440
-
441
- PHP_GIT2_MAKE_RESOURCE_NOCHECK (result );
442
-
443
- PHP_GIT2_V (result , tree_entry ) = entry ;
444
- result -> type = PHP_GIT2_TYPE_TREE_ENTRY ;
445
- result -> resource_id = PHP_GIT2_LIST_INSERT (result , git2_resource_handle );
446
- result -> should_free_v = 0 ;
447
-
448
- ZVAL_RESOURCE (param_rsrc , result -> resource_id );
449
-
450
- params [0 ] = & param_root ;
451
- params [1 ] = & param_rsrc ;
452
- params [2 ] = & p -> payload ;
453
-
454
- if (ZEND_FCI_INITIALIZED (* p -> fci )) {
455
- p -> fci -> params = params ;
456
- p -> fci -> retval_ptr_ptr = & retval_ptr ;
457
- p -> fci -> param_count = 3 ;
458
- p -> fci -> no_separation = 1 ;
459
-
460
- if (zend_call_function (p -> fci , p -> fcc TSRMLS_CC ) != SUCCESS ) {
461
- }
462
-
463
- zend_fcall_info_args_clear (p -> fci , 0 );
464
- }
465
-
466
- zval_ptr_dtor (& param_root );
467
- zval_ptr_dtor (& param_rsrc );
468
- zval_ptr_dtor (& retval_ptr );
469
-
470
- zend_list_delete (result -> resource_id );
471
-
472
- return 1 ;
473
- }
474
461
475
462
/* {{{ proto void git_tree_walk(resource $tree, long $mode, Callable $callback, mixed &$payload)
476
463
*/
@@ -480,25 +467,24 @@ PHP_FUNCTION(git_tree_walk)
480
467
php_git2_t * git2 , * result ;
481
468
zend_fcall_info fci = empty_fcall_info ;
482
469
zend_fcall_info_cache fcc = empty_fcall_info_cache ;
483
- long mode ;
470
+ long mode = GIT_TREEWALK_PRE ;
484
471
struct tree_walk_cb_t * cb ;
472
+ int error = 0 ;
485
473
486
474
if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC ,
487
475
"rlf|z" , & tree , & mode , & fci , & fcc , & payload ) == FAILURE ) {
488
476
return ;
489
477
}
490
478
491
- cb = (struct tree_walk_cb_t * )emalloc (sizeof (struct tree_walk_cb_t ));
492
- cb -> payload = payload ;
493
- #ifdef ZTS
494
- cb -> tsrmls = TSRMLS_C ;
495
- #endif
496
- cb -> fci = & fci ;
497
- cb -> fcc = & fcc ;
498
-
499
479
ZEND_FETCH_RESOURCE (git2 , php_git2_t * , & tree , -1 , PHP_GIT2_RESOURCE_NAME , git2_resource_handle );
500
- git_tree_walk (PHP_GIT2_V (git2 , tree ), mode , tree_walk_cb , cb );
480
+ if (php_git2_tree_walk_cb_init (& cb , & fci , & fcc , payload TSRMLS_CC )) {
481
+ RETURN_FALSE ;
482
+ }
483
+ error = git_tree_walk (PHP_GIT2_V (git2 , tree ), mode , tree_walk_cb , cb );
484
+ php_git2_tree_walk_cb_free (cb );
485
+ if (php_git2_check_error (error , "git_tree_walk" TSRMLS_CC )) {
486
+ RETURN_FALSE
487
+ }
501
488
502
- efree (cb );
503
489
}
504
490
/* }}} */
0 commit comments