X-Git-Url: http://git.tuebingen.mpg.de/?p=adu.git;a=blobdiff_plain;f=format.c;h=94315e95fee7411b12b2a7d302a9efd5b2cff62e;hp=f6b1f48d102d9762696de1345fd61cdce9c83c28;hb=59e83bcfc11c56094c3d02c78c36556ac1fca5ae;hpb=22dc8e380d27b93a70d49c8a49f139ccf59d6f60 diff --git a/format.c b/format.c index f6b1f48..94315e9 100644 --- a/format.c +++ b/format.c @@ -1,10 +1,10 @@ /* - * Copyright (C) 2008 Andre Noll + * Copyright (C) 2008 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ -/** \file format.c Functions for pretty-printing numbers and strings. */ +/** \file format.c \brief Functions for pretty-printing numbers and strings. */ #include /* readdir() */ #include "adu.h" @@ -13,12 +13,14 @@ #include "string.h" #include "error.h" #include "format.h" + +/** The three different alignment types. */ enum alignment {ALIGN_LEFT, ALIGN_RIGHT, ALIGN_CENTER}; struct num_format { enum alignment align; char unit; - int supress_unit; + int suppress_unit; }; struct string_format { @@ -127,17 +129,17 @@ static int parse_atom(char *ap, struct atom *atoms, struct format_item **result) case AT_ID: fi->af.nf.align = ALIGN_RIGHT; fi->af.nf.unit = ' '; - fi->af.nf.supress_unit = 0; + fi->af.nf.suppress_unit = 0; break; case AT_COUNT: fi->af.nf.align = ALIGN_RIGHT; fi->af.nf.unit = 'H'; - fi->af.nf.supress_unit = 0; + fi->af.nf.suppress_unit = 0; break; case AT_SIZE: fi->af.nf.align = ALIGN_RIGHT; fi->af.nf.unit = 'h'; - fi->af.nf.supress_unit = 0; + fi->af.nf.suppress_unit = 0; break; } if (!col) @@ -189,7 +191,7 @@ static int parse_atom(char *ap, struct atom *atoms, struct format_item **result) goto err; } if (col[1] == '*') { - fi->af.nf.supress_unit = 1; + fi->af.nf.suppress_unit = 1; col++; } for (j = 0; units[j]; j++) { @@ -217,6 +219,15 @@ success: return 1; } +/** + * Parse the given string according to the list of given atoms. + * + * \param fmt The format string. + * \param atoms The array of valid atoms. + * \param result Points to a format_info structure for later use. + * + * \return Standard. + */ int parse_format_string(char *fmt, struct atom *atoms, struct format_info **result) { char *cp, *ap, *ep; @@ -259,11 +270,17 @@ err: } free(info->items); free(info); + *result = NULL; return ret; } /** - * It's OK to pass a \p NULL pointer to this function. + * Free a struct of type \a format_info. + * + * \param info Pointer to the format info to be freed. + * + * It's OK to pass a \p NULL pointer to this function in which case the + * function does nothing. */ void free_format_info(struct format_info *info) { @@ -358,7 +375,7 @@ static long long unsigned normalize_number(long long unsigned num, char unit, static void get_unit_postfix(struct num_format *nf, char eu, enum atom_type type, char postfix[2]) { - if (nf->supress_unit) { + if (nf->suppress_unit) { *postfix = '\0'; return; } @@ -396,11 +413,21 @@ static char *align_unsigned_int(long long unsigned num, unsigned int width, nnum, postfix, width - (width + len) / 2, ""); } +/** + * Pretty-format the given values according to \a info. + * + * \param info The formating information. + * \param values The contents of the atoms. + * + * \return A string that must be freed by the caller. + */ char *format_items(struct format_info *info, union atom_value *values) { int i; char *buf = NULL; + if (!info) + return NULL; for (i = 0; info->items[i]; i++) { struct atom *a; struct format_item *fi = info->items[i]; @@ -422,14 +449,14 @@ char *format_items(struct format_info *info, union atom_value *values) align = af->sf.align; val = align_string(values[idx].string_value, fi->width, align); } else { - char unit; align = af->nf.align; - unit = af->nf.unit; val = align_unsigned_int(values[idx].num_value, fi->width, &af->nf, type); } buf = adu_strcat(buf, val); free(val); } + if (!buf) + buf = adu_strdup(""); return buf; }