Skip to content

Commit 26f73de

Browse files
committed
fixed, now it works on php 7
1 parent c96af64 commit 26f73de

File tree

3 files changed

+20
-96
lines changed

3 files changed

+20
-96
lines changed

stata.c

Lines changed: 15 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -362,9 +362,9 @@ PHP_FUNCTION (stata_labels)
362362
}
363363

364364
if (finishup)
365-
add_assoc_zval (&innertable, currName, &temp_array);
365+
add_assoc_zval(&innertable, currName, &temp_array);
366366

367-
add_assoc_zval (return_value, "labels", &innertable);
367+
add_assoc_zval(return_value, "labels", &innertable);
368368
}
369369

370370

@@ -375,39 +375,33 @@ PHP_FUNCTION (stata_data)
375375
struct StataObservation *obs;
376376
struct StataObservationData *obd;
377377
struct StataVariable *stv;
378-
zval *stataData, vararray, table;
378+
zval *stataData, xtable;
379+
int counterObs = 0;
379380

380-
int counterObs;
381-
int counterVars;
382-
383381
if (zend_parse_parameters (ZEND_NUM_ARGS ()TSRMLS_CC, "r", &stataData) ==
384382
FAILURE)
385383
{
386384
RETURN_NULL ();
387385
}
388386

389387

390-
dta = (struct StataDataFile *) zend_fetch_resource(Z_RES_P(stataData), PHP_STATA_FILE_RES_NAME, le_stata_file);
391-
388+
dta = (struct StataDataFile *) zend_fetch_resource(Z_RES_P(stataData), PHP_STATA_FILE_RES_NAME, le_stata_file);
392389

393390
if (dta == NULL)
394391
RETURN_NULL();
392+
395393
array_init (return_value);
394+
array_init(&xtable);
396395

397-
array_init(&table);
398-
399-
obs = dta->observations;
400-
401-
for (obs = dta->observations, counterObs = 0; obs;
396+
for (obs = dta->observations; obs;
402397
obs = obs->next, counterObs++)
403398
{
399+
zval vararray;
404400
array_init(&vararray);
405401

406-
407-
for (obd = obs->data, counterVars = 0, stv = dta->variables; obd && stv;
408-
obd = obd->next, stv = stv->next, counterVars++)
402+
for (obd = obs->data, stv = dta->variables; obd && stv;
403+
obd = obd->next, stv = stv->next)
409404
{
410-
411405
switch (stv->valueType)
412406
{
413407
case STATA_SE_FLOAT:
@@ -431,10 +425,11 @@ PHP_FUNCTION (stata_data)
431425
break;
432426
}
433427
}
434-
add_index_zval(&table, counterObs, &vararray);
428+
add_index_zval(&xtable, counterObs, &vararray);
435429
}
436430

437-
add_assoc_zval(return_value, "data", &table);
431+
add_assoc_zval(return_value, "data", &xtable);
432+
438433
}
439434
/*
440435
{{{ */
@@ -485,45 +480,9 @@ PHP_FUNCTION(stata_write)
485480

486481
}
487482
ZEND_HASH_FOREACH_END();
488-
489-
/* for (zend_hash_internal_pointer_reset_ex(Z_ARRVAL_PP(innerLabels), &position);
490-
zend_hash_get_current_data_ex((*innerLabels)->value.ht, (void**) &vlabels, &position) == SUCCESS;
491-
zend_hash_move_forward_ex((*innerLabels)->value.ht, &position)) {
492-
493-
494-
if (Z_TYPE_PP(vlabels) == IS_ARRAY)
495-
{
496-
HashPosition pointer;
497-
char *key;
498-
uint key_len, key_type;
499-
long index;
500-
501-
key_type = zend_hash_get_current_key_ex(Z_ARRVAL_PP(vlabels), &key, &key_len, &index, 0, &position);
502-
503-
switch (key_type) {
504-
case HASH_KEY_IS_STRING:
505-
// associative array keys
506-
//php_printf("key: %s<br>", key);
507-
break;
508-
case HASH_KEY_IS_LONG:
509-
// numeric indexes
510-
//php_printf("index: %ld<br>", index);
511-
break;
512-
default:
513-
break;
514-
}
515-
}
516-
517-
483+
}
518484

519485

520-
} */
521-
522-
}
523-
524-
525-
526-
527486
do_writeStata(fname, data, variables, labels);
528487

529488
}

