diff --git a/src/Showinfo.cc b/src/Showinfo.cc index 1d866774b635057541be743a383d7bd7f23b7622..cd5f164ed4f967dcb8b88c15bfa981f450adc018 100644 --- a/src/Showinfo.cc +++ b/src/Showinfo.cc @@ -38,248 +38,389 @@ #include "printinfo.h" #include "cdo_zaxis.h" -void * -Showinfo(void *process) +static void +show_year(CdoStreamID streamID) { - int64_t date0 = 0; - int year, month, day; - int month0 = 0, year0 = 0; + const auto vlistID = cdo_stream_inq_vlist(streamID); + const auto taxisID = vlistInqTaxis(vlistID); + const auto ntsteps = vlistNtsteps(vlistID); + if (ntsteps == 0) return; - cdo_initialize(process); + constexpr int maxOut = 20; + int nout = 0; + int year0 = 0; - // clang-format off - const auto SHOWYEAR = cdo_operator_add("showyear", 0, 0, nullptr); - const auto SHOWMON = cdo_operator_add("showmon", 0, 0, nullptr); - const auto SHOWDATE = cdo_operator_add("showdate", 0, 0, nullptr); - const auto SHOWTIME = cdo_operator_add("showtime", 0, 0, nullptr); - const auto SHOWTIMESTAMP = cdo_operator_add("showtimestamp", 0, 0, nullptr); - const auto SHOWCODE = cdo_operator_add("showcode", 0, 0, nullptr); - const auto SHOWUNIT = cdo_operator_add("showunit", 0, 0, nullptr); - const auto SHOWPARAM = cdo_operator_add("showparam", 0, 0, nullptr); - const auto SHOWNAME = cdo_operator_add("showname", 0, 0, nullptr); - const auto SHOWSTDNAME = cdo_operator_add("showstdname", 0, 0, nullptr); - const auto SHOWLEVEL = cdo_operator_add("showlevel", 0, 0, nullptr); - const auto SHOWLTYPE = cdo_operator_add("showltype", 0, 0, nullptr); - const auto SHOWFORMAT = cdo_operator_add("showformat", 0, 0, nullptr); - const auto SHOWGRID = cdo_operator_add("showgrid", 0, 0, nullptr); - const auto SHOWATTS = cdo_operator_add("showatts", 0, 0, nullptr); - const auto SHOWATTSGLOB = cdo_operator_add("showattsglob", 0, 0, nullptr); - // clang-format on + int tsID = 0; + while (true) + { + const auto nrecs = cdo_stream_inq_timestep(streamID, tsID); + if (nrecs == 0) break; - const auto operatorID = cdo_operator_id(); + const auto vdate = taxisInqVdate(taxisID); + int year, month, day; + cdiDecodeDate(vdate, &year, &month, &day); - operator_check_argc(0); + if (tsID == 0 || year0 != year) + { + nout++; + year0 = year; + fprintf(stdout, " %4d", year0); + if ((nout % maxOut) == 0) fprintf(stdout, "\n"); + } - const auto streamID = cdo_open_read(0); + tsID++; + } + if ((nout % maxOut) != 0) fprintf(stdout, "\n"); +} + +static void +show_mon(CdoStreamID streamID) +{ const auto vlistID = cdo_stream_inq_vlist(streamID); + const auto taxisID = vlistInqTaxis(vlistID); + const auto ntsteps = vlistNtsteps(vlistID); + if (ntsteps == 0) return; - const auto nvars = vlistNvars(vlistID); + constexpr int maxOut = 36; + int nout = 0; + int month0 = 0; + + int tsID = 0; + while (true) + { + const auto nrecs = cdo_stream_inq_timestep(streamID, tsID); + if (nrecs == 0) break; + + const auto vdate = taxisInqVdate(taxisID); + int year, month, day; + cdiDecodeDate(vdate, &year, &month, &day); + + if (tsID == 0 || month0 != month) + { + nout++; + month0 = month; + fprintf(stdout, " %2d", month0); + if ((nout % maxOut) == 0) fprintf(stdout, "\n"); + } + + tsID++; + } + if ((nout % maxOut) != 0) fprintf(stdout, "\n"); +} + +static void +show_date(CdoStreamID streamID) +{ + const auto vlistID = cdo_stream_inq_vlist(streamID); const auto taxisID = vlistInqTaxis(vlistID); const auto ntsteps = vlistNtsteps(vlistID); + if (ntsteps == 0) return; + + constexpr int maxOut = 12; + int nout = 0; + int64_t date0 = 0; - if (operatorID == SHOWYEAR) + int tsID = 0; + while (true) { - int tsID = 0; - if (ntsteps != 0) - while (cdo_stream_inq_timestep(streamID, tsID)) - { - const auto vdate = taxisInqVdate(taxisID); - cdiDecodeDate(vdate, &year, &month, &day); - - if (tsID == 0 || year0 != year) - { - year0 = year; - fprintf(stdout, " %4d", year0); - } - - tsID++; - } - fprintf(stdout, "\n"); + const auto nrecs = cdo_stream_inq_timestep(streamID, tsID); + if (nrecs == 0) break; + + const auto vdate = taxisInqVdate(taxisID); + + if (tsID == 0 || date0 != vdate) + { + nout++; + date0 = vdate; + fprintf(stdout, " %s", date_to_string(vdate).c_str()); + if ((nout % maxOut) == 0) fprintf(stdout, "\n"); + } + + tsID++; } - else if (operatorID == SHOWMON) + if ((nout % maxOut) != 0) fprintf(stdout, "\n"); +} + +static void +show_time(CdoStreamID streamID) +{ + const auto vlistID = cdo_stream_inq_vlist(streamID); + const auto taxisID = vlistInqTaxis(vlistID); + const auto ntsteps = vlistNtsteps(vlistID); + if (ntsteps == 0) return; + + constexpr int maxOut = 12; + int nout = 0; + + int tsID = 0; + while (true) { - int tsID = 0; - if (ntsteps != 0) - while (cdo_stream_inq_timestep(streamID, tsID)) - { - const auto vdate = taxisInqVdate(taxisID); - cdiDecodeDate(vdate, &year, &month, &day); - - if (tsID == 0 || month0 != month) - { - month0 = month; - fprintf(stdout, " %2d", month0); - } - - tsID++; - } - fprintf(stdout, "\n"); + const auto nrecs = cdo_stream_inq_timestep(streamID, tsID); + if (nrecs == 0) break; + + const auto vtime = taxisInqVtime(taxisID); + nout++; + fprintf(stdout, " %s", time_to_string(vtime).c_str()); + if ((nout % maxOut) == 0) fprintf(stdout, "\n"); + + tsID++; } - else if (operatorID == SHOWDATE) + if ((nout % maxOut) != 0) fprintf(stdout, "\n"); +} + +static void +show_timestamp(CdoStreamID streamID) +{ + const auto vlistID = cdo_stream_inq_vlist(streamID); + const auto taxisID = vlistInqTaxis(vlistID); + const auto ntsteps = vlistNtsteps(vlistID); + if (ntsteps == 0) return; + + constexpr int maxOut = 4; + int nout = 0; + + int tsID = 0; + while (true) { - int tsID = 0; - if (ntsteps != 0) - while (cdo_stream_inq_timestep(streamID, tsID)) - { - const auto vdate = taxisInqVdate(taxisID); - if (tsID == 0 || date0 != vdate) - { - date0 = vdate; - fprintf(stdout, " %s", date_to_string(vdate).c_str()); - } - - tsID++; - } - fprintf(stdout, "\n"); + const auto nrecs = cdo_stream_inq_timestep(streamID, tsID); + if (nrecs == 0) break; + + const auto vdate = taxisInqVdate(taxisID); + const auto vtime = taxisInqVtime(taxisID); + nout++; + fprintf(stdout, " %s", datetime_to_string(vdate, vtime).c_str()); + if ((nout % maxOut) == 0) fprintf(stdout, "\n"); + + tsID++; } - else if (operatorID == SHOWTIME) + if ((nout % maxOut) != 0) fprintf(stdout, "\n"); +} + +static void +show_code(CdoStreamID streamID) +{ + const auto vlistID = cdo_stream_inq_vlist(streamID); + const auto nvars = vlistNvars(vlistID); + + constexpr int maxOut = 25; + int nout = 0; + + for (int varID = 0; varID < nvars; varID++) { - int tsID = 0; - if (ntsteps != 0) - while (cdo_stream_inq_timestep(streamID, tsID)) - { - const auto vtime = taxisInqVtime(taxisID); - fprintf(stdout, " %s", time_to_string(vtime).c_str()); - - tsID++; - } - fprintf(stdout, "\n"); + nout++; + fprintf(stdout, " %d", vlistInqVarCode(vlistID, varID)); + if ((nout % maxOut) == 0) fprintf(stdout, "\n"); } - else if (operatorID == SHOWTIMESTAMP) + if ((nout % maxOut) != 0) fprintf(stdout, "\n"); +} + +static void +show_grid(CdoStreamID streamID) +{ + const auto vlistID = cdo_stream_inq_vlist(streamID); + const auto nvars = vlistNvars(vlistID); + + fprintf(stdout, "# param nr | grid nr | z-axis nr: /* Use in combination with operatores: griddes and zaxisdes */\n"); + for (int varID = 0; varID < nvars; varID++) { - int tsID = 0; - if (ntsteps != 0) - while (cdo_stream_inq_timestep(streamID, tsID)) - { - const auto vdate = taxisInqVdate(taxisID); - const auto vtime = taxisInqVtime(taxisID); - fprintf(stdout, " %s", datetime_to_string(vdate, vtime).c_str()); - - tsID++; - } - fprintf(stdout, "\n"); + const auto gridID = vlistInqVarGrid(vlistID, varID); + const auto zaxisID = vlistInqVarZaxis(vlistID, varID); + + fprintf(stdout, " %3d %3d %3d\n", vlistInqVarCode(vlistID, varID), vlistGridIndex(vlistID, gridID) + 1, + vlistZaxisIndex(vlistID, zaxisID) + 1); } - else if (operatorID == SHOWCODE) +} + +static void +show_unit(CdoStreamID streamID) +{ + const auto vlistID = cdo_stream_inq_vlist(streamID); + const auto nvars = vlistNvars(vlistID); + + constexpr int maxOut = 10; + int nout = 0; + + char varunits[CDI_MAX_NAME]; + for (int varID = 0; varID < nvars; varID++) { - for (int varID = 0; varID < nvars; varID++) - { - fprintf(stdout, " %d", vlistInqVarCode(vlistID, varID)); - } - fprintf(stdout, "\n"); + nout++; + varunits[0] = 0; + vlistInqVarUnits(vlistID, varID, varunits); + if (strlen(varunits)) fprintf(stdout, " %s", varunits); + if ((nout % maxOut) == 0) fprintf(stdout, "\n"); } - else if (operatorID == SHOWGRID) + if ((nout % maxOut) != 0) fprintf(stdout, "\n"); +} + +static void +show_param(CdoStreamID streamID) +{ + const auto vlistID = cdo_stream_inq_vlist(streamID); + const auto nvars = vlistNvars(vlistID); + + constexpr int maxOut = 10; + int nout = 0; + + char paramstr[32]; + for (int varID = 0; varID < nvars; varID++) { - fprintf(stdout, "# param nr | grid nr | z-axis nr: /* Use in combination with operatores: griddes and zaxisdes */\n"); - for (int varID = 0; varID < nvars; varID++) - { - const auto gridID = vlistInqVarGrid(vlistID, varID); - const auto zaxisID = vlistInqVarZaxis(vlistID, varID); + nout++; + const auto param = vlistInqVarParam(vlistID, varID); + cdiParamToString(param, paramstr, sizeof(paramstr)); - fprintf(stdout, " %3d %3d %3d\n", vlistInqVarCode(vlistID, varID), vlistGridIndex(vlistID, gridID) + 1, - vlistZaxisIndex(vlistID, zaxisID) + 1); - } + fprintf(stdout, " %s", paramstr); + if ((nout % maxOut) == 0) fprintf(stdout, "\n"); } - else if (operatorID == SHOWUNIT) + if ((nout % maxOut) != 0) fprintf(stdout, "\n"); +} + +static void +show_name(CdoStreamID streamID) +{ + const auto vlistID = cdo_stream_inq_vlist(streamID); + const auto nvars = vlistNvars(vlistID); + + constexpr int maxOut = 10; + int nout = 0; + + char varname[CDI_MAX_NAME]; + for (int varID = 0; varID < nvars; varID++) { - char varunits[CDI_MAX_NAME]; - for (int varID = 0; varID < nvars; varID++) - { - varunits[0] = 0; - vlistInqVarUnits(vlistID, varID, varunits); - if (strlen(varunits)) fprintf(stdout, " %s", varunits); - } - fprintf(stdout, "\n"); + nout++; + vlistInqVarName(vlistID, varID, varname); + fprintf(stdout, " %s", varname); + if ((nout % maxOut) == 0) fprintf(stdout, "\n"); } - else if (operatorID == SHOWPARAM) - { - char paramstr[32]; - for (int varID = 0; varID < nvars; varID++) - { - const auto param = vlistInqVarParam(vlistID, varID); - cdiParamToString(param, paramstr, sizeof(paramstr)); + if ((nout % maxOut) != 0) fprintf(stdout, "\n"); +} - fprintf(stdout, " %s", paramstr); - } - fprintf(stdout, "\n"); - } - else if (operatorID == SHOWNAME) +static void +show_stdname(CdoStreamID streamID) +{ + const auto vlistID = cdo_stream_inq_vlist(streamID); + const auto nvars = vlistNvars(vlistID); + + constexpr int maxOut = 1; + int nout = 0; + + char stdname[CDI_MAX_NAME]; + for (int varID = 0; varID < nvars; varID++) { - char varname[CDI_MAX_NAME]; - for (int varID = 0; varID < nvars; varID++) - { - vlistInqVarName(vlistID, varID, varname); - fprintf(stdout, " %s", varname); - } - fprintf(stdout, "\n"); + nout++; + int length = CDI_MAX_NAME; + cdiInqKeyString(vlistID, varID, CDI_KEY_STDNAME, stdname, &length); + fprintf(stdout, " %s", stdname[0] != 0 ? stdname : "unknown"); + if ((nout % maxOut) == 0) fprintf(stdout, "\n"); } - else if (operatorID == SHOWSTDNAME) + if ((nout % maxOut) != 0) fprintf(stdout, "\n"); +} + +static void +show_level(CdoStreamID streamID) +{ + const auto vlistID = cdo_stream_inq_vlist(streamID); + const auto nvars = vlistNvars(vlistID); + + for (int varID = 0; varID < nvars; varID++) { - char stdname[CDI_MAX_NAME]; - for (int varID = 0; varID < nvars; varID++) - { - int length = CDI_MAX_NAME; - cdiInqKeyString(vlistID, varID, CDI_KEY_STDNAME, stdname, &length); - fprintf(stdout, " %s", stdname[0] != 0 ? stdname : "unknown"); - } + const auto zaxisID = vlistInqVarZaxis(vlistID, varID); + const auto nlevs = zaxisInqSize(zaxisID); + for (int levelID = 0; levelID < nlevs; levelID++) fprintf(stdout, " %.9g", cdo_zaxis_inq_level(zaxisID, levelID)); fprintf(stdout, "\n"); } - else if (operatorID == SHOWLEVEL) +} + +static void +show_ltype(CdoStreamID streamID) +{ + const auto vlistID = cdo_stream_inq_vlist(streamID); + + const auto nzaxis = vlistNzaxis(vlistID); + for (int index = 0; index < nzaxis; index++) { - for (int varID = 0; varID < nvars; varID++) - { - const auto zaxisID = vlistInqVarZaxis(vlistID, varID); - const auto nlevs = zaxisInqSize(zaxisID); - for (int levelID = 0; levelID < nlevs; levelID++) fprintf(stdout, " %.9g", cdo_zaxis_inq_level(zaxisID, levelID)); - fprintf(stdout, "\n"); - } + const auto zaxisID = vlistZaxis(vlistID, index); + const auto ltype = zaxis_to_ltype(zaxisID); + + if (ltype != -1) fprintf(stdout, " %d", ltype); } - else if (operatorID == SHOWLTYPE) + fprintf(stdout, "\n"); +} + +static void +show_atts(int vlistID) +{ + const auto nvars = vlistNvars(vlistID); + + char varname[CDI_MAX_NAME]; + for (int varID = 0; varID < nvars; varID++) { - const auto nzaxis = vlistNzaxis(vlistID); - for (int index = 0; index < nzaxis; index++) - { - const auto zaxisID = vlistZaxis(vlistID, index); - const auto ltype = zaxis_to_ltype(zaxisID); + vlistInqVarName(vlistID, varID, varname); + fprintf(stdout, "%s:\n", varname); - if (ltype != -1) fprintf(stdout, " %d", ltype); - } - fprintf(stdout, "\n"); + int nattsvar; + cdiInqNatts(vlistID, varID, &nattsvar); + print_atts(vlistID, varID, nattsvar, nullptr); } +} + +void * +Showinfo(void *process) +{ + cdo_initialize(process); + + // clang-format off + const auto SHOWYEAR = cdo_operator_add("showyear", 0, 0, nullptr); + const auto SHOWMON = cdo_operator_add("showmon", 0, 0, nullptr); + const auto SHOWDATE = cdo_operator_add("showdate", 0, 0, nullptr); + const auto SHOWTIME = cdo_operator_add("showtime", 0, 0, nullptr); + const auto SHOWTIMESTAMP = cdo_operator_add("showtimestamp", 0, 0, nullptr); + const auto SHOWCODE = cdo_operator_add("showcode", 0, 0, nullptr); + const auto SHOWUNIT = cdo_operator_add("showunit", 0, 0, nullptr); + const auto SHOWPARAM = cdo_operator_add("showparam", 0, 0, nullptr); + const auto SHOWNAME = cdo_operator_add("showname", 0, 0, nullptr); + const auto SHOWSTDNAME = cdo_operator_add("showstdname", 0, 0, nullptr); + const auto SHOWLEVEL = cdo_operator_add("showlevel", 0, 0, nullptr); + const auto SHOWLTYPE = cdo_operator_add("showltype", 0, 0, nullptr); + const auto SHOWFORMAT = cdo_operator_add("showformat", 0, 0, nullptr); + const auto SHOWGRID = cdo_operator_add("showgrid", 0, 0, nullptr); + const auto SHOWATTS = cdo_operator_add("showatts", 0, 0, nullptr); + const auto SHOWATTSGLOB = cdo_operator_add("showattsglob", 0, 0, nullptr); + + const auto operatorID = cdo_operator_id(); + + operator_check_argc(0); + + const auto streamID = cdo_open_read(0); + + if (operatorID == SHOWYEAR) show_year(streamID); + else if (operatorID == SHOWMON) show_mon(streamID); + else if (operatorID == SHOWDATE) show_date(streamID); + else if (operatorID == SHOWTIME) show_time(streamID); + else if (operatorID == SHOWTIMESTAMP) show_timestamp(streamID); + else if (operatorID == SHOWCODE) show_code(streamID); + else if (operatorID == SHOWGRID) show_grid(streamID); + else if (operatorID == SHOWUNIT) show_unit(streamID); + else if (operatorID == SHOWPARAM) show_param(streamID); + else if (operatorID == SHOWNAME) show_name(streamID); + else if (operatorID == SHOWSTDNAME) show_stdname(streamID); + else if (operatorID == SHOWLEVEL) show_level(streamID); + else if (operatorID == SHOWLTYPE) show_ltype(streamID); else if (operatorID == SHOWFORMAT) { + const auto vlistID = cdo_stream_inq_vlist(streamID); print_filetype(streamID, vlistID); } - else if (operatorID == SHOWSTDNAME) - { - char stdname[CDI_MAX_NAME]; - for (int varID = 0; varID < nvars; varID++) - { - int length = CDI_MAX_NAME; - cdiInqKeyString(vlistID, varID, CDI_KEY_STDNAME, stdname, &length); - fprintf(stdout, " %s", stdname[0] != 0 ? stdname : "unknown"); - } - fprintf(stdout, "\n"); - } else if (operatorID == SHOWATTS || operatorID == SHOWATTSGLOB) { - if (operatorID == SHOWATTS) - { - for (int varID = 0; varID < nvars; varID++) - { - char varname[CDI_MAX_NAME]; - vlistInqVarName(vlistID, varID, varname); - fprintf(stdout, "%s:\n", varname); - - int nattsvar; - cdiInqNatts(vlistID, varID, &nattsvar); - print_atts(vlistID, varID, nattsvar, nullptr); - } - } + const auto vlistID = cdo_stream_inq_vlist(streamID); + if (operatorID == SHOWATTS) show_atts(vlistID); + fprintf(stdout, "Global:\n"); int natts; cdiInqNatts(vlistID, CDI_GLOBAL, &natts); print_atts(vlistID, CDI_GLOBAL, natts, nullptr); } + // clang-format on cdo_stream_close(streamID);