#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <netcdf.h>#include "generic.h"#include "ncgen.h"#include "genlib.h"Include dependency graph for load.c:

Go to the source code of this file.
Defines | |
| #define | fpr (void) fprintf |
Functions | |
| static void | tztrim (char *ss) |
| static void | gen_load_c (void *rec_start) |
| static void | fstrcat (char *s, const char *t, size_t *slenp) |
| static void | f_var_init (int varnum, void *rec_start) |
| static void | gen_load_fortran (void *rec_start) |
| int | put_variable (void *rec_start) |
| void | load_netcdf (void *rec_start) |
Variables | |
| int | netcdf_flag |
| int | c_flag |
| int | fortran_flag |
|
|
|
|
||||||||||||
|
Definition at line 303 of file load.c. References derror(), emalloc(), expe2d(), fline(), FORT_MAX_STMNT, fstrcat(), fstring(), atts::lname, NC_BYTE, NC_DOUBLE, NC_FLOAT, NC_INT, NC_SHORT, ndims, rec_dim, type, tztrim(), and var_len. Referenced by gen_load_fortran(). 00307 { 00308 char *val_string; 00309 char *charvalp; 00310 short *shortvalp; 00311 int *intvalp; 00312 float *floatvalp; 00313 double *doublevalp; 00314 char stmnt[FORT_MAX_STMNT]; 00315 size_t stmnt_len; 00316 char s2[FORT_MAX_STMNT]; 00317 int ival; 00318 00319 /* load variable with data values */ 00320 sprintf(stmnt, "data %s /",vars[varnum].lname); 00321 stmnt_len = strlen(stmnt); 00322 switch (vars[varnum].type) { 00323 case NC_BYTE: 00324 charvalp = (char *) rec_start; 00325 for (ival = 0; ival < var_len-1; ival++) { 00326 val_string = fstring(NC_BYTE,(void *)charvalp++,0); 00327 sprintf(s2, "%s, ", val_string); 00328 fstrcat(stmnt, s2, &stmnt_len); 00329 free(val_string); 00330 } 00331 val_string = fstring(NC_BYTE,(void *)charvalp++,0); 00332 fstrcat(stmnt, val_string, &stmnt_len); 00333 free(val_string); 00334 break; 00335 case NC_SHORT: 00336 shortvalp = (short *) rec_start; 00337 for (ival = 0; ival < var_len-1; ival++) { 00338 sprintf(s2, "%d, ", *shortvalp++); 00339 fstrcat(stmnt, s2, &stmnt_len); 00340 } 00341 sprintf(s2, "%d", *shortvalp); 00342 fstrcat(stmnt, s2, &stmnt_len); 00343 break; 00344 case NC_INT: 00345 intvalp = (int *) rec_start; 00346 for (ival = 0; ival < var_len-1; ival++) { 00347 sprintf(s2, "%ld, ", (long)*intvalp++); 00348 fstrcat(stmnt, s2, &stmnt_len); 00349 } 00350 sprintf(s2, "%ld", (long)*intvalp); 00351 fstrcat(stmnt, s2, &stmnt_len); 00352 break; 00353 case NC_FLOAT: 00354 floatvalp = (float *) rec_start; 00355 for (ival = 0; ival < var_len-1; ival++) { 00356 sprintf(s2, "%.8g, ", *floatvalp++); 00357 fstrcat(stmnt, s2, &stmnt_len); 00358 } 00359 sprintf(s2, "%.8g", *floatvalp); 00360 fstrcat(stmnt, s2, &stmnt_len); 00361 break; 00362 case NC_DOUBLE: 00363 doublevalp = (double *) rec_start; 00364 for (ival = 0; ival < var_len-1; ival++) { 00365 sprintf(s2, "%#.16g", *doublevalp++); 00366 tztrim(s2); 00367 expe2d(s2); /* change 'e' to 'd' in exponent */ 00368 fstrcat(s2, ", ", &stmnt_len); 00369 fstrcat(stmnt, s2, &stmnt_len); 00370 } 00371 sprintf(s2, "%#.16g", *doublevalp++); 00372 tztrim(s2); 00373 expe2d(s2); 00374 fstrcat(stmnt, s2, &stmnt_len); 00375 break; 00376 default: 00377 derror("fstrstr: bad type"); 00378 break; 00379 } 00380 fstrcat(stmnt, "/", &stmnt_len); 00381 00382 /* For record variables, store data statement for later use; 00383 otherwise, just print it. */ 00384 if (vars[varnum].ndims > 0 && vars[varnum].dims[0] == rec_dim) { 00385 char *dup_stmnt = emalloc(strlen(stmnt)+1); 00386 strcpy(dup_stmnt, stmnt); /* ULTRIX missing strdup */ 00387 vars[varnum].data_stmnt = dup_stmnt; 00388 } else { 00389 fline(stmnt); 00390 } 00391 }
|
|
||||||||||||||||
|
Definition at line 281 of file load.c. References derror(), fline(), and FORT_MAX_STMNT. Referenced by f_var_init(). 00286 { 00287 *slenp += strlen(t); 00288 if (*slenp >= FORT_MAX_STMNT) { 00289 derror("FORTRAN statement too long: %s",s); 00290 fline(s); 00291 strcpy(s, t); 00292 *slenp = strlen(s); 00293 } else { 00294 strcat(s, t); 00295 } 00296 }
|
|
|
Definition at line 57 of file load.c. References C_MAX_STMNT, cline(), cstrstr(), atts::lname, atts::name, NC_BYTE, NC_CHAR, NC_DOUBLE, NC_FLOAT, NC_INT, NC_SHORT, ncctype(), ncstype(), ndims, rec_dim, type, tztrim(), var_len, and varnum. Referenced by put_variable(). 00060 { 00061 int idim, ival; 00062 char *val_string; 00063 char *charvalp; 00064 short *shortvalp; 00065 int *intvalp; 00066 float *floatvalp; 00067 double *doublevalp; 00068 char stmnt[C_MAX_STMNT]; 00069 size_t stmnt_len; 00070 char s2[C_MAX_STMNT]; 00071 00072 if (!vars[varnum].has_data) 00073 return; 00074 00075 cline(""); 00076 sprintf(stmnt, " {\t\t\t/* store %s */", vars[varnum].name); 00077 cline(stmnt); 00078 00079 if (vars[varnum].ndims > 0) { 00080 if (vars[varnum].dims[0] == rec_dim) { 00081 sprintf(stmnt, " static size_t %s_start[RANK_%s];", 00082 vars[varnum].lname, vars[varnum].lname); 00083 cline(stmnt); 00084 00085 sprintf(stmnt, " static size_t %s_count[RANK_%s];", 00086 vars[varnum].lname, vars[varnum].lname); 00087 cline(stmnt); 00088 } 00089 00090 /* load variable with data values using static initialization */ 00091 sprintf(stmnt, " static %s %s[] = {", 00092 ncctype(vars[varnum].type), 00093 vars[varnum].lname); 00094 00095 stmnt_len = strlen(stmnt); 00096 switch (vars[varnum].type) { 00097 case NC_CHAR: 00098 val_string = cstrstr((char *) rec_start, var_len); 00099 sprintf(s2, "%s", val_string); 00100 strncat(stmnt, s2, C_MAX_STMNT - strlen(stmnt) ); 00101 free(val_string); 00102 break; 00103 default: 00104 switch (vars[varnum].type) { 00105 case NC_BYTE: 00106 charvalp = (char *) rec_start; 00107 break; 00108 case NC_SHORT: 00109 shortvalp = (short *) rec_start; 00110 break; 00111 case NC_INT: 00112 intvalp = (int *) rec_start; 00113 break; 00114 case NC_FLOAT: 00115 floatvalp = (float *) rec_start; 00116 break; 00117 case NC_DOUBLE: 00118 doublevalp = (double *) rec_start; 00119 break; 00120 } 00121 for (ival = 0; ival < var_len-1; ival++) { 00122 switch (vars[varnum].type) { 00123 case NC_BYTE: 00124 sprintf(s2, "%d, ", *charvalp++); 00125 break; 00126 case NC_SHORT: 00127 sprintf(s2, "%d, ", *shortvalp++); 00128 break; 00129 case NC_INT: 00130 sprintf(s2, "%ld, ", (long)*intvalp++); 00131 break; 00132 case NC_FLOAT: 00133 sprintf(s2, "%.8g, ", *floatvalp++); 00134 break; 00135 case NC_DOUBLE: 00136 sprintf(s2, "%#.16g", *doublevalp++); 00137 tztrim(s2); 00138 strcat(s2, ", "); 00139 break; 00140 } 00141 stmnt_len += strlen(s2); 00142 if (stmnt_len < C_MAX_STMNT) 00143 strcat(stmnt, s2); 00144 else { 00145 cline(stmnt); 00146 strcpy(stmnt,s2); 00147 stmnt_len = strlen(stmnt); 00148 } 00149 } 00150 for (;ival < var_len; ival++) { 00151 switch (vars[varnum].type) { 00152 case NC_BYTE: 00153 sprintf(s2, "%d", *charvalp); 00154 break; 00155 case NC_SHORT: 00156 sprintf(s2, "%d", *shortvalp); 00157 break; 00158 case NC_INT: 00159 sprintf(s2, "%ld", (long)*intvalp); 00160 break; 00161 case NC_FLOAT: 00162 sprintf(s2, "%.8g", *floatvalp); 00163 break; 00164 case NC_DOUBLE: 00165 sprintf(s2, "%#.16g", *doublevalp++); 00166 tztrim(s2); 00167 break; 00168 } 00169 stmnt_len += strlen(s2); 00170 if (stmnt_len < C_MAX_STMNT) 00171 strcat(stmnt, s2); 00172 else { 00173 cline(stmnt); 00174 strcpy(stmnt,s2); 00175 stmnt_len = strlen(stmnt); 00176 } 00177 } 00178 break; 00179 } 00180 strcat(stmnt,"};"); 00181 cline(stmnt); 00182 00183 if (vars[varnum].dims[0] == rec_dim) { 00184 sprintf(stmnt, 00185 " %s_len = %lu; /* number of records of %s data */", 00186 dims[rec_dim].lname, 00187 (unsigned long)vars[varnum].nrecs, /* number of recs for this variable */ 00188 vars[varnum].name); 00189 cline(stmnt); 00190 00191 for (idim = 0; idim < vars[varnum].ndims; idim++) { 00192 sprintf(stmnt, " %s_start[%d] = 0;", 00193 vars[varnum].lname, 00194 idim); 00195 cline(stmnt); 00196 } 00197 00198 for (idim = 0; idim < vars[varnum].ndims; idim++) { 00199 sprintf(stmnt, " %s_count[%d] = %s_len;", 00200 vars[varnum].lname, 00201 idim, 00202 dims[vars[varnum].dims[idim]].lname); 00203 cline(stmnt); 00204 } 00205 } 00206 00207 if (vars[varnum].dims[0] == rec_dim) { 00208 sprintf(stmnt, 00209 " stat = nc_put_vara_%s(ncid, %s_id, %s_start, %s_count, %s);", 00210 ncstype(vars[varnum].type), 00211 vars[varnum].lname, 00212 vars[varnum].lname, 00213 vars[varnum].lname, 00214 vars[varnum].lname); 00215 } else { /* non-record variables */ 00216 sprintf(stmnt, 00217 " stat = nc_put_var_%s(ncid, %s_id, %s);", 00218 ncstype(vars[varnum].type), 00219 vars[varnum].lname, 00220 vars[varnum].lname); 00221 } 00222 cline(stmnt); 00223 } else { /* scalar variables */ 00224 /* load variable with data values using static initialization */ 00225 sprintf(stmnt, " static %s %s = ", 00226 ncctype(vars[varnum].type), 00227 vars[varnum].lname); 00228 00229 switch (vars[varnum].type) { 00230 case NC_CHAR: 00231 val_string = cstrstr((char *) rec_start, var_len); 00232 val_string[strlen(val_string)-1] = '\0'; 00233 sprintf(s2, "'%s'", &val_string[1]); 00234 free(val_string); 00235 break; 00236 case NC_BYTE: 00237 charvalp = (char *) rec_start; 00238 sprintf(s2, "%d", *charvalp); 00239 break; 00240 case NC_SHORT: 00241 shortvalp = (short *) rec_start; 00242 sprintf(s2, "%d", *shortvalp); 00243 break; 00244 case NC_INT: 00245 intvalp = (int *) rec_start; 00246 sprintf(s2, "%ld", (long)*intvalp); 00247 break; 00248 case NC_FLOAT: 00249 floatvalp = (float *) rec_start; 00250 sprintf(s2, "%.8g", *floatvalp); 00251 break; 00252 case NC_DOUBLE: 00253 doublevalp = (double *) rec_start; 00254 sprintf(s2, "%#.16g", *doublevalp++); 00255 tztrim(s2); 00256 break; 00257 } 00258 strncat(stmnt, s2, C_MAX_STMNT - strlen(stmnt) ); 00259 strcat(stmnt,";"); 00260 cline(stmnt); 00261 sprintf(stmnt, 00262 " stat = nc_put_var_%s(ncid, %s_id, &%s);", 00263 ncstype(vars[varnum].type), 00264 vars[varnum].lname, 00265 vars[varnum].lname); 00266 cline(stmnt); 00267 } 00268 cline(" check_err(stat,__LINE__,__FILE__);"); 00269 cline(" }"); 00270 }
|
|
|
Definition at line 396 of file load.c. References vars::data_stmnt, vars::dims, f_var_init(), fline(), FORT_MAX_STMNT, fstrstr(), vars::has_data, vars::lname, vars::name, NC_CHAR, vars::ndims, nfftype(), rec_dim, vars::type, valnum, and varnum. Referenced by put_variable(). 00399 { 00400 char stmnt[FORT_MAX_STMNT]; 00401 struct vars *v = &vars[varnum]; 00402 00403 if (!v->has_data) 00404 return; 00405 00406 if (v->ndims == 0 || v->dims[0] != rec_dim) { 00407 sprintf(stmnt, "* store %s", v->name); 00408 fline(stmnt); 00409 } 00410 00411 /* generate code to initialize variable with values found in CDL input */ 00412 if (v->type != NC_CHAR) { 00413 f_var_init(varnum, rec_start); 00414 } else { 00415 v->data_stmnt = fstrstr(rec_start, valnum); 00416 } 00417 00418 if (v->ndims >0 && v->dims[0] == rec_dim) { 00419 return; 00420 } 00421 if (v->type != NC_CHAR) { 00422 sprintf(stmnt, "iret = nf_put_var_%s(ncid, %s_id, %s)", 00423 nfftype(v->type), v->lname, v->lname); 00424 } else { 00425 char *char_expr = fstrstr(rec_start, valnum); 00426 sprintf(stmnt, "iret = nf_put_var_%s(ncid, %s_id, %s)", 00427 nfftype(v->type), v->lname, char_expr); 00428 free(char_expr); 00429 } 00430 00431 fline(stmnt); 00432 fline("call check_err(iret)"); 00433 }
|
|
|
Definition at line 463 of file load.c. References check_err(), NC_BYTE, NC_CHAR, NC_DOUBLE, NC_FLOAT, NC_INT, NC_MAX_VAR_DIMS, NC_NOERR, nc_put_vara_double, nc_put_vara_float, nc_put_vara_int, nc_put_vara_schar, nc_put_vara_short, nc_put_vara_text, NC_SHORT, ncid, ndims, rec_dim, type, and varnum. Referenced by put_variable(). 00466 { 00467 int idim; 00468 int stat = NC_NOERR; 00469 size_t start[NC_MAX_VAR_DIMS]; 00470 size_t count[NC_MAX_VAR_DIMS]; 00471 char *charvalp; 00472 short *shortvalp; 00473 int *intvalp; 00474 float *floatvalp; 00475 double *doublevalp; 00476 00477 /* load values into variable */ 00478 00479 switch (vars[varnum].type) { 00480 case NC_CHAR: 00481 case NC_BYTE: 00482 charvalp = (char *) rec_start; 00483 break; 00484 case NC_SHORT: 00485 shortvalp = (short *) rec_start; 00486 break; 00487 case NC_INT: 00488 intvalp = (int *) rec_start; 00489 break; 00490 case NC_FLOAT: 00491 floatvalp = (float *) rec_start; 00492 break; 00493 case NC_DOUBLE: 00494 doublevalp = (double *) rec_start; 00495 break; 00496 } 00497 if (vars[varnum].ndims > 0) { 00498 /* initialize start to upper left corner (0,0,0,...) */ 00499 start[0] = 0; 00500 if (vars[varnum].dims[0] == rec_dim) { 00501 count[0] = vars[varnum].nrecs; 00502 } 00503 else { 00504 count[0] = dims[vars[varnum].dims[0]].size; 00505 } 00506 } 00507 00508 for (idim = 1; idim < vars[varnum].ndims; idim++) { 00509 start[idim] = 0; 00510 count[idim] = dims[vars[varnum].dims[idim]].size; 00511 } 00512 00513 switch (vars[varnum].type) { 00514 case NC_BYTE: 00515 stat = nc_put_vara_schar(ncid, varnum, start, count, 00516 (signed char *)charvalp); 00517 break; 00518 case NC_CHAR: 00519 stat = nc_put_vara_text(ncid, varnum, start, count, charvalp); 00520 break; 00521 case NC_SHORT: 00522 stat = nc_put_vara_short(ncid, varnum, start, count, shortvalp); 00523 break; 00524 case NC_INT: 00525 stat = nc_put_vara_int(ncid, varnum, start, count, intvalp); 00526 break; 00527 case NC_FLOAT: 00528 stat = nc_put_vara_float(ncid, varnum, start, count, floatvalp); 00529 break; 00530 case NC_DOUBLE: 00531 stat = nc_put_vara_double(ncid, varnum, start, count, doublevalp); 00532 break; 00533 } 00534 check_err(stat); 00535 }
|
|
|
Definition at line 446 of file load.c. References c_flag, fortran_flag, gen_load_c(), gen_load_fortran(), load_netcdf(), and netcdf_flag. Referenced by yyparse(). 00449 { 00450 if (netcdf_flag) 00451 load_netcdf(rec_start); /* put variable values */ 00452 if (c_flag) /* create C code to put values */ 00453 gen_load_c(rec_start); 00454 if (fortran_flag) /* create Fortran code to put values */ 00455 gen_load_fortran(rec_start); 00456 00457 return 0; 00458 }
|
|
|
Definition at line 29 of file load.c. 00032 { 00033 char *cp, *ep; 00034 00035 cp = ss; 00036 if (*cp == '-') 00037 cp++; 00038 while(isdigit((int)*cp) || *cp == '.') 00039 cp++; 00040 if (*--cp == '.') 00041 return; 00042 ep = cp+1; 00043 while (*cp == '0') 00044 cp--; 00045 cp++; 00046 if (cp == ep) 00047 return; 00048 while (*ep) 00049 *cp++ = *ep++; 00050 *cp = '\0'; 00051 return; 00052 }
|
|
|
|
|
|
|
|
|
|
1.4.4