stataread.c

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -152,10 +152,8 @@ struct StataDataFile * R_LoadStataData(FILE *fp)
152152
default:
153153
zend_error(E_ERROR, "not a Stata version 5-12 .dta file");
154154
}
155-
printf("version: %d varnamelength: %d fmtlistlen: %d\n\r", version, varnamelength, fmtlist_len);
156155
stata_endian = (int) RawByteBinary(fp, 1); /* byte ordering */
157156
swapends = stata_endian != CN_TYPE_NATIVE;
158-
printf("stata_endian: %d\n\r", stata_endian);
159157

160158
struct StataDataFile * df = ecalloc(1, sizeof(struct StataDataFile));
161159

@@ -167,7 +165,6 @@ struct StataDataFile * R_LoadStataData(FILE *fp)
167165
df->nvar = nvar;
168166
df->nobs = nobs;
169167

170-
printf("nvar: %d, nobs: %d\n\r", df->nvar, df->nobs);
171168
/* data label - zero terminated string */
172169
switch (abs(version)) {
173170
case 5:
@@ -270,7 +267,6 @@ struct StataDataFile * R_LoadStataData(FILE *fp)
270267

271268
for (i = 0, stv=df->variables; i < nvar && stv; i++, stv = stv->next) {
272269
InStringBinary(fp, varnamelength+1, aname);
273-
printf("names[%d] [%s]\n\r", i, aname);
274270
stv->name = estrdup(aname);
275271
}
276272

@@ -285,7 +281,6 @@ struct StataDataFile * R_LoadStataData(FILE *fp)
285281

286282
for (i = 0, stv=df->variables; i < nvar; i++, stv=stv->next) {
287283
InStringBinary(fp, fmtlist_len, timestamp);
288-
printf("fmt_len: %d timestamp: %s\n\r", fmtlist_len, timestamp);
289284
stv->vfmt = estrdup(timestamp);
290285
}
291286

@@ -295,7 +290,6 @@ struct StataDataFile * R_LoadStataData(FILE *fp)
295290

296291
for(i = 0, stv=df->variables; i < nvar; i++, stv=stv->next) {
297292
InStringBinary(fp, varnamelength+1, aname);
298-
printf("valueLabels: %d, %s\n\r", varnamelength+1, aname);
299293
stv->vlabels = estrdup(aname);
300294
}
301295

@@ -306,7 +300,6 @@ struct StataDataFile * R_LoadStataData(FILE *fp)
306300
for(i = 0, stv=df->variables; i < nvar; i++, stv=stv->next) {
307301
InStringBinary(fp, 32, datalabel);
308302
stv->dlabels = estrdup(datalabel);
309-
printf("variableLabel: %s\n\r", datalabel);
310303
}
311304
break;
312305
case 6:
@@ -317,7 +310,6 @@ struct StataDataFile * R_LoadStataData(FILE *fp)
317310
for(i = 0, stv=df->variables; i < nvar; i++, stv=stv->next) {
318311
InStringBinary(fp, 81, datalabel);
319312
stv->dlabels = estrdup(datalabel);
320-
printf("variableLabel: %s\n\r", datalabel);
321313
}
322314
}
323315

@@ -334,13 +326,11 @@ struct StataDataFile * R_LoadStataData(FILE *fp)
334326
else
335327
charlen = (InShortIntBinary(fp, 1, swapends));
336328

