1 /* Machine-independent I/O routines for gcov.
2 Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
3 Contributed by Bob Manson <manson@cygnus.com>.
5 This file is part of GNU CC.
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
25 #include <sys/types.h>
27 static int __fetch_long
PROTO ((long *, char *, size_t));
28 static int __store_long
PROTO ((long, char *, size_t));
29 static int __read_long
PROTO ((long *, FILE *, size_t));
30 static int __write_long
PROTO ((long, FILE *, size_t));
32 /* These routines only work for signed values. */
34 /* Store a portable representation of VALUE in DEST using BYTES*8-1 bits.
35 Return a non-zero value if VALUE requires more than BYTES*8-1 bits
39 __store_long (value
, dest
, bytes
)
44 int upper_bit
= (value
< 0 ? 128 : 0);
49 long oldvalue
= value
;
51 if (oldvalue
!= -value
)
55 for(i
= 0 ; i
< (sizeof (value
) < bytes
? sizeof (value
) : bytes
) ; i
++) {
56 dest
[i
] = value
& (i
== (bytes
- 1) ? 127 : 255);
60 if (value
&& value
!= -1)
63 for(; i
< bytes
; i
++)
65 dest
[bytes
- 1] |= upper_bit
;
69 /* Retrieve a quantity containing BYTES*8-1 bits from SOURCE and store
70 the result in DEST. Returns a non-zero value if the value in SOURCE
71 will not fit in DEST. */
74 __fetch_long (dest
, source
, bytes
)
82 for (i
= bytes
- 1; (size_t) i
> (sizeof (*dest
) - 1); i
--)
83 if (source
[i
] & ((size_t) i
== (bytes
- 1) ? 127 : 255 ))
87 value
= value
* 256 + (source
[i
] & ((size_t)i
== (bytes
- 1) ? 127 : 255));
89 if ((source
[bytes
- 1] & 128) && (value
> 0))
96 /* Write a BYTES*8-bit quantity to FILE, portably. Returns a non-zero
97 value if the write fails, or if VALUE can't be stored in BYTES*8
100 Note that VALUE may not actually be large enough to hold BYTES*8
101 bits, but BYTES characters will be written anyway.
103 BYTES may be a maximum of 10. */
106 __write_long (value
, file
, bytes
)
113 if (bytes
> 10 || __store_long (value
, c
, bytes
))
116 return fwrite(c
, 1, bytes
, file
) != bytes
;
119 /* Read a quantity containing BYTES bytes from FILE, portably. Return
120 a non-zero value if the read fails or if the value will not fit
123 Note that DEST may not be large enough to hold all of the requested
124 data, but the function will read BYTES characters anyway.
126 BYTES may be a maximum of 10. */
129 __read_long (dest
, file
, bytes
)
136 if (bytes
> 10 || fread(c
, 1, bytes
, file
) != bytes
)
139 return __fetch_long (dest
, c
, bytes
);