Skip to content

Commit 9dd28a0

Browse files
committed
getting perl wrapper up to speed
also some small improvments to xdireader.c + squenlched a compilation warning in xdifile
1 parent 551f332 commit 9dd28a0

14 files changed

+110
-71
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ perl/XDIFile.inl
3939
perl/pm_to_blib
4040
_Inline/*
4141
perl/t/baddata/coverage.txt
42+
perl/*.inl
4243

4344
*.aux
4445
*.dvi

c/xdi_reader.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,16 @@ int main(int argc, char **argv) {
3434
xdifile = malloc(sizeof(XDIFile));
3535
ret = XDI_readfile(argv[1], xdifile);
3636
if (ret < 0) {
37-
printf("Error reading XDI file '%s':\n %s\n",
38-
argv[1], XDI_errorstring(ret));
37+
printf("Error reading XDI file '%s':\n %s\t(error code = %ld)\n",
38+
argv[1], XDI_errorstring(ret), ret);
3939
return 1;
4040
}
4141

42+
if (ret > 0) {
43+
printf("Warning reading XDI file '%s':\n %s\t(error code = %ld)\n\n",
44+
argv[1], XDI_errorstring(ret), ret);
45+
}
46+
4247
printf("#------\n# XDI FILE Read %s VERSIONS: |%s|%s|\n" ,
4348
xdifile->filename, xdifile->xdi_version, xdifile->extra_version);
4449

@@ -59,7 +64,7 @@ int main(int argc, char **argv) {
5964
tdat = (double *)calloc(xdifile->npts, sizeof(double));
6065
for (j = 0; j < xdifile->narrays; j++ ) {
6166
ret = XDI_get_array_name(xdifile,xdifile->array_labels[j], tdat);
62-
printf(" %ld %9s: ", j, xdifile->array_labels[j], ret);
67+
printf(" %ld %9s: ", j, xdifile->array_labels[j]);
6368
for (k=0; k < nout; k++) { printf("%.8g, ", tdat[k]); }
6469
printf("\n");
6570
/* printf("..., %.8g, %.8g\n", tdat[xdifile->npts-2], tdat[xdifile->npts-1]);

c/xdifile.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ XDI_readfile(char *filename, XDIFile *xdifile) {
119119
COPY_STRING(xdifile->xdi_version, "");
120120
COPY_STRING(xdifile->extra_version, "");
121121
COPY_STRING(xdifile->element, "__");
122-
COPY_STRING(xdifile->edge, "K");
122+
COPY_STRING(xdifile->edge, "_");
123123
COPY_STRING(xdifile->comments, "");
124124
COPY_STRING(xdifile->error_line, "");
125125
COPY_STRING(xdifile->outer_label, "");

c/xdifile.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ static char *ValidElems[] =
9494

9595

9696
/* error codes
97-
< 1 data file is not valid
97+
< 0 data file is not valid
9898
= 0 all OK.
9999
> 0 data file is valid but may be incomplete as XAFS data
100100
*/

perl/lib/Xray/XDI.pm

Lines changed: 43 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,12 @@ use MooseX::NonMoose;
55
extends 'Xray::XDIFile';
66
with 'Xray::XDI::WriterPP';
77

8-
use feature "switch";
9-
use List::MoreUtils qw(uniq);
8+
use List::MoreUtils qw(any uniq);
109

1110
our $VERSION = '0.01';
1211

1312
has 'file' => (is => 'rw', isa => 'Str', default => q{},
14-
trigger => sub{$_[0]->_build_object; });
13+
trigger => sub{$_[0]->_build_object});
1514