337-
printf("charlen: %d\n\r", charlen);
338329
if((charlen > 66)) {
339330
InStringBinary(fp, 33, datalabel);
340331
InStringBinary(fp, 33, datalabel);
341332
txt = ecalloc(1, (size_t) (charlen-66));
342333
InStringBinary(fp, (charlen-66), txt);
343-
printf("charlen>66: %d %s\n\r", charlen-66, txt);
344334
efree(txt);
345335
j++;
346336
} else
@@ -355,11 +345,9 @@ struct StataDataFile * R_LoadStataData(FILE *fp)
355345
charlen = (InShortIntBinary(fp, 1, swapends));
356346
if (charlen != 0)
357347
zend_error(E_ERROR, "something strange in the file (Type 0 characteristic of nonzero length)");
358-
printf("characteristics: %d\n\r", charlen);
359348
struct StataObservation *obspcurr = NULL;
360349
struct StataObservationData * dptr = NULL;
361350
/** The Data **/
362-
printf("version: %d\n\r", version);
363351
if (version > 0) { /* not Stata/SE */
364352
for(i = 0; i < nobs; i++){
365353
if (df->observations == NULL)
@@ -391,7 +379,6 @@ struct StataDataFile * R_LoadStataData(FILE *fp)
391379
dptr->next = ecalloc(1, sizeof(struct StataObservationData));
392380
dptr = dptr->next;
393381
}
394-
printf("Stata/SE valueType: %d\n\r", stv->valueType);
395382
switch (stv->valueType) {
396383
case STATA_FLOAT:
397384
dptr->value.d = InFloatBinary(fp, 0, swapends);
@@ -427,7 +414,6 @@ struct StataDataFile * R_LoadStataData(FILE *fp)
427414
}
428415
} else {
429416
for(i = 0; i < nobs; i++) {
430-
printf("i: %d nobs: %d\n\r", i, nobs);
431417
if (df->observations == NULL)
432418
{
433419
df->observations = ecalloc(1, sizeof(struct StataObservation));
@@ -442,7 +428,6 @@ struct StataDataFile * R_LoadStataData(FILE *fp)
442428
}
443429

444430
for(j = 0, stv = df->variables; j < nvar && stv; j++, stv = stv->next){
445-
printf("j: %d nvar: %d\n\r", j, nvar);
446431
if (obspcurr->data == NULL)
447432
{
448433
obspcurr->data = ecalloc(1, sizeof(struct StataObservationData));
@@ -454,7 +439,6 @@ struct StataDataFile * R_LoadStataData(FILE *fp)
454439
dptr = dptr->next;
455440
}
456441

457-
printf("valueType: %d\n\r", stv->valueType);
458442
switch (stv->valueType) {
459443
case STATA_SE_FLOAT:
460444
dptr->value.d = InFloatBinary(fp, 0, swapends);
@@ -494,30 +478,25 @@ struct StataDataFile * R_LoadStataData(FILE *fp)
494478

495479

496480
/** value labels **/
497-
printf("value labels\n\r");
498481
if (abs(version) > 5) {
499482

500483
struct StataLabel * lblcurr = NULL;
501484

502485
for(j = 0; ; j++) {
503486
/* first int not needed, use fread directly to trigger EOF */
504487
res = (int) fread((int *) aname, sizeof(int), 1, fp);
505-
printf("aname: %s\n\r", aname);
506488
if (feof(fp)) break;
507489

508490
if (res != 1) zend_error(E_ERROR, "a binary read error occurred");
509491

510492
InStringBinary(fp, varnamelength+1, aname);
511-
printf("InString: %d, %s\n\r", varnamelength+1, aname);
512493
RawByteBinary(fp, 1); RawByteBinary(fp, 1); RawByteBinary(fp, 1); /*padding*/
513494
nlabels = InIntegerBinary(fp, 1, swapends);
514495

515-
printf("nlabels: %d\n\r" , nlabels);
516496

517497

518498
totlen = InIntegerBinary(fp, 1, swapends);
519499

520-
printf("totlen: %d\n\r", totlen);
521500
off = ecalloc(sizeof(int), (size_t) nlabels);
522501
for(i = 0; i < nlabels; i++)
523502
off[i] = InIntegerBinary(fp, 1, swapends);
@@ -535,7 +514,6 @@ struct StataDataFile * R_LoadStataData(FILE *fp)
535514
{
536515
df->labels = ecalloc(1, sizeof(struct StataLabel));
537516
lblcurr = df->labels;
538-
printf("df->labels == NULL %s\n\r", aname);
539517
lblcurr->name = estrdup(aname);
540518
lblcurr->value=levels[i];
541519
lblcurr->string = estrdup(txt+off[i]);
@@ -546,7 +524,6 @@ struct StataDataFile * R_LoadStataData(FILE *fp)
546524
{
547525
lblcurr->next = ecalloc(1, sizeof(struct StataLabel));
548526
lblcurr = lblcurr->next;
549-
printf("df!=labels %s\n\r", aname);
550527
lblcurr->name = estrdup(aname);
551528
lblcurr->value=levels[i];
552529
lblcurr->string = estrdup(txt+off[i]);
@@ -575,7 +552,6 @@ struct StataDataFile * R_LoadStataData(FILE *fp)
575552
*/
576553

577554
//INTEGER(sversion)[0] = (version == -7)? version : abs(version);
578-
printf("return df\n\r");
579555
return df;
580556
}
581557

statawrite.c

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -117,14 +117,10 @@ writeStataValueLabel(const char *labelName, zval * theselabels,
117117

118118
ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(theselabels), str_vars, currentLabel)
119119
{
120-
121-
printf("type: %d , len: %d str: %s\n\r", Z_TYPE_P(currentLabel), Z_STRLEN_P(currentLabel), Z_STRVAL_P(currentLabel));
122-
123120
txtlen += Z_STRLEN_P(currentLabel) + 1;
124121
}
125122
ZEND_HASH_FOREACH_END();
126123

127-
printf("textlen: %d\n\r", txtlen);
128124
len += txtlen;
129125
OutIntegerBinary((int)len, fp, 0);
130126
zend_error(E_NOTICE,"len: %ld", len);
@@ -194,7 +190,6 @@ writeStataValueLabel(const char *labelName, zval * theselabels,
194190
ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(theselabels), str_vars, currentLabel)
195191
{
196192
len = Z_STRLEN_P(currentLabel);
197-
printf("str: %s len: %d\n\r", Z_STRVAL_P(currentLabel), len);
198193
OutStringBinary(Z_STRVAL_P(currentLabel), fp, (int)len);
199194
OutByteBinary(0, fp);
200195
txtlen -= len+1;
@@ -264,7 +259,6 @@ void R_SaveStataData(FILE *fp, zval *data, zval *vars, zval *labels)
264259
OutByteBinary(0, fp); /* padding */
265260

266261
nvar = zend_hash_num_elements(Z_ARRVAL_P(vars));
267-
printf("number of variables: %d\n\r", nvar);
268262
HashTable * ht_data = Z_ARRVAL_P(data);
269263

270264
zend_string * str_data = zend_string_init("data", sizeof("data") -1 , 0);
@@ -278,7 +272,6 @@ void R_SaveStataData(FILE *fp, zval *data, zval *vars, zval *labels)
278272
OutShortIntBinary(nvar, fp);
279273
OutIntegerBinary(nobs, fp, 1);
280274

281-
printf("number of observations: %d\n\r", nobs);
282275

283276
int ** types = ecalloc(nvar, sizeof(int*));
284277
int ** wrTypes = ecalloc(nvar, sizeof(int*));
@@ -317,24 +310,24 @@ void R_SaveStataData(FILE *fp, zval *data, zval *vars, zval *labels)
317310
switch(Z_LVAL_P(valueType)) {
318311

319312
case STATA_SE_BYTE:
320-
printf("byte %ld\n\r", Z_LVAL_P(valueType));
313+
//printf("byte %ld\n\r", Z_LVAL_P(valueType));
321314
OutByteBinary(STATA_SE_BYTE, fp);
322315
break;
323316
case STATA_SE_INT:
324-
printf("int %ld\n\r", Z_LVAL_P(valueType));
317+
//printf("int %ld\n\r", Z_LVAL_P(valueType));
325318
OutByteBinary(STATA_SE_INT, fp);
326319
break;
327320
case STATA_SE_SHORTINT:
328-
printf("short %ld\n\r", Z_LVAL_P(valueType));
321+
//printf("short %ld\n\r", Z_LVAL_P(valueType));
329322
OutByteBinary(STATA_SE_SHORTINT, fp);
330323
break;
331324
case STATA_SE_FLOAT:
332325
OutByteBinary(STATA_SE_DOUBLE,fp);
333-
printf("float: %ld\n\r", Z_LVAL_P(valueType));
326+
//printf("float: %ld\n\r", Z_LVAL_P(valueType));
334327
break;
335328
case STATA_SE_DOUBLE:
336329
OutByteBinary(STATA_SE_DOUBLE,fp);
337-
printf("double: %ld\n\r", Z_LVAL_P(valueType));
330+
//printf("double: %ld\n\r", Z_LVAL_P(valueType));
338331
break;
339332
default:
340333
charlen = 0;
@@ -365,8 +358,6 @@ void R_SaveStataData(FILE *fp, zval *data, zval *vars, zval *labels)
365358
charlen = 2;
366359
*types[i] = charlen;
367360
}
368-
printf("string %d\n\r", charlen);
369-
//printf("charlen: %d\n\r", charlen);
370361
OutByteBinary((unsigned char)(charlen+STATA_SE_STRINGOFFSET), fp);
371362
break;
372363

@@ -393,7 +384,6 @@ void R_SaveStataData(FILE *fp, zval *data, zval *vars, zval *labels)
393384
but strings need accurate types */
394385

395386
for (i = 0; i < nvar; i++) {
396-
printf("%d : %d\n\r", i, *types[i]);
397387
if (*types[i] != -1){
398388
// string types are at most 244 character so we can't get a buffer overflow in sprintf
399389
memset(strformat, 0, 50);
@@ -525,7 +515,6 @@ void R_SaveStataData(FILE *fp, zval *data, zval *vars, zval *labels)
525515
ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(value_labels), str_vars, inner_labels)
526516
{
527517
strncpy(aname, str_vars->val, namelength);
528-
printf("WriteValueLabel: %s %x %d\n\r", aname, inner_labels, namelength);
529518
writeStataValueLabel(aname, inner_labels, 0, namelength, fp);
530519

531520
}

0 commit comments

Comments
 (0)