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