1117N/A/*
1117N/A * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
1117N/A *
1117N/A * Permission is hereby granted, free of charge, to any person obtaining a
1117N/A * copy of this software and associated documentation files (the "Software"),
1117N/A * to deal in the Software without restriction, including without limitation
1117N/A * the rights to use, copy, modify, merge, publish, distribute, sublicense,
1117N/A * and/or sell copies of the Software, and to permit persons to whom the
1117N/A * Software is furnished to do so, subject to the following conditions:
1117N/A *
1117N/A * The above copyright notice and this permission notice (including the next
1117N/A * paragraph) shall be included in all copies or substantial portions of the
1117N/A * Software.
1117N/A *
1117N/A * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1117N/A * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1117N/A * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
1117N/A * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1117N/A * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
1117N/A * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
1117N/A * DEALINGS IN THE SOFTWARE.
1117N/A */
1117N/A
1117N/A/* fields - Write aligned whitespace and text fields */
1117N/A
1117N/A#include <stdarg.h> /* Variable argument lists */
1117N/A#include <stdio.h> /* fprintf() */
1117N/A#include <string.h> /* strlen() */
1117N/A
1117N/A#include "fields.h" /* Config file output line fields */
1117N/A
1117N/A
1117N/A/* Generic line indentation level 0 (e.g. Section line) */
1117N/Aconst char * const xf86whitespace_0[] = {
1117N/A "",
1117N/A " ",
1117N/A " ",
1117N/A NULL
1117N/A};
1117N/A
1117N/A
1117N/A/* Generic line indentation level 1 (e.g. section entry line) */
1117N/Aconst char * const xf86whitespace_1[] = {
1117N/A "\t",
1117N/A "\t\t",
1117N/A " ",
1117N/A NULL
1117N/A};
1117N/A
1117N/A/* Generic line indentation level 2 (e.g. subsection entry line) */
1117N/Aconst char * const xf86whitespace_2[] = {
1117N/A "\t\t",
1117N/A "\t\t",
1117N/A " ",
1117N/A NULL
1117N/A};
1117N/A
1117N/A
1117N/A/*
1117N/A * xf86printFields()
1117N/A *
1117N/A * Write whitespace and text fields such that each text field is
1117N/A * left-aligned with the intended character column.
1117N/A *
1117N/A * The end of the whitespace[] array is marked by a NULL element.
1117N/A * The end of the text field string arguments (...) is marked by a
1117N/A * NULL pointer. The whitespace[0] string is written before the
1117N/A * first text field. The cycle of writing whitespace and text
1117N/A * strings is terminated once either NULL is reached.
1117N/A */
1117N/A
1117N/Avoid
1117N/Axf86printFields(
1117N/A FILE *cf, /* Config file output stream */
1117N/A const char * const whitespace[], /* Array of whitespace strings */
1117N/A ...) /* NULL-terminated text field args */
1117N/A{
1117N/A int cur_col; /* Current character column */
1117N/A int field; /* Loop counter / array index */
1117N/A int field_col; /* Character column of field */
1117N/A va_list text_arg; /* Ptr to text string arg */
1117N/A char *text_ptr; /* Ptr to text string */
1117N/A const char *wspace; /* Ptr into writable whitespace */
1117N/A int wspace_len; /* Column with of whitespace char */
1117N/A const char *wspace_ptr; /* Ptr into whitespace[] string */
1117N/A
1117N/A /*
1117N/A * Initialize a pointer to the text string field arguments
1117N/A */
1117N/A va_start(text_arg, whitespace);
1117N/A
1117N/A /*
1117N/A * Repeat for each whitespace and (optional) text field pair
1117N/A */
1117N/A field_col = 0;
1117N/A cur_col = 0;
1117N/A text_ptr = "";
1117N/A for (field = 0; whitespace[field] != NULL; field += 1) {
1117N/A /*
1117N/A * Determine the column following the text string
1117N/A */
1117N/A cur_col += strlen(text_ptr); /* Assume no ctrl chars, etc. */
1117N/A
1117N/A /*
1117N/A * Scan the whitespace of the current field
1117N/A */
1117N/A wspace = whitespace[field];
1117N/A for (wspace_ptr = wspace;
1117N/A *wspace_ptr != '\0';
1117N/A wspace_ptr += 1) {
1117N/A /*
1117N/A * Ignore whitespace that is displaced by text
1117N/A */
1117N/A if (field_col <= cur_col) {
1117N/A wspace = wspace_ptr;
1117N/A }
1117N/A
1117N/A /*
1117N/A * Tally the column width of this whitespace character
1117N/A */
1117N/A wspace_len = 1; /* Assume it's a Space, not a Tab */
1117N/A if (*wspace_ptr == '\t') {
1117N/A wspace_len = XF86_TAB_WIDTH
1117N/A - (field_col % XF86_TAB_WIDTH);
1117N/A }
1117N/A field_col += wspace_len;
1117N/A }
1117N/A
1117N/A /*
1117N/A * Write the text (if any) and the whitespace that follows
1117N/A */
1117N/A if ((field > 0) && (field_col <= cur_col)) {
1117N/A wspace = " ";
1117N/A cur_col += 1;
1117N/A } else {
1117N/A cur_col = field_col;
1117N/A }
1117N/A fputs(text_ptr, cf);
1117N/A fputs(wspace, cf);
1117N/A
1117N/A /*
1117N/A * Get the next text string, if any
1117N/A */
1117N/A text_ptr = va_arg(text_arg, char *);
1117N/A if (text_ptr == NULL) {
1117N/A break;
1117N/A }
1117N/A }
1117N/A
1117N/A /*
1117N/A * Stop pointing to the text string field arguments
1117N/A */
1117N/A va_end(text_arg);
1117N/A
1117N/A} /* xf86printFields() */
1117N/A
1117N/A
1117N/A/* End of fields.c */