1 /* fseeko.c -- an implementation of fseek() with an off_t argument. 2 Copyright (C) 2003, Free Software Foundation, Inc. 3 4 This program is free software; you can redistribute it and/or modify 5 it under the terms of the GNU General Public License as published by 6 the Free Software Foundation; either version 2, or (at your option) 7 any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU General Public License for more details. */ 13 #include <sys/cdefs.h> 14 __RCSID("$NetBSD: fseeko.c,v 1.2 2016/05/17 14:00:09 christos Exp $"); 15 16 #ifdef HAVE_CONFIG_H 17 #include "config.h" 18 #endif 19 20 #include <stdio.h> 21 #include <sys/types.h> 22 23 #ifdef HAVE_LIMITS_H 24 #include <limits.h> 25 #endif 26 #ifndef LONG_MAX 27 #define LONG_MAX ((long) ((unsigned long) ~0 >> 1)) 28 #endif 29 #ifndef LONG_MIN 30 #define LONG_MIN (-1 - LONG_MAX) 31 #endif 32 33 /* 34 * A replacement/substitute for fseeko, for hosts that don't have it. 35 */ 36 37 int 38 fseeko (FILE *stream, off_t offset, int whence) 39 { 40 while (offset != (long) offset) 41 { 42 long pos = (offset < 0) ? LONG_MIN : LONG_MAX; 43 44 if (fseek (stream, pos, whence) != 0) 45 return -1; 46 offset -= pos; 47 whence = SEEK_CUR; 48 } 49 return fseek (stream, (long) offset, whence); 50 } 51