summaryrefslogtreecommitdiff
path: root/libps/write.c
blob: 486352d20f0a96acc95a6211e2be1d810091a5f0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/* Some helper functions for writing output fields.

   Copyright (C) 1995 Free Software Foundation, Inc.

   Written by Miles Bader <miles@gnu.ai.mit.edu>

   This program 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, or (at
   your option) any later version.

   This program 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 this program; if not, write to the Free Software
   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

#include "ps.h"
#include "common.h"

/* ---------------------------------------------------------------- */

/* Write at most MAX_LEN characters of STRING to STREAM (if MAX_LEN > the
   length of STRING, then write all of it; if MAX_LEN == -1, then write all
   of STRING regardless).  If COUNT is non-NULL, the number of characters
   written is added to the integer it points to.  If an error occurs, the
   error code is returned, otherwise 0.  */
error_t
ps_write_string(char *string, int max_len, FILE *stream, unsigned *count)
{
  int len = strlen(string);

  if (max_len > 0 && len > max_len)
    len = max_len;

  if (len > 0)
    {
      int output = fwrite(string, 1, len, stream);
      if (output == 0)
	return errno;
      if (count)
	*count += output;
    }

  return 0;
}

/* Write NUM spaces to STREAM.  If COUNT is non-NULL, the number of spaces
   written is added to the integer it points to.  If an error occurs, the
   error code is returned, otherwise 0.  */
error_t
ps_write_spaces(int num, FILE *stream, unsigned *count)
{
  static char spaces[] = "                                ";
#define spaces_len (sizeof(spaces) - 1)

  while (num > spaces_len)
    {
      error_t err = ps_write_string(spaces, spaces_len, stream, count);
      if (err)
	return err;
      num -= spaces_len;
    }

  if (num > 0)
    return ps_write_string(spaces, num, stream, count);
  else
    return 0;
}

/* Write as many spaces to STREAM as required to make a field of width SOFAR
   be at least WIDTH characters wide (the absolute value of WIDTH is used).
   If COUNT is non-NULL, the number of spaces written is added to the integer
   it points to.  If an error occurs, the error code is returned, otherwise
   0.  */
error_t
ps_write_padding(int sofar, int width, FILE *stream, unsigned *count)
{
  width = ABS(width);
  if (sofar < width)
    return ps_write_spaces(width - sofar, stream, count);
  else
    return 0;
}

/* Write the string BUF to STREAM, padded on one side with spaces to be at
   least the absolute value of WIDTH long: if WIDTH >= 0, then on the left
   side, otherwise on the right side.  If COUNT is non-NULL, the number of
   characters written is added to the integer it points to.  If an error
   occurs, the error code is returned, otherwise 0.  */
error_t
ps_write_field(char *buf, int width, FILE *stream, unsigned *count)
{
  error_t err;
  int len = strlen(buf);

  if (width > len)
    {
      err = ps_write_string(buf, -1, stream, count);
      if (!err)
	err = ps_write_spaces(width - len, stream, count);
    }
  else if (-width > len)
    {
      err = ps_write_spaces(-width - len, stream, count);
      if (!err)
	err = ps_write_string(buf, -1, stream, count);
    }
  else
    err = ps_write_string(buf, -1, stream, count);

  return err;
}

/* Write the decimal representation of VALUE to STREAM, padded on one side
   with spaces to be at least the absolute value of WIDTH long: if WIDTH >=
   0, then on the left side, otherwise on the right side.  If COUNT is
   non-NULL, the number of characters written is added to the integer it
   points to.  If an error occurs, the error code is returned, otherwise 0.  */
error_t
ps_write_int_field(int value, int width, FILE *stream, unsigned *count)
{
  char buf[20];
  sprintf(buf, "%d", value);
  return ps_write_field(buf, width, stream, count);
}