Blame tools/fprint.c

Packit Service 9ccfef
/*
Packit Service 9ccfef
 * fprint.c --
Packit Service 9ccfef
 *
Packit Service 9ccfef
 *      This file defines commonly used utility functions to produce
Packit Service 9ccfef
 *	nicely indented output.
Packit Service 9ccfef
 *
Packit Service 9ccfef
 * Copyright (c) 1999 Frank Strauss, Technical University of Braunschweig.
Packit Service 9ccfef
 * Copyright (c) 2007 J. Schoenwaelder, Jacobs University Bremen.
Packit Service 9ccfef
 *
Packit Service 9ccfef
 * See the file "COPYING" for information on usage and redistribution
Packit Service 9ccfef
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Packit Service 9ccfef
 *
Packit Service 9ccfef
 * @(#) $Id: fprint.c 8024 2008-04-11 13:25:26Z schoenw $
Packit Service 9ccfef
 */
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
#include <config.h>
Packit Service 9ccfef
Packit Service 9ccfef
#include <stdio.h>
Packit Service 9ccfef
#include <stdlib.h>
Packit Service 9ccfef
#include <string.h>
Packit Service 9ccfef
#include <stdarg.h>
Packit Service 9ccfef
#ifdef HAVE_WIN_H
Packit Service 9ccfef
#include "win.h"
Packit Service 9ccfef
#endif
Packit Service 9ccfef
Packit Service 9ccfef
#include "smi.h"
Packit Service 9ccfef
#include "fprint.h"
Packit Service 9ccfef
Packit Service 9ccfef
/*
Packit Service 9ccfef
 * This module keeps internal state. Hence, these functions are not
Packit Service 9ccfef
 * thread safe. Note, however, that multi-threaded concurrent output
Packit Service 9ccfef
 * generation may not be such a wonderful idea anyway - so using
Packit Service 9ccfef
 * static variables may be good enough.
Packit Service 9ccfef
 */
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
int fprint_current_column = 0;
Packit Service 9ccfef
int fprint_indent_max = 64;
Packit Service 9ccfef
int fprint_indent_texts = 4;
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
void
Packit Service 9ccfef
fprint(FILE *f, char *fmt, ...)
Packit Service 9ccfef
{
Packit Service 9ccfef
    va_list ap;
Packit Service 9ccfef
    char    *s;
Packit Service 9ccfef
    char    *p;
Packit Service 9ccfef
    
Packit Service 9ccfef
    va_start(ap, fmt);
Packit Service 9ccfef
    fprint_current_column += smiVasprintf(&s, fmt, ap);
Packit Service 9ccfef
    va_end(ap);
Packit Service 9ccfef
    fputs(s, f);
Packit Service 9ccfef
    if ((p = strrchr(s, '\n'))) {
Packit Service 9ccfef
        fprint_current_column = strlen(p) - 1;
Packit Service 9ccfef
    }
Packit Service 9ccfef
    free(s);
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
void
Packit Service 9ccfef
fprintSegment(FILE *f, int column, char *string, int length)
Packit Service 9ccfef
{
Packit Service 9ccfef
    fprint(f, "%*c%s", column, ' ', string);
Packit Service 9ccfef
    if (length) {
Packit Service 9ccfef
	fprint(f, "%*c", length - strlen(string) - column, ' ');
Packit Service 9ccfef
    }
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
void
Packit Service 9ccfef
fprintWrapped(FILE *f, int column, char *string)
Packit Service 9ccfef
{
Packit Service 9ccfef
    if ((fprint_current_column + strlen(string)) > fprint_indent_max) {
Packit Service 9ccfef
	putc('\n', f);
Packit Service 9ccfef
	fprint_current_column = 0;
Packit Service 9ccfef
	fprintSegment(f, column, "", 0);
Packit Service 9ccfef
    }
Packit Service 9ccfef
    fprint(f, "%s", string);
Packit Service 9ccfef
}
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
Packit Service 9ccfef
void
Packit Service 9ccfef
fprintMultilineString(FILE *f, int column, const char *s)
Packit Service 9ccfef
{
Packit Service 9ccfef
    int i, len;
Packit Service 9ccfef
    
Packit Service 9ccfef
    fprintSegment(f, column - 1 + fprint_indent_texts, "\"", 0);
Packit Service 9ccfef
    if (s) {
Packit Service 9ccfef
	len = strlen(s);
Packit Service 9ccfef
	for (i=0; i < len; i++) {
Packit Service 9ccfef
	    putc(s[i], f);
Packit Service 9ccfef
	    fprint_current_column++;
Packit Service 9ccfef
	    if (s[i] == '\n') {
Packit Service 9ccfef
		fprint_current_column = 0;
Packit Service 9ccfef
		fprintSegment(f, column + fprint_indent_texts, "", 0);
Packit Service 9ccfef
	    }
Packit Service 9ccfef
	}
Packit Service 9ccfef
    }
Packit Service 9ccfef
    putc('\"', f);
Packit Service 9ccfef
    fprint_current_column++;
Packit Service 9ccfef
}