1615
has 'xdifile' => (
1716
is => 'ro',
@@ -22,6 +21,7 @@ has 'xdifile' => (
2221
);
2322
# no need to fiddle with inline_constructor here
2423
has 'ok' => (is => 'rw', isa => 'Bool', default => 0);
24+
has 'warning' => (is => 'rw', isa => 'Bool', default => 0);
2525
has 'errorcode' => (is => 'rw', isa => 'Int', default => 0);
2626
has 'error' => (is => 'rw', isa => 'Str', default => q{});
2727

@@ -71,6 +71,7 @@ sub _build_object {
7171
my ($self) = @_;
7272
$self->error(q{});
7373
$self->ok(1);
74+
$self->warning(0);
7475
if (not -e $self->file) {
7576
$self->error('The file '.$self->file.' does not exist as XDI');
7677
$self->ok(0);
@@ -90,23 +91,31 @@ sub _build_object {
9091
my $obj = Xray::XDIFile->new($self->file, $errcode);
9192
$self->errorcode($errcode);
9293

94+
#print $self->file, $/;
95+
#$self->trace;
96+
#print '>>>>>', $errcode, $/;
97+
9398
##### see xdifile.h for error codes
94-
given ($errcode) {
95-
when ([-10,-30,-31,-32,-41,-42,-43,-80,-81,-82,-100]) {
96-
$self->error($obj->_errorstring($errcode));
97-
$self->ok(0);
98-
return $obj;
99-
};
100-
when ($_ != 0) {
101-
$self->error('not an XDI file, unknown error');
102-
$self->ok(0);
103-
return $obj;
99+
##### see xdifile.c (line 23 and following) for error messages
100+
if ($errcode < 0) {
101+
my @errors = ();
102+
foreach my $i (0 .. 10) {
103+
push @errors, $obj->_errorstring(-1*2**$i) if (abs($errcode) & 2**$i);
104104
};
105-
default {
106-
$self->error(q{});
107-
$self->ok(1);
105+
$self->error(join(", ", @errors));
106+
$self->ok(0);
107+
return $obj;
108+
};
109+
if ($errcode > 0) {
110+
my @errors = ();
111+
foreach my $i (0 .. 4) {
112+
push @errors, $obj->_errorstring(2**$i) if ($errcode & 2**$i);
108113
};
114+
$self->error(join(", ", @errors));
115+
$self->ok(1);
116+
$self->warning(1);
109117
};
118+
110119
if (not defined $obj->_filename) {
111120
$self->error('unknown problem reading '.$self->file.' as an XDI file');
112121
$self->ok(0);
@@ -152,7 +161,24 @@ sub _build_object {
152161
return $obj;
153162
};
154163

155-
164+
use Term::ANSIColor qw(:constants);
165+
sub trace {
166+
my ($self) = @_;
167+
my $max_depth = 30;
168+
my $i = 0;
169+
my ($green, $red, $yellow, $end) = (BOLD.GREEN, BOLD.RED, BOLD.YELLOW, RESET);
170+
local $|=1;
171+
print($/.BOLD."--- Begin stack trace ---$end\n");
172+
while ( (my @call_details = (caller($i++))) && ($i<$max_depth) ) {
173+
my $from = $call_details[1];
174+
my $line = $call_details[2];
175+
my $color = RESET.YELLOW;
176+
(my $func = $call_details[3]) =~ s{(?<=::)(\w+)\z}{$color$1};
177+
print("$green$from$end line $red$line$end in function $yellow$func$end\n");
178+
}
179+
print(BOLD."--- End stack trace ---$end\n");
180+
return $self;
181+
};
156182

157183

158184

perl/lib/Xray/XDIFile.pm

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,12 @@ char* _token(SV* obj, char* tok) {
174174
return TOK_COLUMN;
175175
} else if (strncmp(tok, "dspacing", 2) == 0) {
176176
return TOK_DSPACE;
177+
} else if (strncmp(tok, "timestamp", 2) == 0) {
178+
return TOK_TIMESTAMP;
179+
} else if (strncmp(tok, "outervalue", 6) == 0) {
180+
return TOK_OUTER_VAL;
181+
} else if (strncmp(tok, "outername", 6) == 0) {
182+
return TOK_OUTER_NAME;
177183
} else {
178184
return "";
179185
}

perl/t/00_base.t

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## test the Inline C code in the Xray::XDIFile module
44

5-
use Test::More tests => 45;
5+
use Test::More tests => 46;
66

77
use strict;
88
use warnings;
@@ -20,27 +20,28 @@ my $xdifile = Xray::XDIFile->new($file, $errcode);
2020
ok($errcode == 0, 'error code = 0');
2121
ok($xdifile =~ m{Xray::XDIFile}, 'created Xray::XDIFile object');
2222

23-
ok( $xdifile->_token('comment') eq '#', 'token: comment');
24-
ok( $xdifile->_token('delimiter') eq ':', 'token: delimiter');
25-
ok( $xdifile->_token('dot') eq '.', 'token: dot');
26-
ok( $xdifile->_token('startcomment') eq '///', 'token: startcomment');
27-
ok( $xdifile->_token('endcomment') eq '---', 'token: endcomment');
28-
ok( $xdifile->_token('energycolumn') eq 'energy', 'token: energycolumn');
29-
ok( $xdifile->_token('anglecolumn') eq 'angle', 'token: anglecolumn');
30-
ok( $xdifile->_token('version') eq 'XDI/', 'token: version');
31-
ok( $xdifile->_token('edge') eq 'element.edge', 'token: edge');
32-
ok( $xdifile->_token('element') eq 'element.symbol', 'token: element');
33-
ok( $xdifile->_token('column') eq 'column.', 'token: column');
34-
ok( $xdifile->_token('dspacing') eq 'mono.d_spacing', 'token: dspacing');
35-
ok( $xdifile->_token('glorb') eq '', 'token: not a token');
23+
ok( $xdifile->_token('comment') eq '#', 'token: comment');
24+
ok( $xdifile->_token('delimiter') eq ':', 'token: delimiter');
25+
ok( $xdifile->_token('dot') eq '.', 'token: dot');
26+
ok( $xdifile->_token('startcomment') eq '///', 'token: startcomment');
27+
ok( $xdifile->_token('endcomment') eq '---', 'token: endcomment');
28+
ok( $xdifile->_token('energycolumn') eq 'energy', 'token: energycolumn');
29+
ok( $xdifile->_token('anglecolumn') eq 'angle', 'token: anglecolumn');
30+
ok( $xdifile->_token('version') eq 'XDI/', 'token: version');
31+
ok( $xdifile->_token('edge') eq 'element.edge', 'token: edge');
32+
ok( $xdifile->_token('element') eq 'element.symbol', 'token: element');
33+
ok( $xdifile->_token('column') eq 'column.', 'token: column');
34+
ok( $xdifile->_token('dspacing') eq 'mono.d_spacing', 'token: dspacing');
35+
ok( $xdifile->_token('timestamp') eq 'scan.start_time', 'token: starttime');
36+
ok( $xdifile->_token('glorb') eq '', 'token: "glorb" is not a token');
3637

3738
my @edges = $xdifile->_valid_edges;
3839
ok($#edges == 26, 'edge symbols');
3940
my @elements = $xdifile->_valid_elements;
4041
ok($#elements == 117, 'element symbols');
4142

4243
ok($xdifile->_filename =~ m{co_metal_rt.xdi}, 'filename');
43-
ok($xdifile->_xdi_libversion eq '1.0.0', 'xdi_libversion');
44+
ok($xdifile->_xdi_libversion eq '1.1.0', 'xdi_libversion');
4445
ok($xdifile->_xdi_version >= 1.0, 'xdi_version');
4546
ok($xdifile->_extra_version =~ m{GSE}, 'extra_version');
4647

@@ -62,7 +63,7 @@ ok($families[6] eq 'Mono', 'specific family');
6263
ok($keywords[6] eq 'name', 'specific keyword');
6364
ok($values[6] eq 'Si 111', 'specific value');
6465

65-
ok($xdifile->_npts == 418, 'npts');
66+
ok($xdifile->_npts == 417, 'npts');
6667
ok($xdifile->_narrays == 3, 'narrays');
6768
ok($xdifile->_narrays == $xdifile->_narray_labels, 'narray_labels');
6869

perl/t/01_moose_nonmoose.t

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## test the construction of the Moose attribute structure in Xray::XDI;
44

5-
use Test::More tests => 45;
5+
use Test::More tests => 46;
66

77
use strict;
88
use warnings;
@@ -16,23 +16,24 @@ BEGIN { use_ok('Xray::XDI') };
1616
my $here = dirname($0);
1717
my $file = File::Spec->catfile($here, '..', '..', 'data', 'co_metal_rt.xdi');
1818
my $xdi = Xray::XDI->new(file=>$file);
19-
ok($xdi =~ m{Xray::XDI}, 'created Xray::XDI object');
20-
ok($xdi->ok, 'ok flag is true');
21-
ok($xdi->error eq '', 'error text is empty');
22-
23-
ok( $xdi->token('comment') eq '#', 'token: comment');
24-
ok( $xdi->token('delimiter') eq ':', 'token: delimiter');
25-
ok( $xdi->token('dot') eq '.', 'token: dot');
26-
ok( $xdi->token('startcomment') eq '///', 'token: startcomment');
27-
ok( $xdi->token('endcomment') eq '---', 'token: endcomment');
28-
ok( $xdi->token('energycolumn') eq 'energy', 'token: energycolumn');
29-
ok( $xdi->token('anglecolumn') eq 'angle', 'token: anglecolumn');
30-
ok( $xdi->token('version') eq 'XDI/', 'token: version');
31-
ok( $xdi->token('edge') eq 'element.edge', 'token: edge');
32-
ok( $xdi->token('element') eq 'element.symbol', 'token: element');
33-
ok( $xdi->token('column') eq 'column.', 'token: column');
34-
ok( $xdi->token('dspacing') eq 'mono.d_spacing', 'token: dspacing');
35-
ok( $xdi->token('glorb') eq '', 'token: not a token');
19+
ok($xdi =~ m{Xray::XDI}, 'created Xray::XDI object');
20+
ok($xdi->ok, 'ok flag is true');
21+
ok($xdi->error eq '', 'error text is empty');
22+
23+
ok( $xdi->token('comment') eq '#', 'token: comment');
24+
ok( $xdi->token('delimiter') eq ':', 'token: delimiter');
25+
ok( $xdi->token('dot') eq '.', 'token: dot');
26+
ok( $xdi->token('startcomment') eq '///', 'token: startcomment');
27+
ok( $xdi->token('endcomment') eq '---', 'token: endcomment');
28+
ok( $xdi->token('energycolumn') eq 'energy', 'token: energycolumn');
29+
ok( $xdi->token('anglecolumn') eq 'angle', 'token: anglecolumn');
30+
ok( $xdi->token('version') eq 'XDI/', 'token: version');
31+
ok( $xdi->token('edge') eq 'element.edge', 'token: edge');
32+
ok( $xdi->token('element') eq 'element.symbol', 'token: element');
33+
ok( $xdi->token('column') eq 'column.', 'token: column');
34+
ok( $xdi->token('dspacing') eq 'mono.d_spacing', 'token: dspacing');
35+
ok( $xdi->token('timestamp') eq 'scan.start_time', 'token: timestamp');
36+
ok( $xdi->token('glorb') eq '', 'token: "glorb" is not a token');
3637

3738
my @edges = $xdi->valid_edges;
3839
ok($#edges == 26, 'edge symbols');
@@ -41,7 +42,7 @@ ok($#elements == 117, 'element symbols');
4142

4243

4344
ok($xdi->filename =~ m{co_metal_rt.xdi}, 'filename');
44-
ok($xdi->xdi_libversion eq '1.0.0', 'xdi_libversion');
45+
ok($xdi->xdi_libversion eq '1.1.0', 'xdi_libversion');
4546
ok($xdi->xdi_version >= 1.0, 'xdi_version');
4647
ok($xdi->extra_version =~ m{GSE}, 'extra_version');
4748

@@ -66,7 +67,7 @@ ok($count == $xdi->nmetadata, 'correct numbe
6667
ok($xdi->metadata->{Mono}->{name} eq 'Si 111', 'fetching Mono.name');
6768
ok($xdi->metadata->{Facility}->{xray_source} eq 'APS undulator A', 'fetching Facility.xray_source');
6869

69-
ok($xdi->npts == 418, 'npts');
70+
ok($xdi->npts == 417, 'npts');
7071
ok($xdi->narrays == 3, 'narrays');
7172
ok($xdi->narrays == $xdi->narray_labels, 'narray_labels');
7273

perl/t/baddata/01_no_xdi_line.t

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ BEGIN { use_ok('Xray::XDI') };
1616
my $here = dirname($0);
1717
my $file = File::Spec->catfile($here, '..', '..', '..', 'baddata', 'bad_01.xdi');
1818
my $xdi = Xray::XDI->new(file=>$file);
19+
#my $xdi = Xray::XDI->new;
20+
#$xdi->file($file);
1921

2022
ok((not $xdi->ok), 'bad_01.xdi flagged as failing to import');
2123
ok(($xdi->error =~ m{not an XDI}), 'correctly identified problem');

perl/t/baddata/02_no_edge.t

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@ my $here = dirname($0);
1717
my $file = File::Spec->catfile($here, '..', '..', '..', 'baddata', 'bad_02.xdi');
1818
my $xdi = Xray::XDI->new(file=>$file);
1919

20-
ok((not $xdi->ok), 'bad_02.xdi flagged as failing to import');
20+
ok(($xdi->warning and $xdi->ok), 'bad_02.xdi flagged with a warning');
2121
ok(($xdi->error =~ m{no element\.edge}), 'correctly identified missing edge symbol');
2222

2323

2424
$file = File::Spec->catfile($here, '..', '..', '..', 'baddata', 'bad_04.xdi');
2525
$xdi = Xray::XDI->new(file=>$file);
2626

27-
ok((not $xdi->ok), 'bad_04.xdi flagged as failing to import');
27+
ok(($xdi->warning and $xdi->ok), 'bad_04.xdi flagged with a warning');
2828
ok(($xdi->error =~ m{no element\.edge}), 'correctly identified invalid edge symbol');
2929

3030
open(my $COV, '>>', 'coverage.txt');

0 commit comments

Comments
 (0)