From: Martin Quinson Date: Sun, 13 Sep 2015 19:32:31 +0000 (+0200) Subject: New XBT module: file X-Git-Tag: v3_12~217 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/3d845df082d79ab89649c1a8829eea201ae01085 New XBT module: file It contains handy functions that don't exist on some systems. For now: xbt_getline (moved from xbt/str) and xbt_dirname (new function). --- diff --git a/doc/doxygen/module-xbt.doc b/doc/doxygen/module-xbt.doc index cf5fad5469..686f202645 100644 --- a/doc/doxygen/module-xbt.doc +++ b/doc/doxygen/module-xbt.doc @@ -4,6 +4,7 @@ - Portability support - \ref XBT_syscall - \ref XBT_str + - \ref XBT_file - Grounding features - \ref XBT_ex - \ref XBT_log diff --git a/include/xbt.h b/include/xbt.h index 33a913098d..5675b555fc 100644 --- a/include/xbt.h +++ b/include/xbt.h @@ -12,6 +12,7 @@ #include #include #include +#include #include #include diff --git a/include/xbt/file.h b/include/xbt/file.h new file mode 100644 index 0000000000..5920f3ae14 --- /dev/null +++ b/include/xbt/file.h @@ -0,0 +1,39 @@ +/* str.h - XBT string related functions. */ + +/* Copyright (c) 2007-2015. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#ifndef XBT_FILE_H +#define XBT_FILE_H + +#include /* ssize_t */ +#include /* va_* */ +#include /* FILE */ +#include /* size_t, ssize_t */ +#include "xbt/misc.h" +#include "xbt/dynar.h" +#include "xbt/dict.h" +#include "simgrid_config.h" /* FILE for getline */ + +SG_BEGIN_DECL() + +/** @addtogroup XBT_file + * @brief File manipulation functions + * + * This module redefine some quite classical functions (such as xbt_getline() or xbt_dirname()) for the platforms + * lacking them. + * @{ + */ +/* Our own implementation of getline, mainly useful on the platforms not enjoying this function */ +XBT_PUBLIC(ssize_t) xbt_getline(char **lineptr, size_t * n, FILE * stream); + +/* Our own implementation of dirname, that does not exist on windows */ +XBT_PUBLIC(char *) xbt_dirname(const char *path); + +/**@}*/ + +SG_END_DECL() +#endif /* XBT_FILE_H */ diff --git a/include/xbt/str.h b/include/xbt/str.h index 4741e73ef1..2a64e95528 100644 --- a/include/xbt/str.h +++ b/include/xbt/str.h @@ -9,27 +9,22 @@ #ifndef XBT_STR_H #define XBT_STR_H -#include /* ssize_t */ #include /* va_* */ #include /* FILE */ -#include /* size_t, ssize_t */ #include "xbt/misc.h" #include "xbt/dynar.h" #include "xbt/dict.h" -#include "simgrid_config.h" /* FILE for getline */ SG_BEGIN_DECL() /** @addtogroup XBT_str * @brief String manipulation functions * - * This module defines several string related functions. We redefine some quite classical - * functions on the platforms were they are not nativaly defined (such as xbt_getline() or - * asprintf()), while some other are a bit more exotic. + * This module defines several string related functions. Looking at the diversity of string + * manipulation functions that are provided, you can see that several SimGrid core developers + * actually like Perl. * @{ */ -/* Our own implementation of getline, mainly useful on the platforms not enjoying this function */ -XBT_PUBLIC(ssize_t) xbt_getline(char **lineptr, size_t * n, FILE * stream); /* Trim related functions */ XBT_PUBLIC(void) xbt_str_rtrim(char *s, const char *char_list); diff --git a/src/surf/storage_interface.cpp b/src/surf/storage_interface.cpp index 5718a00cfb..073a6efc91 100644 --- a/src/surf/storage_interface.cpp +++ b/src/surf/storage_interface.cpp @@ -6,6 +6,7 @@ #include "storage_interface.hpp" #include "surf_private.h" +#include "xbt/file.h" /* xbt_getline */ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_storage, surf, "Logging specific to the SURF storage module"); diff --git a/src/surf/surfxml_parse.c b/src/surf/surfxml_parse.c index c82a3070ec..e7f1b457ca 100644 --- a/src/surf/surfxml_parse.c +++ b/src/surf/surfxml_parse.c @@ -7,13 +7,11 @@ #include #include #include /* va_arg */ -#ifndef _MSC_VER -#include -#endif #include "xbt/misc.h" #include "xbt/log.h" #include "xbt/str.h" +#include "xbt/file.h" #include "xbt/dict.h" #include "surf/surfxml_parse.h" #include "surf/surf_private.h" @@ -1031,17 +1029,7 @@ void surf_parse_open(const char *file) if (!surf_parsed_filename_stack) surf_parsed_filename_stack = xbt_dynar_new(sizeof(char *), &xbt_free_ref); -#ifdef _MSC_VER - /* There is no dirname on windows... */ - char drive[_MAX_DRIVE]; - char dir[_MAX_DIR]; - errno_t err; - err = _splitpath_s(file, drive, _MAX_DRIVE, dir, _MAX_DIR, NULL,0, NULL,0); - char *dir = bprintf("%s%s",drive,dir); -#else - surf_parsed_filename = xbt_strdup(file); - char *dir = dirname(surf_parsed_filename); -#endif + char *dir = xbt_dirname(file); xbt_dynar_push(surf_path, &dir); surf_file_to_parse = surf_fopen(file, "r"); diff --git a/src/xbt/graph.c b/src/xbt/graph.c index 52bed433e6..5d3629020e 100644 --- a/src/xbt/graph.c +++ b/src/xbt/graph.c @@ -16,7 +16,7 @@ #include "xbt/dict.h" #include "xbt/heap.h" #include "xbt/str.h" - +#include "xbt/file.h" diff --git a/src/xbt/xbt_os_file.c b/src/xbt/xbt_os_file.c new file mode 100644 index 0000000000..232ad066ea --- /dev/null +++ b/src/xbt/xbt_os_file.c @@ -0,0 +1,79 @@ +/* xbt_os_file.c -- portable interface to file-related functions */ + +/* Copyright (c) 2007-2010, 2012-2015. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#include "xbt/sysdep.h" +#include "xbt/file.h" /* this module */ +#include "xbt/log.h" +#include "portable.h" + +#ifndef _MSC_VER +#include "libgen.h" /* POSIX dirname */ +#endif + +/** @brief Get a single line from the stream (reimplementation of the GNU getline) + * + * This is a reimplementation of the GNU getline function, so that our code don't depends on the GNU libc. + * + * xbt_getline() reads an entire line from stream, storing the address of the + * buffer containing the text into *buf. The buffer is null-terminated and + * includes the newline character, if one was found. + * + * If *buf is NULL, then xbt_getline() will allocate a buffer for storing the + * line, which should be freed by the user program. + * + * Alternatively, before calling xbt_getline(), *buf can contain a pointer to a + * malloc()-allocated buffer *n bytes in size. If the buffer is not large + * enough to hold the line, xbt_getline() resizes it with realloc(), updating + * *buf and *n as necessary. + * + * In either case, on a successful call, *buf and *n will be updated to reflect + * the buffer address and allocated size respectively. + */ +ssize_t xbt_getline(char **buf, size_t *n, FILE *stream) +{ + ssize_t i; + int ch; + + ch = getc(stream); + if (ferror(stream) || feof(stream)) + return -1; + + if (!*buf) { + *n = 512; + *buf = xbt_malloc(*n); + } + + i = 0; + do { + if (i == *n) + *buf = xbt_realloc(*buf, *n += 512); + (*buf)[i++] = ch; + } while (ch != '\n' && (ch = getc(stream)) != EOF); + + if (i == *n) + *buf = xbt_realloc(*buf, *n += 1); + (*buf)[i] = '\0'; + + return i; +} + +/** @brief Returns the directory component of a path (reimplementation of POSIX dirname) + * + * The argument is never modified, and the returned value must be freed after use. + */ +char *xbt_dirname(const char *path) { +#if _MSC_VER + char drive[_MAX_DRIVE]; + char dir[_MAX_DIR]; + errno_t err; + err = _splitpath_s(path, drive, _MAX_DRIVE, dir, _MAX_DIR, NULL,0, NULL,0); + return bprintf("%s%s",drive,dir); +#else + return dirname(xbt_strdup(path)); +#endif +} diff --git a/src/xbt/xbt_replay.c b/src/xbt/xbt_replay.c index 5012744fd4..4b2872b50c 100644 --- a/src/xbt/xbt_replay.c +++ b/src/xbt/xbt_replay.c @@ -9,6 +9,7 @@ #include "xbt/sysdep.h" #include "xbt/log.h" #include "xbt/str.h" +#include "xbt/file.h" #include "xbt/replay.h" #include #include diff --git a/src/xbt/xbt_str.c b/src/xbt/xbt_str.c index eedfa87092..d1f1cd91ea 100644 --- a/src/xbt/xbt_str.c +++ b/src/xbt/xbt_str.c @@ -520,53 +520,6 @@ char *xbt_str_join_array(const char *const *strs, const char *sep) return res; } -/** @brief Get a single line from the stream (reimplementation of the GNU getline) - * - * This is a reimplementation of the GNU getline function, so that our code don't depends on the GNU libc. - * - * xbt_getline() reads an entire line from stream, storing the address of the - * buffer containing the text into *buf. The buffer is null-terminated and - * includes the newline character, if one was found. - * - * If *buf is NULL, then xbt_getline() will allocate a buffer for storing the - * line, which should be freed by the user program. - * - * Alternatively, before calling xbt_getline(), *buf can contain a pointer to a - * malloc()-allocated buffer *n bytes in size. If the buffer is not large - * enough to hold the line, xbt_getline() resizes it with realloc(), updating - * *buf and *n as necessary. - * - * In either case, on a successful call, *buf and *n will be updated to reflect - * the buffer address and allocated size respectively. - */ -ssize_t xbt_getline(char **buf, size_t *n, FILE *stream) -{ - ssize_t i; - int ch; - - ch = getc(stream); - if (ferror(stream) || feof(stream)) - return -1; - - if (!*buf) { - *n = 512; - *buf = xbt_malloc(*n); - } - - i = 0; - do { - if (i == *n) - *buf = xbt_realloc(*buf, *n += 512); - (*buf)[i++] = ch; - } while (ch != '\n' && (ch = getc(stream)) != EOF); - - if (i == *n) - *buf = xbt_realloc(*buf, *n += 1); - (*buf)[i] = '\0'; - - return i; -} - /* * Diff related functions * diff --git a/tools/cmake/DefinePackages.cmake b/tools/cmake/DefinePackages.cmake index 31d4066331..9b3d730224 100644 --- a/tools/cmake/DefinePackages.cmake +++ b/tools/cmake/DefinePackages.cmake @@ -276,6 +276,7 @@ set(XBT_SRC src/xbt/xbt_main.c src/xbt/xbt_matrix.c src/xbt/xbt_os_time.c + src/xbt/xbt_os_file.c src/xbt/xbt_peer.c src/xbt/xbt_queue.c src/xbt/xbt_replay.c @@ -712,6 +713,7 @@ set(headers_to_install include/xbt/dynar.h include/xbt/ex.h include/xbt/fifo.h + include/xbt/file.h include/xbt/function_types.h include/xbt/graph.h include/xbt/graphxml.h