From: Peter Johnson Date: Wed, 19 Sep 2001 18:04:08 +0000 (-0000) Subject: Add portable little-endian file functions. X-Git-Tag: v0.1.0~320 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=556602d2faf1a85b4e72a38d63bc34de57ac4bc8;p=yasm Add portable little-endian file functions. svn path=/trunk/yasm/; revision=198 --- diff --git a/libyasm/file.c b/libyasm/file.c new file mode 100644 index 00000000..acd1a74f --- /dev/null +++ b/libyasm/file.c @@ -0,0 +1,56 @@ +/* $IdPath$ + * Little-endian file functions. + * + * Copyright (C) 2001 Peter Johnson + * + * This file is part of YASM. + * + * YASM 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 of the License, or + * (at your option) any later version. + * + * YASM 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "util.h" + +#include + +#include "file.h" + +RCSID("$IdPath$"); + +size_t +fwrite_short(unsigned short val, FILE *f) +{ + if (fputc(val & 0xFF, f) == EOF) + return 0; + if (fputc((val >> 8) & 0xFF, f) == EOF) + return 0; + return 1; +} + +size_t +fwrite_long(unsigned long val, FILE *f) +{ + if (fputc(val & 0xFF, f) == EOF) + return 0; + if (fputc((val >> 8) & 0xFF, f) == EOF) + return 0; + if (fputc((val >> 16) & 0xFF, f) == EOF) + return 0; + if (fputc((val >> 24) & 0xFF, f) == EOF) + return 0; + return 1; +} diff --git a/libyasm/file.h b/libyasm/file.h new file mode 100644 index 00000000..262be66b --- /dev/null +++ b/libyasm/file.h @@ -0,0 +1,53 @@ +/* $IdPath$ + * Little-endian file functions header file. + * + * Copyright (C) 2001 Peter Johnson + * + * This file is part of YASM. + * + * YASM 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 of the License, or + * (at your option) any later version. + * + * YASM 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef YASM_FILE_H +#define YASM_FILE_H + +/* These functions only work properly if p is an (unsigned char *) */ + +#define WRITE_BYTE(ptr, val) \ + *((ptr)++) = (val) & 0xFF + +#define WRITE_SHORT(ptr, val) \ + do { \ + *((ptr)++) = (val) & 0xFF; \ + *((ptr)++) = ((val) >> 8) & 0xFF; \ + } while (0) + +#define WRITE_LONG(ptr, val) \ + do { \ + *((ptr)++) = (val) & 0xFF; \ + *((ptr)++) = ((val) >> 8) & 0xFF; \ + *((ptr)++) = ((val) >> 16) & 0xFF; \ + *((ptr)++) = ((val) >> 24) & 0xFF; \ + } while (0) + +/* Direct-to-file versions of the above. Using the above macros and a single + * fwrite() will probably be faster than calling these functions many times. + * These functions return 1 if the write was successful, 0 if not (so their + * return values can be used like the return value from fwrite()). + */ + +size_t fwrite_short(unsigned short val, FILE *f); +size_t fwrite_long(unsigned long val, FILE *f); + +#endif diff --git a/src/Makefile.am b/src/Makefile.am index 1c313078..8e9cc755 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -30,6 +30,8 @@ libyasm_a_SOURCES = \ globals.c \ globals.h \ util.h \ + file.c \ + file.h \ section.c \ section.h \ objfmt.h \ diff --git a/src/file.c b/src/file.c new file mode 100644 index 00000000..acd1a74f --- /dev/null +++ b/src/file.c @@ -0,0 +1,56 @@ +/* $IdPath$ + * Little-endian file functions. + * + * Copyright (C) 2001 Peter Johnson + * + * This file is part of YASM. + * + * YASM 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 of the License, or + * (at your option) any later version. + * + * YASM 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "util.h" + +#include + +#include "file.h" + +RCSID("$IdPath$"); + +size_t +fwrite_short(unsigned short val, FILE *f) +{ + if (fputc(val & 0xFF, f) == EOF) + return 0; + if (fputc((val >> 8) & 0xFF, f) == EOF) + return 0; + return 1; +} + +size_t +fwrite_long(unsigned long val, FILE *f) +{ + if (fputc(val & 0xFF, f) == EOF) + return 0; + if (fputc((val >> 8) & 0xFF, f) == EOF) + return 0; + if (fputc((val >> 16) & 0xFF, f) == EOF) + return 0; + if (fputc((val >> 24) & 0xFF, f) == EOF) + return 0; + return 1; +} diff --git a/src/file.h b/src/file.h new file mode 100644 index 00000000..262be66b --- /dev/null +++ b/src/file.h @@ -0,0 +1,53 @@ +/* $IdPath$ + * Little-endian file functions header file. + * + * Copyright (C) 2001 Peter Johnson + * + * This file is part of YASM. + * + * YASM 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 of the License, or + * (at your option) any later version. + * + * YASM 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef YASM_FILE_H +#define YASM_FILE_H + +/* These functions only work properly if p is an (unsigned char *) */ + +#define WRITE_BYTE(ptr, val) \ + *((ptr)++) = (val) & 0xFF + +#define WRITE_SHORT(ptr, val) \ + do { \ + *((ptr)++) = (val) & 0xFF; \ + *((ptr)++) = ((val) >> 8) & 0xFF; \ + } while (0) + +#define WRITE_LONG(ptr, val) \ + do { \ + *((ptr)++) = (val) & 0xFF; \ + *((ptr)++) = ((val) >> 8) & 0xFF; \ + *((ptr)++) = ((val) >> 16) & 0xFF; \ + *((ptr)++) = ((val) >> 24) & 0xFF; \ + } while (0) + +/* Direct-to-file versions of the above. Using the above macros and a single + * fwrite() will probably be faster than calling these functions many times. + * These functions return 1 if the write was successful, 0 if not (so their + * return values can be used like the return value from fwrite()). + */ + +size_t fwrite_short(unsigned short val, FILE *f); +size_t fwrite_long(unsigned long val, FILE *f); + +#endif