SCM Repository
Annotation of /branches/pure-cfg/src/lib/common/output.c
Parent Directory
|
Revision Log
Revision 1518 - (view) (download) (as text)
1 : | jhr | 1481 | /*! \file output.c |
2 : | * | ||
3 : | * \author Nick Seltzer | ||
4 : | */ | ||
5 : | nseltzer | 1479 | |
6 : | jhr | 1481 | /* |
7 : | * COPYRIGHT (c) 2011 The Diderot Project (http://diderot-language.cs.uchicago.edu) | ||
8 : | * All rights reserved. | ||
9 : | */ | ||
10 : | |||
11 : | nseltzer | 1479 | #include <stdio.h> |
12 : | #include "Diderot/diderot.h" | ||
13 : | jhr | 1517 | #include "Diderot/output.h" |
14 : | nseltzer | 1479 | #include <teem/nrrd.h> |
15 : | #include <teem/air.h> | ||
16 : | |||
17 : | jhr | 1481 | /*! \brief Print the strand output state to a text file. |
18 : | */ | ||
19 : | void Diderot_Print (Output_Args_t *args) | ||
20 : | { | ||
21 : | airArray *mop = airMopNew(); | ||
22 : | |||
23 : | // here we have the final state of all of the strands in the "in" buffer | ||
24 : | int outFileNameLen = strlen(args->name) + 5; | ||
25 : | char *outFileName = (char *)CheckedAlloc(outFileNameLen); | ||
26 : | airMopAdd(mop, outFileName, airFree, airMopAlways); | ||
27 : | snprintf (outFileName, outFileNameLen, "%s.txt", args->name); | ||
28 : | FILE *outS = fopen(outFileName, "w"); | ||
29 : | if (outS == NULL) { | ||
30 : | fprintf (stderr, "Cannot open output file %s\n", outFileName); | ||
31 : | airMopError(mop); | ||
32 : | exit (8); | ||
33 : | } | ||
34 : | airMopAdd(mop, outS, (airMopper)airFclose, airMopAlways); | ||
35 : | |||
36 : | jhr | 1517 | uint8_t *strandPtr = (uint8_t *)args->inState; |
37 : | lamonts | 1513 | for (int i = 0; i < args->numStrands; i++, strandPtr += args->outputSzb) { |
38 : | jhr | 1517 | |
39 : | jhr | 1518 | if (args->status[i] == DIDEROT_STABLE) { |
40 : | lamonts | 1513 | Diderot_Strands[0]->print (outS, strandPtr); |
41 : | } | ||
42 : | jhr | 1481 | } |
43 : | |||
44 : | airMopOkay(mop); | ||
45 : | } | ||
46 : | |||
47 : | |||
48 : | jhr | 1480 | /*! \brief Output the strand output state to a nrrd or text file. |
49 : | */ | ||
50 : | jhr | 1481 | void Diderot_Output (Output_Args_t *args) |
51 : | nseltzer | 1479 | { |
52 : | airArray *mop = airMopNew(); | ||
53 : | jhr | 1481 | int status; |
54 : | char *err; | ||
55 : | nseltzer | 1479 | |
56 : | jhr | 1481 | // get correct output file name |
57 : | int outFileNameLen = strlen(args->name) + 6; | ||
58 : | char *outFileName = (char *)CheckedAlloc(outFileNameLen); | ||
59 : | airMopAdd(mop, outFileName, airFree, airMopAlways); | ||
60 : | snprintf (outFileName, outFileNameLen, "%s.nrrd", args->name); | ||
61 : | lamonts | 1513 | fprintf(stderr, "%d", 1); |
62 : | jhr | 1481 | // allocate the correct amount of space for output |
63 : | int numStabilized = 0; | ||
64 : | for (int i = 0; i < args->numStrands; i++) { | ||
65 : | jhr | 1518 | if (args->status[i] == DIDEROT_STABLE) |
66 : | jhr | 1481 | numStabilized++; |
67 : | } | ||
68 : | lamonts | 1513 | void *outData = CheckedAlloc(numStabilized * args->outputSzb); |
69 : | jhr | 1481 | airMopAdd(mop, outData, airFree, airMopAlways); |
70 : | lamonts | 1513 | fprintf(stderr, "%d", 2); |
71 : | nseltzer | 1479 | |
72 : | jhr | 1481 | // copy data into outData |
73 : | void *outPos = outData; | ||
74 : | for (int i = 0; i < args->numStrands; i++) { | ||
75 : | jhr | 1518 | if (args->status[i] == DIDEROT_STABLE) { |
76 : | lamonts | 1513 | Diderot_Strands[0]->output (outPos, &args->inState[i]); |
77 : | outPos += args->outputSzb; | ||
78 : | nseltzer | 1479 | } |
79 : | jhr | 1481 | } |
80 : | nseltzer | 1479 | |
81 : | jhr | 1481 | // make a new nrrd |
82 : | Nrrd *outNrrd; | ||
83 : | outNrrd = nrrdNew(); | ||
84 : | if (outNrrd == NULL) { | ||
85 : | fprintf(stderr, "Trouble allocating nrrd struct:\n%s", err); | ||
86 : | airMopError(mop); | ||
87 : | exit(1); | ||
88 : | } | ||
89 : | airMopAdd(mop, outNrrd, (airMopper)nrrdNix, airMopAlways); | ||
90 : | lamonts | 1513 | fprintf(stderr, "%d", 4); |
91 : | nseltzer | 1479 | |
92 : | jhr | 1481 | // wrap the data (outData) with the nrrd (outNrrd) |
93 : | if (args->isArray) { | ||
94 : | size_t *sizes = NEWVEC(size_t, args->nDims + 1); | ||
95 : | airMopAdd(mop, sizes, airFree, airMopAlways); | ||
96 : | switch(Diderot_Strands[0]->nrrdType) { | ||
97 : | jhr | 1483 | case nrrdTypeInt: |
98 : | case nrrdTypeFloat: | ||
99 : | lamonts | 1513 | sizes[0] = args->outputSzb >> 2; |
100 : | jhr | 1481 | break; |
101 : | jhr | 1483 | case nrrdTypeLLong: |
102 : | case nrrdTypeDouble: | ||
103 : | lamonts | 1513 | sizes[0] = args->outputSzb >> 3; |
104 : | jhr | 1481 | break; |
105 : | default: | ||
106 : | fprintf(stderr, "Bad nrrdType\n"); | ||
107 : | nseltzer | 1479 | airMopError(mop); |
108 : | exit(1); | ||
109 : | jhr | 1481 | break; |
110 : | nseltzer | 1479 | } |
111 : | jhr | 1481 | for (int i = 1; i <= args->nDims; i++) { |
112 : | jhr | 1483 | sizes[i] = args->size[args->nDims - i]; |
113 : | jhr | 1481 | } |
114 : | status = nrrdWrap_nva(outNrrd, outData, Diderot_Strands[0]->nrrdType, args->nDims + 1, sizes); | ||
115 : | if (status) { | ||
116 : | err = biffGetDone(NRRD); | ||
117 : | fprintf(stderr, "Trouble wrapping nrrd struct:\n%s", err); | ||
118 : | airMopError(mop); | ||
119 : | free(err); | ||
120 : | exit(1); | ||
121 : | } | ||
122 : | } | ||
123 : | else { | ||
124 : | size_t *sizes = NEWVEC(size_t, 2); | ||
125 : | airMopAdd(mop, sizes, airFree, airMopAlways); | ||
126 : | switch(Diderot_Strands[0]->nrrdType) { | ||
127 : | case nrrdTypeInt: | ||
128 : | case nrrdTypeFloat: | ||
129 : | lamonts | 1513 | sizes[0] = args->outputSzb >> 2; |
130 : | jhr | 1481 | break; |
131 : | case nrrdTypeLLong: | ||
132 : | case nrrdTypeDouble: | ||
133 : | lamonts | 1513 | sizes[0] = args->outputSzb >> 3; |
134 : | jhr | 1481 | break; |
135 : | default: | ||
136 : | fprintf(stderr, "Bad nrrdType\n"); | ||
137 : | nseltzer | 1479 | airMopError(mop); |
138 : | exit(1); | ||
139 : | jhr | 1481 | break; |
140 : | nseltzer | 1479 | } |
141 : | jhr | 1481 | sizes[1] = numStabilized; |
142 : | status = nrrdWrap_nva(outNrrd, outData, Diderot_Strands[0]->nrrdType, args->nDims, sizes); | ||
143 : | if (status != 0) { | ||
144 : | err = biffGetDone(NRRD); | ||
145 : | fprintf(stderr, "Trouble wrapping nrrd struct:\n%s", err); | ||
146 : | airMopError(mop); | ||
147 : | free(err); | ||
148 : | exit(1); | ||
149 : | } | ||
150 : | jhr | 1482 | } |
151 : | lamonts | 1513 | fprintf(stderr, "%d", 5); |
152 : | nseltzer | 1479 | |
153 : | jhr | 1482 | // save the data |
154 : | status = nrrdSave(outFileName, outNrrd, NULL); | ||
155 : | if(status) { | ||
156 : | err = biffGetDone(NRRD); | ||
157 : | fprintf(stderr, "Trouble saving nrrd struct:\n%s", err); | ||
158 : | airMopError(mop); | ||
159 : | free(err); | ||
160 : | exit(1); | ||
161 : | nseltzer | 1479 | } |
162 : | lamonts | 1513 | fprintf(stderr, "%d", 6); |
163 : | nseltzer | 1479 | |
164 : | airMopOkay(mop); | ||
165 : | jhr | 1481 | |
166 : | nseltzer | 1479 | } |
root@smlnj-gforge.cs.uchicago.edu | ViewVC Help |
Powered by ViewVC 1.0.0 |