00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #pragma ident "@(#) libf/fio/wnl90to77.c 92.2 06/21/99 10:37:55"
00039
00040 #include <stdio.h>
00041 #include <errno.h>
00042 #include <cray/nassert.h>
00043 #include <liberrno.h>
00044 #include "fio.h"
00045 #include "namelist.h"
00046 #include "wnl90def.h"
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 int
00073 _wnl90to77(
00074 FIOSPTR css,
00075 unit *cup,
00076 nmlist_group *namlist,
00077 void *stck,
00078 int errf)
00079 {
00080 register int errn;
00081 char *wptr;
00082 unsigned long wlen;
00083 unsigned wcount;
00084 int icnt;
00085 char *varptr;
00086 unsigned long varlen;
00087 nmlist_goli_t *nlvar;
00088 long eqlchr;
00089 long sepchr;
00090 long nlchr;
00091 long trmchr;
00092 int trmsize;
00093
00094
00095
00096
00097
00098 errn = 0;
00099 wcount = namlist->icount;
00100
00101
00102
00103 eqlchr = OUT_EQ;
00104 sepchr = OUT_SEP;
00105 nlchr = OUT_CHAR;
00106 trmchr = OUT_CHAR;
00107 trmsize = 6;
00108 NLCHAR(OUT_ECHO);
00109 NLCHAR(nlchr);
00110
00111 wptr = _fcdtocp(namlist->group_name);
00112 wlen = _fcdlen(namlist->group_name);
00113
00114
00115
00116 if ((wlen + 4) > cup->unmlsize) {
00117 errn = FENLNMSZ;
00118 ERROR0(errf, css, errn);
00119 }
00120
00121
00122
00123 for (icnt = 0; icnt < wlen; icnt++) {
00124 *cup->ulineptr++ = *wptr++;
00125 cup->ulinemax++;
00126 }
00127
00128 NLCHAR(' ');
00129 NLCHAR(' ');
00130
00131
00132
00133 NLINE();
00134
00135 nlvar = namlist->goli;
00136
00137 while (wcount-- && (errn == 0)) {
00138 varptr = _fcdtocp(nlvar->goli_name);
00139 varlen = _fcdlen(nlvar->goli_name);
00140
00141
00142
00143 if (varlen > cup->unmlsize) {
00144
00145 errn = FENLNMSZ;
00146 ERROR0(errf, css, errn);
00147 }
00148 else
00149 if (varlen > (cup->unmlsize - cup->ulinemax)) {
00150 NLWFLUSH();
00151 NLCHAR(' ');
00152 NLCHAR(' ');
00153 }
00154
00155
00156
00157 for (icnt = 0; icnt < varlen; icnt++) {
00158 *cup->ulineptr++ = varptr[icnt];
00159 cup->ulinemax++;
00160 }
00161
00162
00163
00164 if ((cup->unmlsize - cup->ulinemax) < 3) {
00165 NLWFLUSH();
00166 NLCHAR(' ');
00167 }
00168
00169
00170
00171 NLCHAR(' ');
00172 NLCHAR(eqlchr);
00173 NLCHAR(' ');
00174
00175
00176
00177 css->u.fmt.u.le.ldwinit = 1;
00178
00179
00180
00181 switch (nlvar->valtype) {
00182
00183 case IO_SCALAR:
00184 {
00185 void *vaddr;
00186 type_packet tip;
00187 nmlist_scalar_t *nlscalar;
00188
00189 nlscalar = nlvar->goli_addr.ptr;
00190 tip.type90 = nlscalar->tinfo.type;
00191 tip.type77 = -1;
00192 tip.intlen = nlscalar->tinfo.int_len;
00193 tip.extlen = tip.intlen;
00194 tip.elsize = tip.intlen >> 3;
00195 tip.cnvindx = 0;
00196 tip.count = 1;
00197 tip.stride = 1;
00198
00199
00200
00201 assert (tip.type90 >= DVTYPE_TYPELESS &&
00202 tip.type90 <= DVTYPE_ASCII);
00203 assert (tip.intlen > 0);
00204
00205 if (tip.type90 == DVTYPE_ASCII) {
00206 vaddr = _fcdtocp(nlscalar->scal_addr.charptr);
00207
00208 tip.elsize = tip.elsize *
00209 _fcdlen(nlscalar->scal_addr.charptr);
00210 }
00211 else
00212 vaddr = nlscalar->scal_addr.ptr;
00213
00214
00215
00216 if ((tip.type90 == DVTYPE_COMPLEX &&
00217 tip.elsize == (sizeof(_f_dble) * 2)))
00218 errn = FENLDBCP;
00219 else
00220 errn = _ld_write(css, cup, vaddr, &tip, 0);
00221
00222 break;
00223 }
00224
00225 case IO_DOPEVEC:
00226 {
00227 register short nc;
00228 register long extent;
00229 void *vaddr;
00230 type_packet tip;
00231 DopeVectorType *nldv;
00232
00233 nldv = nlvar->goli_addr.dv;
00234
00235
00236
00237 assert (nldv != NULL);
00238 assert (nldv->type_lens.int_len > 0);
00239
00240 tip.type90 = nldv->type_lens.type;
00241 tip.type77 = -1;
00242 tip.intlen = nldv->type_lens.int_len;
00243 tip.extlen = tip.intlen;
00244 tip.elsize = tip.intlen >> 3;
00245 tip.cnvindx = 0;
00246 tip.stride = 1;
00247
00248 if (tip.type90 == DVTYPE_ASCII) {
00249 vaddr = _fcdtocp(nldv->base_addr.charptr);
00250 tip.elsize = tip.elsize *
00251 _fcdlen(nldv->base_addr.charptr);
00252 }
00253 else
00254 vaddr = nldv->base_addr.a.ptr;
00255
00256 extent = 1;
00257
00258 for (nc = 0; nc < nldv->n_dim; nc++)
00259 extent = extent * nldv->dimension[nc].extent;
00260
00261 tip.count = extent;
00262
00263
00264
00265 assert (tip.elsize > 0 && extent > 0);
00266
00267
00268
00269 if ((tip.type90 == DVTYPE_COMPLEX &&
00270 tip.elsize == (sizeof(_f_dble) * 2)))
00271 errn = FENLDBCP;
00272 else
00273 errn = _ld_write(css, cup, vaddr, &tip, 0);
00274
00275 break;
00276 }
00277
00278 case IO_STRUC_A:
00279 case IO_STRUC_S:
00280 {
00281
00282 errn = FENLSTCT;
00283 }
00284
00285 default:
00286 errn = FEINTUNK;
00287 }
00288
00289 if (errn != 0) {
00290 ERROR0(errf, css, errn);
00291 }
00292
00293
00294
00295 errn = _ld_write(css, cup, (void *) NULL, &__tip_null, 0);
00296
00297 if (errn != 0) {
00298 ERROR0(errf, css, errn);
00299 }
00300
00301 if (wcount > 0) {
00302 if ((cup->unmlsize - cup->ulinemax) < 2) {
00303 NLWFLUSH();
00304 NLCHAR(' ');
00305 NLCHAR(' ');
00306 css->u.fmt.u.le.ldwinit = 1;
00307 }
00308 else {
00309 NLCHAR(sepchr);
00310 NLCHAR(' ');
00311 css->u.fmt.u.le.ldwinit = 1;
00312 NLINE();
00313 }
00314 }
00315
00316 #if defined(__mips) && (_MIPS_SZLONG == 32)
00317 nlvar = (nmlist_goli_t*)((long *)nlvar + 3 +
00318 (sizeof(_fcd))/(sizeof(long)));
00319 #else
00320 nlvar = (nmlist_goli_t*)((long *)nlvar + 2 +
00321 (sizeof(_fcd))/(sizeof(long)));
00322 #endif
00323 }
00324
00325 if (cup->ulinemax > 2) {
00326 NLINE();
00327 }
00328
00329 if ((cup->unmlsize - cup->ulinemax) < trmsize) {
00330 NLWFLUSH();
00331 NLCHAR(' ');
00332 }
00333
00334
00335
00336 NLCHAR(' ');
00337 NLCHAR(trmchr);
00338 NLCHAR('E');
00339 NLCHAR('N');
00340 NLCHAR('D');
00341 NLWFLUSH();
00342
00343 if (errn != 0)
00344 cup->uflag = cup->uflag | _UERRC;
00345
00346
00347
00348
00349
00350
00351 finalization:
00352 return(errn);
00353 }