| /*****************************************************************************\ |
| * print.c - definitions for all printing functions. |
| ***************************************************************************** |
| * Copyright (C) 2008 Lawrence Livermore National Security. |
| * Copyright (C) 2002-2007 The Regents of the University of California. |
| * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). |
| * Written by Danny Auble <da@llnl.gov> |
| * CODE-OCEC-09-009. All rights reserved. |
| * |
| * This file is part of SLURM, a resource management program. |
| * For details, see <http://slurm.schedmd.com/>. |
| * Please also read the included file: DISCLAIMER. |
| * |
| * SLURM is free software; you can redistribute it and/or modify it under |
| * the terms of the GNU General Public License as published by the Free |
| * Software Foundation; either version 2 of the License, or (at your option) |
| * any later version. |
| * |
| * In addition, as a special exception, the copyright holders give permission |
| * to link the code of portions of this program with the OpenSSL library under |
| * certain conditions as described in each individual source file, and |
| * distribute linked combinations including the two. You must obey the GNU |
| * General Public License in all respects for all of the code used other than |
| * OpenSSL. If you modify file(s) with this exception, you may extend this |
| * exception to your version of the file(s), but you are not obligated to do |
| * so. If you do not wish to do so, delete this exception statement from your |
| * version. If you delete this exception statement from all source files in |
| * the program, then also delete it here. |
| * |
| * SLURM is distributed in the hope that it will be useful, but WITHOUT ANY |
| * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
| * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more |
| * details. |
| * |
| * You should have received a copy of the GNU General Public License along |
| * with SLURM; if not, write to the Free Software Foundation, Inc., |
| * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
| \*****************************************************************************/ |
| #include "src/common/print_fields.h" |
| #include "src/common/parse_time.h" |
| #include "src/common/read_config.h" |
| |
| int print_fields_parsable_print = 0; |
| int print_fields_have_header = 1; |
| |
| extern void destroy_print_field(void *object) |
| { |
| print_field_t *field = (print_field_t *)object; |
| |
| if (field) { |
| xfree(field->name); |
| xfree(field); |
| } |
| } |
| |
| extern void print_fields_header(List print_fields_list) |
| { |
| ListIterator itr = NULL; |
| print_field_t *field = NULL; |
| int curr_inx = 1; |
| int field_count = 0; |
| |
| if (!print_fields_list || !print_fields_have_header) |
| return; |
| |
| field_count = list_count(print_fields_list); |
| |
| itr = list_iterator_create(print_fields_list); |
| while ((field = list_next(itr))) { |
| if (print_fields_parsable_print |
| == PRINT_FIELDS_PARSABLE_NO_ENDING |
| && (curr_inx == field_count)) |
| printf("%s", field->name); |
| else if (print_fields_parsable_print) |
| printf("%s|", field->name); |
| else { |
| int abs_len = abs(field->len); |
| printf("%*.*s ", abs_len, abs_len, field->name); |
| } |
| curr_inx++; |
| } |
| list_iterator_reset(itr); |
| printf("\n"); |
| if (print_fields_parsable_print) |
| return; |
| while ((field = list_next(itr))) { |
| int abs_len = abs(field->len); |
| printf("%*.*s ", abs_len, abs_len, |
| "-----------------------------------------------------"); |
| } |
| list_iterator_destroy(itr); |
| printf("\n"); |
| } |
| |
| extern void print_fields_date(print_field_t *field, time_t value, int last) |
| { |
| int abs_len = abs(field->len); |
| char temp_char[abs_len+1]; |
| |
| slurm_make_time_str(&value, (char *)temp_char, sizeof(temp_char)); |
| if (print_fields_parsable_print == PRINT_FIELDS_PARSABLE_NO_ENDING |
| && last) |
| printf("%s", temp_char); |
| else if (print_fields_parsable_print) |
| printf("%s|", temp_char); |
| else if (field->len == abs_len) |
| printf("%*.*s ", abs_len, abs_len, temp_char); |
| else |
| printf("%-*.*s ", abs_len, abs_len, temp_char); |
| } |
| |
| extern void print_fields_str(print_field_t *field, char *value, int last) |
| { |
| int abs_len = abs(field->len); |
| char temp_char[abs_len+1]; |
| char *print_this = NULL; |
| if (!value) { |
| if (print_fields_parsable_print) |
| print_this = ""; |
| else |
| print_this = " "; |
| } else |
| print_this = value; |
| |
| if (print_fields_parsable_print == PRINT_FIELDS_PARSABLE_NO_ENDING |
| && last) |
| printf("%s", print_this); |
| else if (print_fields_parsable_print) |
| printf("%s|", print_this); |
| else { |
| if (value) { |
| int len = strlen(value); |
| memcpy(&temp_char, value, MIN(len, abs_len) + 1); |
| |
| if (len > abs_len) |
| temp_char[abs_len-1] = '+'; |
| print_this = temp_char; |
| } |
| |
| if (field->len == abs_len) |
| printf("%*.*s ", abs_len, abs_len, print_this); |
| else |
| printf("%-*.*s ", abs_len, abs_len, print_this); |
| } |
| } |
| |
| extern void print_fields_int(print_field_t *field, int value, int last) |
| { |
| int abs_len = abs(field->len); |
| /* (value == unset) || (value == cleared) */ |
| if ((value == (int)NO_VAL) || (value == (int)INFINITE)) { |
| if (print_fields_parsable_print |
| == PRINT_FIELDS_PARSABLE_NO_ENDING |
| && last) |
| ; |
| else if (print_fields_parsable_print) |
| printf("|"); |
| else |
| printf("%*s ", abs_len, " "); |
| } else { |
| if (print_fields_parsable_print |
| == PRINT_FIELDS_PARSABLE_NO_ENDING |
| && last) |
| printf("%d", value); |
| else if (print_fields_parsable_print) |
| printf("%d|", value); |
| else if (field->len == abs_len) |
| printf("%*d ", abs_len, value); |
| else |
| printf("%-*d ", abs_len, value); |
| } |
| } |
| |
| /* print_fields_t->print_routine does not like uint16_t being passed |
| * in so pass in a uint32_t and typecast. |
| */ |
| extern void print_fields_uint16(print_field_t *field, uint32_t value, int last) |
| { |
| int abs_len = abs(field->len); |
| /* (value == unset) || (value == cleared) */ |
| if (((uint16_t)value == (uint16_t)NO_VAL) |
| || ((uint16_t)value == (uint16_t)INFINITE)) { |
| if (print_fields_parsable_print |
| == PRINT_FIELDS_PARSABLE_NO_ENDING |
| && last) |
| ; |
| else if (print_fields_parsable_print) |
| printf("|"); |
| else |
| printf("%*s ", field->len, " "); |
| } else { |
| if (print_fields_parsable_print |
| == PRINT_FIELDS_PARSABLE_NO_ENDING |
| && last) |
| printf("%u", value); |
| else if (print_fields_parsable_print) |
| printf("%u|", value); |
| else if (field->len == abs_len) |
| printf("%*u ", abs_len, value); |
| else |
| printf("%-*u ", abs_len, value); |
| } |
| } |
| |
| extern void print_fields_uint32(print_field_t *field, uint32_t value, int last) |
| { |
| int abs_len = abs(field->len); |
| /* (value == unset) || (value == cleared) */ |
| if ((value == NO_VAL) || (value == INFINITE)) { |
| if (print_fields_parsable_print |
| == PRINT_FIELDS_PARSABLE_NO_ENDING |
| && last) |
| ; |
| else if (print_fields_parsable_print) |
| printf("|"); |
| else |
| printf("%*s ", field->len, " "); |
| } else { |
| if (print_fields_parsable_print |
| == PRINT_FIELDS_PARSABLE_NO_ENDING |
| && last) |
| printf("%u", value); |
| else if (print_fields_parsable_print) |
| printf("%u|", value); |
| else if (field->len == abs_len) |
| printf("%*u ", abs_len, value); |
| else |
| printf("%-*u ", abs_len, value); |
| } |
| } |
| |
| extern void print_fields_uint64(print_field_t *field, uint64_t value, int last) |
| { |
| int abs_len = abs(field->len); |
| |
| /* (value == unset) || (value == cleared) */ |
| if ((value == (uint64_t)NO_VAL) || (value == (uint64_t)INFINITE)) { |
| if (print_fields_parsable_print |
| == PRINT_FIELDS_PARSABLE_NO_ENDING |
| && last) |
| ; |
| else if (print_fields_parsable_print) |
| printf("|"); |
| else |
| printf("%*s ", field->len, " "); |
| } else { |
| if (print_fields_parsable_print |
| == PRINT_FIELDS_PARSABLE_NO_ENDING |
| && last) |
| printf("%llu", (long long unsigned) value); |
| else if (print_fields_parsable_print) |
| printf("%llu|", (long long unsigned) value); |
| else if (field->len == abs_len) |
| printf("%*llu ", abs_len, (long long unsigned) value); |
| else |
| printf("%-*llu ", abs_len, (long long unsigned) value); |
| } |
| } |
| |
| extern void print_fields_double(print_field_t *field, double value, int last) |
| { |
| int abs_len = abs(field->len); |
| /* (value == unset) || (value == cleared) */ |
| if ((value == (double)NO_VAL) || (value == (double)INFINITE)) { |
| if (print_fields_parsable_print |
| == PRINT_FIELDS_PARSABLE_NO_ENDING |
| && last) |
| ; |
| else if (print_fields_parsable_print) |
| printf("|"); |
| else |
| printf("%*s ", field->len, " "); |
| } else { |
| if (print_fields_parsable_print |
| == PRINT_FIELDS_PARSABLE_NO_ENDING |
| && last) |
| printf("%f", value); |
| else if (print_fields_parsable_print) |
| printf("%f|", value); |
| else if (field->len == abs_len) |
| printf("%*f ", abs_len, value); |
| else |
| printf("%-*f ", abs_len, value); |
| } |
| } |
| |
| extern void print_fields_long_double( |
| print_field_t *field, long double value, int last) |
| { |
| int abs_len = abs(field->len); |
| /* (value == unset) || (value == cleared) */ |
| if ((value == (long double)NO_VAL) |
| || (value == (long double)INFINITE)) { |
| if (print_fields_parsable_print |
| == PRINT_FIELDS_PARSABLE_NO_ENDING |
| && last) |
| ; |
| else if (print_fields_parsable_print) |
| printf("|"); |
| else |
| printf("%*s ", field->len, " "); |
| } else { |
| if (print_fields_parsable_print |
| == PRINT_FIELDS_PARSABLE_NO_ENDING |
| && last) |
| printf("%Lf", value); |
| else if (print_fields_parsable_print) |
| printf("%Lf|", value); |
| else if (field->len == abs_len) |
| printf("%*Lf ", abs_len, value); |
| else |
| printf("%-*Lf ", abs_len, value); |
| } |
| |
| } |
| |
| extern void print_fields_time(print_field_t *field, uint64_t value, int last) |
| { |
| int abs_len = abs(field->len); |
| /* (value == unset) || (value == cleared) */ |
| if ((value == (uint64_t)NO_VAL) || (value == (uint64_t)INFINITE)) { |
| if (print_fields_parsable_print |
| == PRINT_FIELDS_PARSABLE_NO_ENDING |
| && last) |
| ; |
| else if (print_fields_parsable_print) |
| printf("|"); |
| else |
| printf("%*s ", field->len, " "); |
| } else { |
| char time_buf[32]; |
| mins2time_str((time_t) value, time_buf, sizeof(time_buf)); |
| if (print_fields_parsable_print |
| == PRINT_FIELDS_PARSABLE_NO_ENDING |
| && last) |
| printf("%s", time_buf); |
| else if (print_fields_parsable_print) |
| printf("%s|", time_buf); |
| else if (field->len == abs_len) |
| printf("%*s ", abs_len, time_buf); |
| else |
| printf("%-*s ", abs_len, time_buf); |
| } |
| } |
| |
| extern void print_fields_time_from_secs(print_field_t *field, |
| uint64_t value, int last) |
| { |
| int abs_len = abs(field->len); |
| /* (value == unset) || (value == cleared) */ |
| if ((value == (uint64_t)NO_VAL) || (value == (uint64_t)INFINITE)) { |
| if (print_fields_parsable_print |
| == PRINT_FIELDS_PARSABLE_NO_ENDING |
| && last) |
| ; |
| else if (print_fields_parsable_print) |
| printf("|"); |
| else |
| printf("%*s ", field->len, " "); |
| } else { |
| char time_buf[32]; |
| secs2time_str((time_t) value, time_buf, sizeof(time_buf)); |
| if (print_fields_parsable_print |
| == PRINT_FIELDS_PARSABLE_NO_ENDING |
| && last) |
| printf("%s", time_buf); |
| else if (print_fields_parsable_print) |
| printf("%s|", time_buf); |
| else if (field->len == abs_len) |
| printf("%*s ", abs_len, time_buf); |
| else |
| printf("%-*s ", abs_len, time_buf); |
| } |
| } |
| |
| extern void print_fields_char_list(print_field_t *field, List value, int last) |
| { |
| int abs_len = abs(field->len); |
| ListIterator itr = NULL; |
| char *print_this = NULL; |
| char *object = NULL; |
| |
| if (!value || !list_count(value)) { |
| if (print_fields_parsable_print) |
| print_this = xstrdup(""); |
| else |
| print_this = xstrdup(" "); |
| } else { |
| list_sort(value, (ListCmpF)slurm_sort_char_list_asc); |
| itr = list_iterator_create(value); |
| while ((object = list_next(itr))) { |
| if (print_this) |
| xstrfmtcat(print_this, ",%s", object); |
| else |
| print_this = xstrdup(object); |
| } |
| list_iterator_destroy(itr); |
| } |
| |
| if (print_fields_parsable_print == PRINT_FIELDS_PARSABLE_NO_ENDING |
| && last) |
| printf("%s", print_this); |
| else if (print_fields_parsable_print) |
| printf("%s|", print_this); |
| else if (print_this) { |
| if (strlen(print_this) > abs_len) |
| print_this[abs_len-1] = '+'; |
| |
| if (field->len == abs_len) |
| printf("%*.*s ", abs_len, abs_len, print_this); |
| else |
| printf("%-*.*s ", abs_len, abs_len, print_this); |
| } |
| xfree(print_this); |
| } |