Skip to content

Commit

Permalink
tinystdio: added fgetpos and fsetpos files
Browse files Browse the repository at this point in the history
added fgetpos.c and fsetpos.c files to resolve compilation error of:
undefined symbol: fgetpos
undefined symbol: fsetpos

changed the prototype of these functions in the file stdio.h to match
with the ISO/IEC 9899_1999

Signed-off-by: Hana Ashour <[email protected]>
  • Loading branch information
HanaMAshour committed May 7, 2024
1 parent 8e5704c commit 67a423d
Show file tree
Hide file tree
Showing 4 changed files with 150 additions and 2 deletions.
77 changes: 77 additions & 0 deletions newlib/libc/tinystdio/fgetpos.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
/*
* Copyright (c) 1990 The Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice and this paragraph are
* duplicated in all such forms and that any documentation,
* and/or other materials related to such
* distribution and use acknowledge that the software was developed
* by the University of California, Berkeley. The name of the
* University may not be used to endorse or promote products derived
* from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/

/*
FUNCTION
<<fgetpos>>---record position in a stream or file
INDEX
fgetpos
INDEX
_fgetpos_r
SYNOPSIS
#include <stdio.h>
int fgetpos(FILE *restrict <[fp]>, fpos_t *restrict <[pos]>);
int fgetpos( FILE *restrict <[fp]>, fpos_t *restrict <[pos]>);
DESCRIPTION
Objects of type <<FILE>> can have a ``position'' that records how much
of the file your program has already read. Many of the <<stdio>> functions
depend on this position, and many change it as a side effect.
You can use <<fgetpos>> to report on the current position for a file
identified by <[fp]>; <<fgetpos>> will write a value
representing that position at <<*<[pos]>>>. Later, you can
use this value with <<fsetpos>> to return the file to this
position.
In the current implementation, <<fgetpos>> simply uses a character
count to represent the file position; this is the same number that
would be returned by <<ftell>>.
RETURNS
<<fgetpos>> returns <<0>> when successful. If <<fgetpos>> fails, the
result is <<1>>. Failure occurs on streams that do not support
positioning; the global <<errno>> indicates this condition with the
value <<ESPIPE>>.
PORTABILITY
<<fgetpos>> is required by the ANSI C standard, but the meaning of the
value it records is not specified beyond requiring that it be
acceptable as an argument to <<fsetpos>>. In particular, other
conforming C implementations may return a different result from
<<ftell>> than what <<fgetpos>> writes at <<*<[pos]>>>.
No supporting OS subroutines are required.
*/

#include <stdio_private.h>

int
fgetpos (
FILE *__restrict fp,
_fpos_t *__restrict pos)
{
*pos = ftell ( fp);

if (*pos != -1)
{
return 0;
}
return 1;
}
69 changes: 69 additions & 0 deletions newlib/libc/tinystdio/fsetpos.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
/*
* Copyright (c) 1990 The Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice and this paragraph are
* duplicated in all such forms and that any documentation,
* and/or other materials related to such
* distribution and use acknowledge that the software was developed
* by the University of California, Berkeley. The name of the
* University may not be used to endorse or promote products derived
* from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/

/*
FUNCTION
<<fsetpos>>---restore position of a stream or file
INDEX
fsetpos
INDEX
_fsetpos_r
SYNOPSIS
#include <stdio.h>
int fsetpos(FILE *<[fp]>, const fpos_t *<[pos]>);
int fsetpos( FILE *<[fp]>,
const fpos_t *<[pos]>);
DESCRIPTION
Objects of type <<FILE>> can have a ``position'' that records how much
of the file your program has already read. Many of the <<stdio>> functions
depend on this position, and many change it as a side effect.
You can use <<fsetpos>> to return the file identified by <[fp]> to a previous
position <<*<[pos]>>> (after first recording it with <<fgetpos>>).
See <<fseek>> for a similar facility.
RETURNS
<<fgetpos>> returns <<0>> when successful. If <<fgetpos>> fails, the
result is <<1>>. The reason for failure is indicated in <<errno>>:
either <<ESPIPE>> (the stream identified by <[fp]> doesn't support
repositioning) or <<EINVAL>> (invalid file position).
PORTABILITY
ANSI C requires <<fsetpos>>, but does not specify the nature of
<<*<[pos]>>> beyond identifying it as written by <<fgetpos>>.
Supporting OS subroutines required: <<close>>, <<fstat>>, <<isatty>>,
<<lseek>>, <<read>>, <<sbrk>>, <<write>>.
*/

#include <stdio_private.h>

int
fsetpos (
FILE * iop,
const _fpos_t * pos)
{
int x = fseek ( iop, *pos, SEEK_SET);

if (x != 0)
return 1;
return 0;
}
2 changes: 2 additions & 0 deletions newlib/libc/tinystdio/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ srcs_tinystdio = [
'ferror.c',
'fflush.c',
'fgetc.c',
'fgetpos.c',
'fgets.c',
'fgetwc.c',
'fgetws.c',
Expand All @@ -74,6 +75,7 @@ srcs_tinystdio = [
'fscanf.c',
'fseek.c',
'fseeko.c',
'fsetpos.c',
'ftell.c',
'ftello.c',
'ftox_engine.c',
Expand Down
4 changes: 2 additions & 2 deletions newlib/libc/tinystdio/stdio.h
Original file line number Diff line number Diff line change
Expand Up @@ -300,14 +300,14 @@ int ferror(FILE *__stream);
#endif

__extension__ typedef _fpos_t fpos_t;
int fgetpos(FILE *stream, fpos_t *pos);
int fgetpos(FILE * restrict stream, fpos_t * restrict pos);
FILE *fopen(const char *path, const char *mode) __malloc_like_with_free(fclose, 1);
FILE *freopen(const char *path, const char *mode, FILE *stream);
FILE *fdopen(int, const char *) __malloc_like_with_free(fclose, 1);
FILE *fmemopen(void *buf, size_t size, const char *mode) __malloc_like_with_free(fclose, 1);
int fseek(FILE *stream, long offset, int whence);
int fseeko(FILE *stream, __off_t offset, int whence);
int fsetpos(FILE *stream, fpos_t *pos);
int fsetpos(FILE *stream, const fpos_t *pos);
long ftell(FILE *stream);
__off_t ftello(FILE *stream);
int fileno(FILE *);
Expand Down

0 comments on commit 67a423d

Please sign in to comment.