From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12701 invoked by alias); 25 Apr 2010 15:48:00 -0000 Received: (qmail 12456 invoked by uid 22791); 25 Apr 2010 15:47:55 -0000 X-SWARE-Spam-Status: No, hits=-1.8 required=5.0 tests=BAYES_00,TW_CP,TW_WT,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from rock.gnat.com (HELO rock.gnat.com) (205.232.38.15) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sun, 25 Apr 2010 15:47:48 +0000 Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id 2D7492BAC8A for ; Sun, 25 Apr 2010 11:47:47 -0400 (EDT) Received: from rock.gnat.com ([127.0.0.1]) by localhost (rock.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id REgShjg42tZX for ; Sun, 25 Apr 2010 11:47:47 -0400 (EDT) Received: from joel.gnat.com (localhost.localdomain [127.0.0.1]) by rock.gnat.com (Postfix) with ESMTP id 0AF7C2BAC6A for ; Sun, 25 Apr 2010 11:47:47 -0400 (EDT) Received: by joel.gnat.com (Postfix, from userid 1000) id A4ABBF5896; Sun, 25 Apr 2010 11:47:46 -0400 (EDT) From: Joel Brobecker To: gdb-patches@sourceware.org Subject: [vxworks 03/14] New module remote-wtx-utils Date: Sun, 25 Apr 2010 15:48:00 -0000 Message-Id: <1272210447-13895-4-git-send-email-brobecker@adacore.com> In-Reply-To: <1272210447-13895-1-git-send-email-brobecker@adacore.com> References: <1272210447-13895-1-git-send-email-brobecker@adacore.com> Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2010-04/txt/msg00840.txt.bz2 This module provides some general-purpose routines which might be better off somewhere else... To be discussed individually for each routine. 2010-04-24 Joel Brobecker * remote-wtx-utils.h, remote-wtx-utils.c: New files. --- gdb/remote-wtx-utils.c | 201 ++++++++++++++++++++++++++++++++++++++++++++++++ gdb/remote-wtx-utils.h | 47 +++++++++++ 2 files changed, 248 insertions(+), 0 deletions(-) create mode 100644 gdb/remote-wtx-utils.c create mode 100644 gdb/remote-wtx-utils.h diff --git a/gdb/remote-wtx-utils.c b/gdb/remote-wtx-utils.c new file mode 100644 index 0000000..129c8e6 --- /dev/null +++ b/gdb/remote-wtx-utils.c @@ -0,0 +1,201 @@ +/* Support for the WTX protocol. + + Copyright (C) 2007, 2010 Free Software Foundation, Inc. + + This file is part of GDB. + + This program 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 3 of the License, or + (at your option) any later version. + + This program 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, see . */ + +#include "defs.h" +#include "remote-wtx-utils.h" +#include "gdb_stat.h" +#include "gdb_string.h" +#include "filenames.h" +#ifdef HAVE_LIBDL +#include +#elif __MINGW32__ +#include +#else +/* Unsupported configuration. See load_shared_lib for details. */ +#error +#endif + +/* Return non-zero if the host has a dos-based file system. */ + +int +have_dos_based_filesystem (void) +{ +#ifdef HAVE_DOS_BASED_FILE_SYSTEM + return 1; +#else + return 0; +#endif +} + +/* Return True if the file NAME exists and is a regular file. + + FIXME: This function was duplicated from source.c. + Make sure to share this function when we contribute the WTX port. */ + +int +is_regular_file (const char *name) +{ + struct stat st; + const int status = stat (name, &st); + + /* Stat should never fail except when the file does not exist. + If stat fails, analyze the source of error and return True + unless the file does not exist, to avoid returning false results + on obscure systems where stat does not work as expected. */ + if (status != 0) + return (errno != ENOENT); + + return S_ISREG (st.st_mode); +} + +/* Return a pointer to the first non-whitepace character found + in the string. A whitespace is either a space or a tab. */ + +char * +skip_whitespaces (char *str) +{ + char *index = str; + + while (*index == ' ' || *index == '\t') + index++; + + return index; +} + +/* Return a pointer to the first DELIMITER character in the given + string. Return a pointer to the end-of-line character if + DELIMITER was not found. */ + +char * +skip_until_character (char *str, char delimiter) +{ + char *index = str; + + while (*index != delimiter && *index != '\0') + index++; + + return index; +} + +/* return a pointer to the first whitespace character. If no whitespace + is found before the end of string, a pointer to the end of string + is returned. A whitespace is either a space or a tab. */ + +static char * +skip_until_whitespace (char *str) +{ + char *index = str; + + while (*index != ' ' && *index != '\t' && *index != '\0') + index++; + + return index; +} + +/* Return a pointer to the first white space after the next + whitespace-delimited token. */ + +char * +skip_space_delimited_token (char *str) +{ + char *index = str; + + index = skip_whitespaces (index); + index = skip_until_whitespace (index); + + return index; +} + +/* Copy the next whitespace token into TOKEN. This string will be + allocated using malloc, and must be dealocated later. */ + +char * +get_space_delimited_token (char *str, char **token) +{ + char *start; + char *end; + char tmp; + + start = skip_whitespaces (str); + end = skip_until_whitespace (start); + + tmp = *end; + *end = '\0'; + *token = xstrdup (start); + *end = tmp; + + return end; +} + +/* Load the shared library whose name is LIB_NAME and return a handle + on it. Note that this name correspond to a different file name + depending on the host; for example, the name "wtxapi40" would + identify libwtxapi40.so on linux and solaris, whereas it would + identify wtxapi40.dll. */ + +void *load_shared_lib (char *lib_name) +{ + const char dos_suffix [] = ".dll"; + const char unix_prefix[] = "lib"; + const char unix_suffix [] = ".so"; + char *filename; + + if (have_dos_based_filesystem ()) + { + filename = (char *) alloca (strlen (lib_name) + strlen (dos_suffix) + 1); + strcpy (filename, lib_name); + strcat (filename, dos_suffix); + } + else + { + filename = (char *) alloca (strlen (unix_prefix) + + strlen (lib_name) + + strlen (unix_suffix) + 1); + strcpy (filename, unix_prefix); + strcat (filename, lib_name); + strcat (filename, unix_suffix); + } + +#ifdef HAVE_LIBDL + return dlopen (filename, RTLD_NOW); +#elif __MINGW32__ + return (void *) LoadLibrary (filename); +#else +/* A dlopen-like API is need to load the WTX libraries. This + implementation supports only libdl and the win32 native API + (LoadLibrary). */ +#error +#endif +} + +/* Get the address of SYMBOL in a shared library identified + by HANDLE (HANDLE is the value returned by load_shared_lib + for this library). */ + +void *get_symbol_from_shared_lib (void *handle, char *symbol) +{ +#ifdef HAVE_LIBDL + return dlsym (handle, symbol); +#elif __MINGW32__ + return (void *) GetProcAddress (handle, symbol); +#else +/* Unsupported configuration. See load_shared_lib for details. */ +#error +#endif +} diff --git a/gdb/remote-wtx-utils.h b/gdb/remote-wtx-utils.h new file mode 100644 index 0000000..f60953b --- /dev/null +++ b/gdb/remote-wtx-utils.h @@ -0,0 +1,47 @@ +/* Support for the WTX protocol. + + Copyright (C) 2007, 2010 Free Software Foundation, Inc. + + This file is part of GDB. + + This program 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 3 of the License, or + (at your option) any later version. + + This program 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, see . */ + +#ifndef REMOTE_WTX_UTILS_H +#define REMOTE_WTX_UTILS_H + +/* This unit contains some routines that should really be implemented + elsewhere. Ideally, we'd like to contribute these routines to the FSF, + but we currently only have the DFW & WTX backends that use them, so + until we contribute either of these ports, there really isn't any + reason for the FSF to take our code. Rather than sprinkle these + routines in the GDB core code, we put them here in one central location + for now. */ + +int have_dos_based_filesystem (void); + +int is_regular_file (const char *name); + +char *skip_whitespaces (char *str); + +char *skip_until_character (char *str, char delimiter); + +char *skip_space_delimited_token (char *str); + +char *get_space_delimited_token (char *str, char **token); + +void *load_shared_lib (char *lib_name); + +void *get_symbol_from_shared_lib (void *handle, char *symbol); + +#endif -- 1.6.3.3