removing old rospack

This commit is contained in:
Ken Conley 2011-12-30 22:58:25 +00:00
parent e751889c44
commit cf44a82c20
28 changed files with 4 additions and 13679 deletions

View File

@ -1,7 +1,11 @@
project(rosclean)
find_package(catkin)
add_subdirectory(scripts)
install_cmake_infrastructure(${PROJECT_NAME}
VERSION 0.0.1
PYTHONPATH src
)
enable_python(${PROJECT_NAME})

View File

@ -1 +0,0 @@
include $(shell rospack find mk)/cmake.mk

View File

@ -1,134 +0,0 @@
if(ROSBUILD)
include(rosbuild.cmake)
return()
endif()
# We can't use rosbuild/rosbuild.cmake here, because rosbuild.cmake
# requires rospack, and we're in the process of building rospack.
cmake_minimum_required(VERSION 2.4.6)
set(CMAKE_BUILD_TYPE Release)
set(CMAKE_OSX_ARCHITECTURES "x86_64")
set(CMAKE_INSTALL_PREFIX /tmp/rospack)
#set(CMAKE_INSTALL_RPATH_USE_LINK_RPATH true)
#set(CMAKE_SKIP_BUILD_RPATH true)
set(CMAKE_INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib")
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
include_directories(include ${PROJECT_SOURCE_DIR})
# Include the rosbuild's rosconfig.cmake, which includes logic for checking
# for $ROS_ROOT/rosconfig.cmake, where the user may have adjusted the build
# configuration. In particular, that's where static vs. shared is set.
include($ENV{ROS_ROOT}/core/rosbuild/rosconfig.cmake)
add_definitions(-DTIXML_USE_STL)
set(rospack_sources rospack.cpp
tinyxml-2.5.3/tinystr.cpp
tinyxml-2.5.3/tinyxml.cpp
tinyxml-2.5.3/tinyxmlparser.cpp
tinyxml-2.5.3/tinyxmlerror.cpp)
set(rosstack_sources rosstack.cpp)
# Here we duplicate a bit of the logic in rosbuild/public.cmake.
if(NOT ROS_BUILD_STATIC_LIBS AND NOT ROS_BUILD_SHARED_LIBS)
message(FATAL_ERROR "Neither shared nor static libraries are enabled. Please set either ROS_BUILD_STATIC_LIBS or ROS_BUILD_SHARED_LIBS to true.")
endif(NOT ROS_BUILD_STATIC_LIBS AND NOT ROS_BUILD_SHARED_LIBS)
if(ROS_BUILD_STATIC_EXES AND ROS_BUILD_SHARED_LIBS)
message(FATAL_ERROR "Static executables are requested, but so are shared libs. This configuration is unsupported. Please either set ROS_BUILD_SHARED_LIBS to false or set ROS_BUILD_STATIC_EXES to false.")
endif(ROS_BUILD_STATIC_EXES AND ROS_BUILD_SHARED_LIBS)
if(ROS_BUILD_SHARED_LIBS)
# If shared libs are being built, they get the default CMake target name
# No matter what, the libraries get the same name in the end.
add_library(rospack SHARED ${rospack_sources})
add_library(rosstack SHARED ${rosstack_sources})
# Prevent deletion of existing lib of same name
set_target_properties(rospack PROPERTIES CLEAN_DIRECT_OUTPUT 1)
set_target_properties(rosstack PROPERTIES CLEAN_DIRECT_OUTPUT 1)
endif(ROS_BUILD_SHARED_LIBS)
if(ROS_BUILD_STATIC_LIBS)
add_definitions("-DROS_STATIC")
# If we're only building static libs, then they get the default CMake
# target name.
if(NOT ROS_BUILD_SHARED_LIBS)
set(static_rospack "rospack")
set(static_rosstack "rosstack")
else(NOT ROS_BUILD_SHARED_LIBS)
set(static_rospack "rospack-static")
set(static_rosstack "rosstack-static")
endif(NOT ROS_BUILD_SHARED_LIBS)
add_library(${static_rospack} STATIC ${rospack_sources})
add_library(${static_rosstack} STATIC ${rosstack_sources})
# Set output name to be the same as shared lib (may not work on Windows)
set_target_properties(${static_rospack} PROPERTIES OUTPUT_NAME "rospack")
set_target_properties(${static_rosstack} PROPERTIES OUTPUT_NAME "rosstack")
# Also add -fPIC, because CMake leaves it out when building static
# libs, even though it's necessary on 64-bit machines for linking this
# lib against shared libs downstream.
set_target_properties(${static_rospack} PROPERTIES COMPILE_FLAGS "-fPIC")
set_target_properties(${static_rosstack} PROPERTIES COMPILE_FLAGS "-fPIC")
# Prevent deletion of existing lib of same name
set_target_properties(${static_rospack} PROPERTIES CLEAN_DIRECT_OUTPUT 1)
set_target_properties(${static_rosstack} PROPERTIES CLEAN_DIRECT_OUTPUT 1)
endif(ROS_BUILD_STATIC_LIBS)
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../../bin)
add_executable(rospackexe main.cpp)
set_target_properties(rospackexe PROPERTIES OUTPUT_NAME rospack)
target_link_libraries(rosstack rospack)
add_executable(rosstackexe rosstack_main.cpp)
set_target_properties(rosstackexe PROPERTIES OUTPUT_NAME rosstack)
target_link_libraries(rospackexe rospack)
target_link_libraries(rosstackexe rosstack rospack)
if(ROS_BUILD_STATIC_EXES AND ${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
# This will probably only work on Linux. The LINK_SEARCH_END_STATIC
# property should be sufficient, but it doesn't appear to work
# properly.
set_target_properties(rospackexe PROPERTIES
LINK_FLAGS "-static-libgcc -Wl,-Bstatic")
set_target_properties(rosstackexe PROPERTIES
LINK_FLAGS "-static-libgcc -Wl,-Bstatic")
endif(ROS_BUILD_STATIC_EXES AND ${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
#install(TARGETS rospack rosstack rospackexe rosstackexe
# RUNTIME DESTINATION bin
# LIBRARY DESTINATION lib)
#install(FILES include/rospack/rospack.h
# DESTINATION include/rospack)
# Prevent warnings about duplicate definition of the targets mentioned
# below
if(COMMAND cmake_policy)
# Logical target names must be globally unique.
cmake_policy(SET CMP0002 OLD)
endif(COMMAND cmake_policy)
# These targets might be called by rosmakeall
add_custom_target(test)
add_custom_target(tests)
add_custom_target(test-results)
add_custom_target(test-future)
add_custom_target(gcoverage)
#########################################
# Uncomment below for new rospack
#add_library(rp rp.cpp
# tinyxml-2.5.3/tinyxml.cpp
# tinyxml-2.5.3/tinyxmlparser.cpp
# tinyxml-2.5.3/tinyxmlerror.cpp)
#add_executable(rpexe rp_main.cpp)
#set_target_properties(rpexe PROPERTIES OUTPUT_NAME rp)
#target_link_libraries(rpexe rp boost_filesystem boost_system boost_program_options)
#add_executable(rs rs_main.cpp)
#target_link_libraries(rs rp boost_filesystem boost_system)
# Uncomment above for new rospack
#########################################

View File

@ -1,75 +0,0 @@
# Can't include cmake.mk because we need rospack to find it, and we're
# trying to build rospack. So we inline a stripped-down version of
# cmake.mk.
#include $(shell rospack find mk)/cmake.mk
# The all target does the heavy lifting, creating the build directory and
# invoking CMake
all:
@mkdir -p build
-mkdir -p bin
@if ! (cd build && cmake ..); then \
echo "[rosbuild] CMake failed; trying to clean and start over"; \
make clean; \
mkdir -p build; \
cd build && cmake ..; \
fi
cd build && make $(PARALLEL_JOBS)
install: all
cd build && make install
# The clean target blows everything away
clean:
-cd build && make clean
rm -rf build
test: all
if cd build && make -k $@; then make test-results; else make test-results && exit 1; fi
tests: all
cd build && make $@
test-future: all
cd build && make -k $@
gcoverage: all
cd build && make $@
#SRC = main.cpp
#LIBSRC = rospack.cpp \
# tinyxml-2.5.3/tinystr.cpp \
# tinyxml-2.5.3/tinyxml.cpp \
# tinyxml-2.5.3/tinyxmlparser.cpp \
# tinyxml-2.5.3/tinyxmlerror.cpp
#
#
#OBJ = $(SRC:.cpp=.o)
#LIBOBJ = $(LIBSRC:.cpp=.o)
#OUT = ../../bin/rospack
#LIBOUT = librospack.a
#
#CC=g++
#AR=ar
#LIBS=-lm
#CFLAGS= -O3 -Wall -fPIC
## For code coverage
##LIBS=-lm -lgcov
##CFLAGS= -O0 -Wall -g -fprofile-arcs -ftest-coverage
#INCLUDES=-I.
#
#default: depend $(OUT) $(LIBOUT)
#
#$(OUT): $(OBJ) $(LIBOUT)
# ${CC} $(OBJ) -o $(OUT) $(LIBS) -L. -lrospack
#
#$(LIBOUT): $(LIBOBJ)
# ${AR} cr $@ $(LIBOBJ)
#
#.cpp.o:
# ${CC} ${CFLAGS} ${INCLUDES} -c $< -o $@
#
#depend: $(SRC) $(LIBSRC)
# gcc $(INCLUDES) -MM $(SRC) $(LIBSRC) >depend
#
#clean:
# rm -f depend $(OBJ) $(OUT) $(LIBOUT) $(LIBOBJ)
#
#-include depend

View File

@ -1,364 +0,0 @@
/*
* Copyright (C) 2008, Morgan Quigley and Willow Garage, Inc.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the names of Stanford University or Willow Garage, Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef ROSPACK_ROSPACK_H
#define ROSPACK_ROSPACK_H
/* Author: Morgan Quigley, Brian Gerkey */
/**
\mainpage
\htmlinclude manifest.html
\section overview Overview
\b %rospack is the ROS package management tool. The %rospack package contains
a single binary, called \b %rospack.
- Jump to \ref Usage "command-line usage".
%rospack is part dpkg, part pkg-config. The main function of %rospack is
to crawl through the packages in ROS_ROOT and ROS_PACKAGE_PATH, read and
parse the \b manifest.xml for each package, and assemble a complete
dependency tree for all packages.
Using this tree, %rospack can answer a number of queries about packages and
their dependencies. Common queries include:
- find : return the absolute path to a package
- depends : return a list of all of a package's dependencies
- depends-on : return a list of packages that depend on the given package
- export : return flags necessary for building and linking against a package
%rospack is intended to be cross-platform.
\subsection crawling Crawling algorithm
%rospack crawls in the following order: the directory ROS_ROOT, followed by
the colon-separated list of directories ROS_PACKAGE_PATH, in the order they
are listed.
During the crawl, %rospack examines the contents of each directory, looking
for a file called @b manifest.xml. If such a file is found, the directory
containing it is considered to be a ROS package, with the package name
equal to the directory name. The crawl does not descend further once a
manifest is found (i.e., packages cannot be nested inside one another).
If a manifest.xml file is not found in a given directory, each subdirectory
is searched. This subdirectory search is prevented if a file called @b
rospack_nosubdirs is found. The directory itself is still searched for a
manifest, but its subdirectories are not crawled.
If multiple packages by the same name exist within the search path, the
first one found wins. It is strongly recommended that you keep packages by
the same name in separate trees, each having its own element within
ROS_PACKAGE_PATH. That way, you can deterministically control the search
order by the way that you specify ROS_PACKAGE_PATH. The search order
within a given element of ROS_PACKAGE_PATH can be unpredictably affected by
the details of how files are laid out on disk.
\subsection efficiency Efficiency considerations
%rospack re-parses the manifest.xml files and rebuilds the dependency tree
on each execution. However, it maintains a cache of package directories in
ROS_ROOT/.rospack_cache. This cache is updated whenever there is a cache
miss, or when the cache is 60 seconds old. You can change this timeout by
setting the environment variable ROS_CACHE_TIMEOUT, in seconds. Set it to
0.0 to force a cache rebuild on every invocation of %rospack.
%rospack's performance can be adversely affected by the presence of very
broad and/or deep directory structures that don't contain manifest files.
If such directories are in %rospack's search path, it can spend a lot of
time crawling them only to discover that there are no packages to be found.
You can prevent this latency by creating a @b rospack_nosubdirs file in
such directories. If rospack seems to be running annoyingly slowly, you
can use the profile command, which will print out the 20 slowest trees
to crawl (or use profile --length=N to print the slowest N trees).
\subsection dependencies No dependencies
Because %rospack is the tool that determines dependencies, it cannot depend
on anything else. Thus %rospack contains a copy of the TinyXML library,
instead of using the copy available in 3rdparty. For the same reason, unit
tests for %rospack, which require gtest, are in a separate package, called
rospack_test.
\section codeapi Code API
%rospack is used entirely as a command-line tool. While the main
functionality within %rospack is built as a library for testing purposes,
it is not intended for use in writing other applications. Should this
change, the %rospack library API should be cleaned up and better
documented.
For now, the user-visible API is:
- rospack::ROSPack::ROSPack()
- rospack::ROSPack::run()
See main.cpp for example usage
\section rosapi ROS API
%rospack does not expose a ROS API.
\section commandline Command-line tools
\subsection rospack rospack
%rospack is the command-line tool that provides package management services.
%rospack crawls the directory ROS_ROOT and the colon-separated directories
in ROS_PACKAGE_PATH, determining a directory to be package if it contains a
file called @b manifest.xml.
*/
#if defined(WIN32)
#if defined(ROS_STATIC)
#define ROSPACK_EXPORT
#elif defined(rospack_EXPORTS)
#define ROSPACK_EXPORT __declspec(dllexport)
#else
#define ROSPACK_EXPORT __declspec(dllimport)
#endif
#else
#define ROSPACK_EXPORT
#endif
#include <string>
#include <vector>
#include <list>
#include "tinyxml-2.5.3/tinyxml.h"
namespace rospack
{
class Package;
// global helper functions
void string_split(const std::string &s, std::vector<std::string> &t, const std::string &d);
bool file_exists(const std::string &fname);
extern const char *fs_delim;
Package *g_get_pkg(const std::string &name);
typedef std::vector<Package *> VecPkg;
typedef std::list<Package*> Acc;
typedef std::list<Acc> AccList;
/**
* The Package class contains information about a single package
*/
class ROSPACK_EXPORT Package
{
public:
enum traversal_order_t { POSTORDER, PREORDER };
std::string name, path;
// These will cause warnings on Windows when compiling the DLL because they
// are static. They should more correctly be accessed via accessor functions
// that are exported from the class, rather than directly, in order to
// "prevent data corruption." Since main.cpp is currently the only known
// client and it doesn't use them, I'm not caring about the warnings yet.
static std::vector<Package *> pkgs;
static std::vector<Package *> deleted_pkgs;
Package(std::string _path);
static bool is_package(std::string path);
static bool is_no_subdirs(std::string path);
const VecPkg &deps1();
const VecPkg &deps(traversal_order_t order, int depth=0);
std::string manifest_path();
std::string flags(std::string lang, std::string attrib);
std::string rosdep();
std::string versioncontrol();
std::vector<std::pair<std::string, std::string> > plugins();
VecPkg descendants1();
const std::vector<Package *> &descendants(int depth=0);
rospack_tinyxml::TiXmlElement *manifest_root();
void accumulate_deps(AccList& acc_list, Package* to);
/**
* \brief Returns the message flags for this package. If the path/msg or path/srv directories exist,
* adds appropriate compile/link flags depending on what is requested
* \param cflags Whether or not to include compile flags
* \param lflags Whether or not to include link flags
*/
std::string cpp_message_flags(bool cflags, bool lflags);
private:
bool deps_calculated, direct_deps_calculated, descendants_calculated;
std::vector<Package *> _deps, _direct_deps, _descendants;
rospack_tinyxml::TiXmlDocument manifest;
bool manifest_loaded;
Package(const Package &p) { } // just override the default public one
bool has_parent(std::string pkg);
const std::vector<Package *> &direct_deps(bool missing_pkg_as_warning=false);
std::string direct_flags(std::string lang, std::string attrib);
void load_manifest();
};
/**
* The ROSPack class contains information the entire package dependency
* tree.
*/
class ROSPACK_EXPORT ROSPack
{
public:
static const char* usage();
char *ros_root;
ROSPack();
~ROSPack();
Package *get_pkg(std::string pkgname);
int cmd_depends_on(bool include_indirect);
int cmd_depends_why();
int cmd_find();
int cmd_deps();
int cmd_depsindent(Package* pkg, int indent);
int cmd_deps_manifests();
int cmd_deps_msgsrv();
int cmd_deps1();
/*
int cmd_predeps(char **args, int args_len);
*/
std::string snarf_libs(std::string flags, bool invert=false);
std::string snarf_flags(std::string flags, std::string token, bool invert=false);
int cmd_libs_only(std::string token);
int cmd_cflags_only(std::string token);
int cmd_make(char **args, int args_len);
void export_flags(std::string pkg, std::string lang, std::string attrib);
int cmd_versioncontrol(int depth);
int cmd_rosdep(int depth);
int cmd_export();
int cmd_plugins();
/** @brief The method that does the work.
*
* Call the run() method with argc and argv to crawl for packages, build
* the tree, and answer the query in the command-line arguments.
*
* @throws std::runtime_error
*/
int run(int argc, char **argv);
// Another form of run, which takes the arguments as a single string.
// WARNING: this method does naive string-splitting on spaces.
int run(const std::string& cmd);
// Get the accumulated output
std::string getOutput() { return output_acc; }
// is -q (quiet) provided ?
bool is_quiet() { return opt_quiet; }
int cmd_print_package_list(bool print_path);
int cmd_list_duplicates();
int cmd_print_langs_list();
void crawl_for_packages(bool force_crawl = false);
VecPkg partial_crawl(const std::string &path);
// Exposed for testing purposes only
std::string deduplicate_tokens(const std::string& s);
// Storage for --foo options
// --deps-only
bool opt_deps_only;
// --lang=
std::string opt_lang;
// --attrib=
std::string opt_attrib;
// --length=
std::string opt_length;
// --top=
std::string opt_top;
// The package name
std::string opt_package;
// --target=
std::string opt_target;
// the number of entries to list in the profile table
int opt_profile_length;
// only display zombie directories in profile?
bool opt_profile_zombie_only;
// display warnings about missing dependencies?
bool opt_warn_on_missing_deps;
// display pairs of duplicate packages?
bool opt_display_duplicate_pkgs;
private:
// is quiet
bool opt_quiet;
bool cache_lock_failed;
bool crawled;
std::string getCachePath();
// Storage for list of path components, used in add_package. We keep it
// here to avoid reallocation in every run of add_package.
std::vector<std::string> path_components;
// Add package, filtering out duplicates.
Package* add_package(std::string path);
/** tests if the cache exists, is new enough, and is valid */
bool cache_is_good();
/** returns a double representing the seconds since the Epoch */
static double time_since_epoch();
/** remove trailing slashes */
void sanitize_rppvec(std::vector<std::string> &rppvec);
// Output accumulates here
std::string output_acc;
// A place to store heap-allocated argv, in case we were passed a
// std::string in run(). It'll be freed on destruction.
int my_argc;
char** my_argv;
void freeArgv();
// Total number of packages found, including duplicates. Used in
// determining whether a directory is a zombie.
int total_num_pkgs;
// Were there any duplicate pkgs found in the crawl?
bool duplicate_packages_found;
};
}
#endif

View File

@ -1,161 +0,0 @@
/*
* Copyright (C) 2009, Morgan Quigley, Brian Gerkey
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the names of Stanford University nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef ROSSTACK_ROSSTACK_H
#define ROSSTACK_ROSSTACK_H
/* Author: Morgan Quigley, Brian Gerkey */
/**
\mainpage
\htmlinclude manifest.html
\section overview Overview
\b %rosstack is a ROS dependency and distribution tool. The %rosstack package contains
a single binary, called \b %rosstack.
*/
#if defined(WIN32)
#if defined(ROS_STATIC)
#define ROSSTACK_EXPORT
#elif defined(rosstack_EXPORTS)
#define ROSSTACK_EXPORT __declspec(dllexport)
#else
#define ROSSTACK_EXPORT __declspec(dllimport)
#endif
#else
#define ROSSTACK_EXPORT
#endif
#include <string>
#include <vector>
#include "tinyxml-2.5.3/tinyxml.h"
#include "rospack/rospack.h"
namespace rosstack
{
class ROSSTACK_EXPORT Stack;
// global helper functions
void string_split(const std::string &s, std::vector<std::string> &t, const std::string &d);
bool file_exists(const std::string &fname);
extern const char *fs_delim;
extern const char *path_delim;
Stack *g_get_stack(const std::string &name);
typedef std::vector<Stack *> VecStack;
/**
* The Stack class contains information about a single stack
*/
class ROSSTACK_EXPORT Stack
{
public:
enum traversal_order_t { POSTORDER, PREORDER };
std::string name, path;
static std::vector<Stack *> stacks;
Stack(std::string _path);
static bool is_stack(const std::string &path);
static bool is_package(const std::string &path);
static bool is_no_subdirs(const std::string &path);
const VecStack &deps1();
const VecStack &deps(traversal_order_t order, int depth=0);
std::string manifest_path();
VecStack descendants1();
const VecStack &descendants(int depth=0);
rospack_tinyxml::TiXmlElement *manifest_root();
private:
bool deps_calculated, direct_deps_calculated, descendants_calculated;
VecStack _deps, _direct_deps, _descendants;
rospack_tinyxml::TiXmlDocument manifest;
bool manifest_loaded;
Stack(const Stack &p) { } // just override the default public one
bool has_parent(std::string stk);
const VecStack &direct_deps(bool missing_pkg_as_warning=false);
void load_manifest();
};
/**
* The ROSStack class contains information the entire stack dependency
* tree.
*/
class ROSSTACK_EXPORT ROSStack
{
public:
static const char* usage();
char *ros_root;
rospack::ROSPack rp;
ROSStack();
~ROSStack();
Stack *get_stack(const std::string &name);
int cmd_depends_on(bool include_indirect);
int cmd_find();
int cmd_contains();
int cmd_contains_path();
int cmd_deps();
int cmd_depsindent(Stack* stk, int indent);
int cmd_deps_manifests();
int cmd_deps1();
/** @brief The method that does the work.
*
* Call the run() method with argc and argv to crawl for packages, build
* the tree, and answer the query in the command-line arguments.
*
* @throws std::runtime_error
*/
int run(int argc, char **argv);
int cmd_print_stack_list(bool print_path);
int cmd_print_packages();
void crawl_for_stacks(bool force_crawl = false);
std::string lookup_owner(std::string pkg_name, bool just_owner_name);
void deleteCache();
private:
bool crawled;
/** tests if the cache exists, is new enough, and is valid */
void createROSHomeDirectory();
std::string getCachePath();
// Add stack, filtering out duplicates.
Stack* add_stack(std::string path);
bool cache_is_good();
/** returns a double representing the seconds since the Epoch */
static double time_since_epoch();
/** remove trailing slashes */
void sanitize_rppvec(std::vector<std::string> &rppvec);
};
}
#endif

View File

@ -1,98 +0,0 @@
/*
* Copyright (C) 2008, Morgan Quigley and Willow Garage, Inc.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the names of Stanford University or Willow Garage, Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/* Author: Morgan Quigley, Brian Gerkey */
#include "rospack/rospack.h"
#include <stdexcept>
#if !defined(WIN32)
#include <unistd.h>
#endif
#include <stdlib.h>
int main(int argc, char **argv)
{
if (argc <= 1)
{
fputs(rospack::ROSPack::usage(), stderr);
return 0;
}
#if !defined(WIN32)
// If it looks we're running under sudo, try to drop back to the normal
// user, to avoid writing the cache with inappropriate permissions,
// #2884.
// Do the group first, because we can't do it after changing the user.
char* sudo_gid_string = getenv("SUDO_GID");
if(sudo_gid_string)
{
gid_t sudo_gid = (int)strtol(sudo_gid_string, (char **)NULL, 10);
if(setgid(sudo_gid))
perror("[rospack] Failed to change GID; cache permissions may need to be adjusted manually. setgid()");
}
char* sudo_uid_string = getenv("SUDO_UID");
if(sudo_uid_string)
{
uid_t sudo_uid = (int)strtol(sudo_uid_string, (char **)NULL, 10);
if(setuid(sudo_uid))
perror("[rospack] Failed to change UID; cache permissions may need to be adjusted manually. setuid()");
}
#endif
int ret;
bool quiet;
try
{
// Declare ROSPack instance inside the try block because its
// constructor can throw (e.g., when ROS_ROOT isn't set).
rospack::ROSPack rp;
// Separate try block for running the command, to allow for suppressing
// error output when -q is given.
try
{
ret = rp.run(argc, argv);
printf("%s", rp.getOutput().c_str());
}
catch(std::runtime_error &e)
{
// Return code is -1 no matter what, but don't rethrow if we were
// asked to be quiet.
ret = -1;
if(!rp.is_quiet())
throw;
}
}
catch(std::runtime_error &e)
{
fprintf(stderr, "[rospack] %s\n", e.what());
ret = -1;
}
return ret;
}

View File

@ -1,35 +0,0 @@
<package>
<description brief="C++ implementation of the ROS package manager">
<p>
rospack is a command-line program which provides many of the services of the *NIX
pkg-config tool. It is used to find packages among the "forest" of code in a
typical ROS distribution, calculate dependencies, mangle Makefiles, and in
general promote peace and harmony in a ROS distribution.
</p>
<p>
rospack uses the TinyXML parser, a zLib-licensed library which is available here:
<a href="http://tinyxml.sourceforge.net">http://tinyxml.sourceforge.net</a>
</p>
</description>
<author>Morgan Quigley, Brian Gerkey</author>
<license>BSD</license>
<review status="Doc reviewed" notes="2010-01-07, excludes rosstack"/>
<export>
<cpp cflags="-I${prefix} -I${prefix}/include" lflags="-L${prefix}/lib -Wl,-rpath,${prefix}/lib -lrospack -lrosstack"/>
</export>
<platform os="ubuntu" version="9.04"/>
<platform os="ubuntu" version="9.10"/>
<platform os="ubuntu" version="10.04"/>
<platform os="macports" version="macports"/>
<rosbuild2>
<export>
<include_dir>${rospack_SOURCE_DIR}/include</include_dir>
<include_dir>${rospack_SOURCE_DIR}</include_dir>
<lib>rospack</lib>
</export>
</rosbuild2>
</package>

View File

@ -1,119 +0,0 @@
#! /usr/bin/env python
# Copyright (c) 2009, Willow Garage, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of Willow Garage, Inc. nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
# Author Tully Foote tfoote@willowgarage.com
#from __future__ import with_statement
import os
import re
import distutils.version
import sys, string
import subprocess
import getopt
import roslib
import roslib.rosenv
from math import sqrt
from optparse import OptionParser
def get_all_packages(stack_name):
try:
# Check version, make postscript if too old to make pdf
args = ["rosstack", "contents", stack_name]
vstr, verr = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
except subprocess.CalledProcessError:
print >> sys.stderr, "failed to call [rosstack contents %s]"%stack_name
return vstr.split()
def mark_uninstalled(packages):
print "uninstalling, ", packages
for p in packages:
filename = os.path.join(roslib.packages.get_pkg_dir(p), "ROS_NOBUILD")
subprocess.check_call(["rm", filename])
def mark_installed(packages):
print "installing ", packages
for p in packages:
filename = os.path.join(roslib.packages.get_pkg_dir(p), "ROS_NOBUILD")
subprocess.check_call(["touch", filename])
def build_stack(packages):
print "building ", packages
args = ["rosmake"]
args.extend( packages )
subprocess.check_call(args)
def vdmain():
parser = OptionParser(usage="usage: %prog [options] [stack1] ... [stackN]", prog='rxdeps')
parser.add_option("-i", "--installed", dest="installed", default=False,
action="store_true", help="Mark Packages as installed")
parser.add_option("-u", "--uninstalled", dest="uninstalled", default=False,
action="store_true", help="Unmark packages as installed")
parser.add_option("-b", "--build", dest="build", default=False,
action="store_true", help="Build all packages in stack")
parser.add_option("--stack_string", dest="stack_string", default=None,
action="store", help="stack name (DEPRECATED)")
parser.add_option("--stack_name", dest="stack_name", default=None,
action="store", help="stack name(DEPRECATED)")
parser.add_option("--stack_version", dest="stack_version", default=None,
action="store", help="stack version(DEPRECATED)")
options, args = parser.parse_args()
if options.stack_name:
args.append(options.stack_name)
print "WARNING: --stack_name deprecated use arguments!"
if options.stack_string:
args.append(options.stack_string)
print "WARNING: --stack_string deprecated use arguments!"
if options.stack_version:
print "WARNING: Stack version not used!"
packages = []
for s in args:
packages.extend(get_all_packages(s))
if options.build:
build_stack(packages)
if options.installed:
mark_installed(packages)
elif options.uninstalled:
mark_uninstalled(packages)
if __name__ == '__main__':
vdmain()

View File

@ -1,66 +0,0 @@
#!/usr/bin/env python
import os, sys
from optparse import OptionParser
NAME = 'rosalldeps'
# Taken from
# http://mail.python.org/pipermail/python-list/2005-November/352658.html
def remove_dups(L):
"""Removes duplicate items from list L in place."""
# Work backwards from the end of the list.
for i in range(len(L)-1, -1, -1):
# Check to see if the current item exists elsewhere in
# the list, and if it does, delete it.
if L[i] in L[:i]:
del L[i]
def go(pkg, height):
children = os.popen('rospack deps ' + pkg).readlines()
if height == -1:
parents = os.popen('rospack depends-on ' + pkg).readlines()
elif height == 1:
parents = os.popen('rospack depends-on1 ' + pkg).readlines()
siblings = []
for p in parents:
siblings.extend(os.popen('rospack deps ' + p))
alldeps = []
alldeps.extend(children)
alldeps.extend(siblings)
alldeps.extend([pkg])
alldeps.extend(parents)
remove_dups(alldeps)
for d in alldeps:
dir = os.popen('rospack find ' + d).readlines()[0].strip()
if os.path.exists(os.path.join(dir,'ROS_BUILD_BLACKLIST')) or \
os.path.exists(os.path.join(dir,'ROS_NOBUILD')) or \
not os.path.exists(os.path.join(dir,'Makefile')):
continue
else:
print d.strip()
if __name__ == '__main__':
parser = OptionParser(usage="usage: %prog [options] <pkg>", prog=NAME)
parser.add_option("-H", "--height",
dest="height", default=None,
help="Limit maximum height of depends-on build (either 1 or -1)")
(options, args) = parser.parse_args(sys.argv)
if len(args) != 2:
parser.error('package must be specified')
pkg = args[1]
height = -1
if options.height:
height = int(options.height)
if height != 1 and height != -1:
parser.error('height must be 1 or -1')
go(pkg, height)

View File

@ -1,32 +0,0 @@
#!/usr/bin/env python
USAGE = 'USAGE: rosallpkgs [pkg1 pkg2...]'
# Taken from
# http://mail.python.org/pipermail/python-list/2005-November/352658.html
def remove_dups(L):
"""Removes duplicate items from list L in place."""
# Work backwards from the end of the list.
for i in range(len(L)-1, -1, -1):
# Check to see if the current item exists elsewhere in
# the list, and if it does, delete it.
if L[i] in L[:i]:
del L[i]
import os, sys
if len(sys.argv) > 1:
pkgs = sys.argv[1:]
else:
pkgs = os.popen('rospack list-names').readlines()
alldeps = []
for pkg in pkgs:
children = os.popen('rospack deps ' + pkg).readlines()
alldeps.extend(children)
alldeps.extend([pkg])
remove_dups(alldeps)
for d in alldeps:
print d.strip()

View File

@ -1,37 +0,0 @@
include(${CMAKE_CURRENT_BINARY_DIR}/package.cmake)
include_directories(include ${PROJECT_SOURCE_DIR})
add_definitions(-DTIXML_USE_STL)
if(ROS_BUILD_STATIC_LIBS)
add_definitions("-DROS_STATIC")
endif()
set(rospack_sources rospack.cpp
tinyxml-2.5.3/tinystr.cpp
tinyxml-2.5.3/tinyxml.cpp
tinyxml-2.5.3/tinyxmlparser.cpp
tinyxml-2.5.3/tinyxmlerror.cpp)
set(rosstack_sources rosstack.cpp)
rosbuild_add_library(rospack ${rospack_sources})
rosbuild_add_library(rosstack ${rosstack_sources})
rosbuild_add_executable(rospackexe main.cpp)
set_target_properties(rospackexe PROPERTIES OUTPUT_NAME rospack)
target_link_libraries(rosstack rospack)
rosbuild_add_executable(rosstackexe rosstack_main.cpp)
set_target_properties(rosstackexe PROPERTIES OUTPUT_NAME rosstack)
target_link_libraries(rospackexe rospack)
target_link_libraries(rosstackexe rosstack rospack)
install(TARGETS rospack rosstack rospackexe rosstackexe
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)
install(FILES include/rospack/rospack.h
DESTINATION include/rospack)

View File

@ -1,18 +0,0 @@
#!/bin/bash
pkgs=`rospack list-names`
vcs=
for p in $pkgs; do
vc=`rospack vcs0 $p | sed 's/type: svn.*url: \([ ]*\)/\1/g'`
for v in $vc; do
vcs+=$v
vcs+=' '
done
done
for v in $vcs; do
if ! (echo p | svn info $v); then
echo "Warning: failed to cache certificate for $v"
fi
done

File diff suppressed because it is too large Load Diff

View File

@ -1,33 +0,0 @@
#!/bin/sh
# Case-insentive search through all manifests for a term. Returns
# newline-separated list of names of packages that match the search term
USAGE="USAGE: rossearch <term>"
if [ $# != 1 ]; then
echo $USAGE
exit -1
fi
term=$1
pkgdirs=`rospack list | awk {'print \$2'}`
manifests=""
for d in $pkgdirs; do
mnf="$d/manifest.xml"
if [ ! -f $mnf ]; then
echo "Missing manifest in $d!"
else
manifests="$manifests $mnf"
fi
done
grepresult=`grep -il "$term" $manifests`
for g in $grepresult; do
d=`dirname $g`
p=`basename $d`
echo $p
done

File diff suppressed because it is too large Load Diff

View File

@ -1,51 +0,0 @@
/*
* Copyright (C) 2009, Morgan Quigley, Brian Gerkey
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the names of Stanford University nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/* Author: Morgan Quigley, Brian Gerkey */
#include <stdexcept>
#include "rospack/rosstack.h"
int main(int argc, char **argv)
{
if (argc <= 1)
return (fputs(rosstack::ROSStack::usage(), stderr) < 0);
int ret;
try
{
rosstack::ROSStack rs;
ret = rs.run(argc, argv);
}
catch(std::runtime_error &e)
{
fprintf(stderr, "[rosstack] %s\n", e.what());
ret = -1;
}
return ret;
}

File diff suppressed because it is too large Load Diff

View File

@ -1,168 +0,0 @@
/*
* Copyright (C) 2008, Willow Garage, Inc.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the names of Stanford University or Willow Garage, Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef ROSPACK_ROSPACK_H
#define ROSPACK_ROSPACK_H
#include <boost/tr1/unordered_set.hpp>
#include <boost/tr1/unordered_map.hpp>
#include <string>
#include <map>
#include <vector>
#include <stdexcept>
namespace rospack
{
typedef enum
{
CRAWL_UP,
CRAWL_DOWN
} crawl_direction_t;
typedef enum
{
POSTORDER,
PREORDER
} traversal_order_t;
class Stackage;
class DirectoryCrawlRecord;
class Rosstackage
{
private:
std::string manifest_name_;
std::string cache_name_;
crawl_direction_t crawl_dir_;
bool crawled_;
std::tr1::unordered_set<std::string> dups_;
void addStackage(const std::string& path);
void crawlDetail(const std::string& path,
bool force,
int depth,
bool collect_profile_data,
std::vector<DirectoryCrawlRecord*>& profile_data,
std::tr1::unordered_set<std::string>& profile_hash);
bool dependsOnDetail(const std::string& name, bool direct,
std::vector<Stackage*>& deps);
bool depsDetail(const std::string& name, bool direct,
std::vector<Stackage*>& deps);
bool isStackage(const std::string& path);
void loadManifest(Stackage* stackage);
void computeDeps(Stackage* stackage, bool ignore_errors=false);
void gatherDeps(Stackage* stackage, bool direct,
traversal_order_t order,
std::vector<Stackage*>& deps);
void gatherDepsFull(Stackage* stackage, bool direct,
traversal_order_t order, int depth,
std::tr1::unordered_set<Stackage*>& deps_hash,
std::vector<Stackage*>& deps,
bool get_indented_deps,
std::vector<std::string>& indented_deps);
std::string getCachePath();
bool readCache();
void writeCache();
bool validateCache();
bool expandExportString(Stackage* stackage,
const std::string& instring,
std::string& outstring);
protected:
std::tr1::unordered_map<std::string, Stackage*> stackages_;
void crawl(const std::vector<std::string>& search_path, bool force);
bool inStackage(std::string& name);
public:
Rosstackage(std::string manifest_name,
std::string cache_name,
crawl_direction_t crawl_dir,
bool quiet);
virtual ~Rosstackage();
bool find(const std::string& name, std::string& path);
void list(std::vector<std::pair<std::string, std::string> >& list);
void listDuplicates(std::vector<std::string>& dups);
bool deps(const std::string& name, bool direct, std::vector<std::string>& deps);
bool dependsOn(const std::string& name, bool direct,
std::vector<std::string>& deps);
bool depsManifests(const std::string& name, bool direct,
std::vector<std::string>& manifests);
bool depsMsgSrv(const std::string& name, bool direct,
std::vector<std::string>& gens);
bool depsIndent(const std::string& name, bool direct,
std::vector<std::string>& deps);
bool rosdeps(const std::string& name, bool direct,
std::vector<std::string>& rosdeps);
bool vcs(const std::string& name, bool direct,
std::vector<std::string>& vcs);
bool exports(const std::string& name, const std::string& lang,
const std::string& attrib, bool deps_only,
std::vector<std::string>& flags);
bool plugins(const std::string& name, const std::string& attrib,
const std::string& top,
std::vector<std::string>& flags);
bool profile(const std::vector<std::string>& search_path,
bool zombie_only,
int length,
std::vector<std::string>& dirs);
};
class Rospack : public Rosstackage
{
public:
Rospack(bool quiet=false);
void crawl(const std::vector<std::string>& search_path,
bool force);
bool inPackage(std::string& name);
};
class Rosstack : public Rosstackage
{
public:
Rosstack(bool quiet=false);
void crawl(const std::vector<std::string>& search_path,
bool force);
bool inStack(std::string& name);
};
bool get_search_path_from_env(std::vector<std::string>& sp);
// Simple console output helpers
void log_warn(const std::string& name,
const std::string& msg,
bool append_errno = false);
void log_error(const std::string& name,
const std::string& msg,
bool append_errno = false);
} // namespace rospack
#endif

View File

@ -1,785 +0,0 @@
/*
* Copyright (C) 2008, Willow Garage, Inc.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the names of Stanford University or Willow Garage, Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "rp.h"
#include <boost/program_options.hpp>
#include <boost/algorithm/string.hpp>
#include <algorithm>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
namespace po = boost::program_options;
const char* usage();
bool parse_args(int argc, char** argv, po::variables_map& vm);
void parse_compiler_flags(const std::string& instring,
const std::string& token,
bool select,
bool last,
std::string& outstring);
void deduplicate_tokens(const std::string& instring,
bool last,
std::string& outstring);
int
main(int argc, char** argv)
{
po::variables_map vm;
if(!parse_args(argc, argv, vm))
return 1;
bool quiet = (vm.count("quiet")==1);
rospack::Rospack rp(quiet);
std::string command;
std::string package;
bool package_given = false;
bool deps_only = false;
std::string lang;
std::string attrib;
std::string top;
std::string target;
bool zombie_only = false;
std::string length_str;
int length;
if(vm.count("command"))
command = vm["command"].as<std::string>();
if(!command.size())
{
rospack::log_error("rospack", "no command given. Try 'rospack help'");
return 0;
}
// For some commands, we force a crawl. Definitely anything that does a
// depends-on calculation.
bool force = false;
if((command == "profile") ||
(command == "depends-on") ||
(command == "depends-on1") ||
(command == "langs") ||
(command == "list-duplicates"))
force = true;
std::vector<std::string> search_path;
if(!rospack::get_search_path_from_env(search_path))
return 1;
if(vm.count("package"))
{
package = vm["package"].as<std::string>();
package_given = true;
}
else
{
// try to determine package from directory context
rp.inPackage(package);
}
if(vm.count("deps-only"))
deps_only = true;
if(vm.count("lang"))
lang = vm["lang"].as<std::string>();
if(vm.count("attrib"))
attrib = vm["attrib"].as<std::string>();
if(vm.count("top"))
top = vm["top"].as<std::string>();
if(vm.count("target"))
target = vm["target"].as<std::string>();
if(vm.count("zombie-only"))
zombie_only = true;
if(vm.count("length"))
{
length_str = vm["length"].as<std::string>();
length = atoi(length_str.c_str());
}
else
{
if(zombie_only)
length = -1;
else
length = 20;
}
// COMMAND: profile
if(command == "profile")
{
if(package_given || target.size() || top.size() ||
deps_only || lang.size() || attrib.size())
{
rospack::log_error("rospack", "invalid option(s) given");
return 1;
}
std::vector<std::string> dirs;
if(rp.profile(search_path, zombie_only, length, dirs))
return 1;
for(std::vector<std::string>::const_iterator it = dirs.begin();
it != dirs.end();
++it)
printf("%s\n", (*it).c_str());
return 0;
}
// We crawl here because profile (above) does its own special crawl.
rp.crawl(search_path, force);
// COMMAND: find [package]
if(command == "find")
{
if(!package.size())
{
rospack::log_error("rospack", "no package given");
return 1;
}
if(target.size() || top.size() || length_str.size() ||
zombie_only || deps_only || lang.size() || attrib.size())
{
rospack::log_error("rospack", "invalid option(s) given");
return 1;
}
std::string path;
if(!rp.find(package, path))
return 1;
printf("%s\n", path.c_str());
return 0;
}
// COMMAND: list
else if(command == "list")
{
if(package_given || target.size() || top.size() || length_str.size() ||
zombie_only || deps_only || lang.size() || attrib.size())
{
rospack::log_error("rospack", "invalid option(s) given");
return 1;
}
std::vector<std::pair<std::string, std::string> > list;
rp.list(list);
for(std::vector<std::pair<std::string, std::string> >::const_iterator it = list.begin();
it != list.end();
++it)
{
printf("%s %s\n", it->first.c_str(), it->second.c_str());
}
return 0;
}
// COMMAND: list-names
else if(command == "list-names")
{
if(package_given || target.size() || top.size() || length_str.size() ||
zombie_only || deps_only || lang.size() || attrib.size())
{
rospack::log_error("rospack", "invalid option(s) given");
return 1;
}
std::vector<std::pair<std::string, std::string> > list;
rp.list(list);
for(std::vector<std::pair<std::string, std::string> >::const_iterator it = list.begin();
it != list.end();
++it)
{
printf("%s\n", it->first.c_str());
}
return 0;
}
// COMMAND: list-duplicates
else if(command == "list-duplicates")
{
if(package_given || target.size() || top.size() || length_str.size() ||
zombie_only || deps_only || lang.size() || attrib.size())
{
rospack::log_error("rospack", "invalid option(s) given");
return 1;
}
std::vector<std::string> dups;
rp.listDuplicates(dups);
// list-duplicates returns 0 if no duplicates
if(!dups.size())
return 0;
// if there are dups, list-duplicates prints them and returns non-zero
for(std::vector<std::string>::const_iterator it = dups.begin();
it != dups.end();
++it)
{
printf("%s\n", (*it).c_str());
}
return 1;
}
// COMMAND: langs
else if(command == "langs")
{
if(package_given || target.size() || top.size() || length_str.size() ||
zombie_only || deps_only || lang.size() || attrib.size())
{
rospack::log_error("rospack", "invalid option(s) given");
return 1;
}
std::vector<std::string> deps;
if(!rp.dependsOn("roslang", true, deps))
return 1;
const char* ros_lang_disable;
if((ros_lang_disable = getenv("ROS_LANG_DISABLE")))
{
std::vector<std::string> disable_langs;
boost::split(disable_langs, ros_lang_disable,
boost::is_any_of(":"),
boost::token_compress_on);
std::vector<std::string>::iterator it = deps.begin();
while(it != deps.end())
{
if(std::find(disable_langs.begin(), disable_langs.end(), *it) !=
disable_langs.end())
it = deps.erase(it);
else
++it;
}
}
for(std::vector<std::string>::const_iterator it = deps.begin();
it != deps.end();
++it)
printf("%s ", it->c_str());
printf("\n");
return 0;
}
// COMMAND: depends [package] (alias: deps)
else if(command == "depends" || command == "deps" ||
command == "depends1" || command == "deps1")
{
if(!package.size())
{
rospack::log_error("rospack", "no package given");
return 1;
}
if(target.size() || top.size() || length_str.size() ||
zombie_only || deps_only || lang.size() || attrib.size())
{
rospack::log_error("rospack", "invalid option(s) given");
return 1;
}
std::vector<std::string> deps;
if(!rp.deps(package, (command == "depends1" || command == "deps1"), deps))
return 1;
for(std::vector<std::string>::const_iterator it = deps.begin();
it != deps.end();
++it)
printf("%s\n", it->c_str());
return 0;
}
// COMMAND: depends-manifests [package] (alias: deps-manifests)
else if(command == "depends-manifests" || command == "deps-manifests")
{
if(!package.size())
{
rospack::log_error("rospack", "no package given");
return 1;
}
if(target.size() || top.size() || length_str.size() ||
zombie_only || deps_only || lang.size() || attrib.size())
{
rospack::log_error("rospack", "invalid option(s) given");
return 1;
}
std::vector<std::string> manifests;
if(!rp.depsManifests(package, false, manifests))
return 1;
for(std::vector<std::string>::const_iterator it = manifests.begin();
it != manifests.end();
++it)
printf("%s ", it->c_str());
printf("\n");
return 0;
}
// COMMAND: depends-msgsrv [package] (alias: deps-msgsrv)
else if(command == "depends-msgsrv" || command == "deps-msgsrv")
{
if(!package.size())
{
rospack::log_error("rospack", "no package given");
return 1;
}
if(target.size() || top.size() || length_str.size() ||
zombie_only || deps_only || lang.size() || attrib.size())
{
rospack::log_error("rospack", "invalid option(s) given");
return 1;
}
std::vector<std::string> gens;
if(!rp.depsMsgSrv(package, false, gens))
return 1;
for(std::vector<std::string>::const_iterator it = gens.begin();
it != gens.end();
++it)
printf("%s ", it->c_str());
printf("\n");
return 0;
}
// COMMAND: depends-indent [package] (alias: deps-indent)
else if(command == "depends-indent" || command == "deps-indent")
{
if(!package.size())
{
rospack::log_error("rospack", "no package given");
return 1;
}
if(target.size() || top.size() || length_str.size() ||
zombie_only || deps_only || lang.size() || attrib.size())
{
rospack::log_error("rospack", "invalid option(s) given");
return 1;
}
std::vector<std::string> deps;
if(!rp.depsIndent(package, false, deps))
return 1;
for(std::vector<std::string>::const_iterator it = deps.begin();
it != deps.end();
++it)
printf("%s\n", it->c_str());
return 0;
}
// COMMAND: rosdep [package] (alias: rosdeps)
// COMMAND: rosdep0 [package] (alias: rosdeps0)
else if(command == "rosdep" || command == "rosdeps" ||
command == "rosdep0" || command == "rosdeps0")
{
if(!package.size())
{
rospack::log_error("rospack", "no package given");
return 1;
}
if(target.size() || top.size() || length_str.size() ||
zombie_only || deps_only || lang.size() || attrib.size())
{
rospack::log_error("rospack", "invalid option(s) given");
return 1;
}
std::vector<std::string> rosdeps;
if(!rp.rosdeps(package, (command == "rosdep0" || command == "rosdeps0"), rosdeps))
return 1;
for(std::vector<std::string>::const_iterator it = rosdeps.begin();
it != rosdeps.end();
++it)
printf("%s\n", it->c_str());
return 0;
}
// COMMAND: vcs [package]
// COMMAND: vcs0 [package]
else if(command == "vcs" || command == "vcs0")
{
if(!package.size())
{
rospack::log_error("rospack", "no package given");
return 1;
}
if(target.size() || top.size() || length_str.size() ||
zombie_only || deps_only || lang.size() || attrib.size())
{
rospack::log_error("rospack", "invalid option(s) given");
return 1;
}
std::vector<std::string> vcs;
if(!rp.vcs(package, (command == "vcs0"), vcs))
return 1;
for(std::vector<std::string>::const_iterator it = vcs.begin();
it != vcs.end();
++it)
printf("%s\n", it->c_str());
return 0;
}
// COMMAND: depends-on [package]
// COMMAND: depends-on1 [package]
else if(command == "depends-on" || command == "depends-on1")
{
if(!package.size())
{
rospack::log_error("rospack", "no package given");
return 1;
}
if(target.size() || top.size() || length_str.size() ||
zombie_only || deps_only || lang.size() || attrib.size())
{
rospack::log_error("rospack", "invalid option(s) given");
return 1;
}
std::vector<std::string> deps;
if(!rp.dependsOn(package, (command == "depends-on1"), deps))
return 1;
for(std::vector<std::string>::const_iterator it = deps.begin();
it != deps.end();
++it)
printf("%s\n", it->c_str());
return 0;
}
// COMMAND: export [--deps-only] --lang=<lang> --attrib=<attrib> [package]
else if(command == "export")
{
if(!package.size() || !lang.size() || !attrib.size())
{
rospack::log_error("rospack", "no package / lang / attrib given");
return 1;
}
if(target.size() || top.size() || length_str.size() || zombie_only)
{
rospack::log_error("rospack", "invalid option(s) given");
return 1;
}
std::vector<std::string> flags;
if(!rp.exports(package, lang, attrib, deps_only, flags))
return 1;
for(std::vector<std::string>::const_iterator it = flags.begin();
it != flags.end();
++it)
printf("%s ", it->c_str());
printf("\n");
return 0;
}
// COMMAND: plugins --attrib=<attrib> [--top=<toppkg>] [package]
else if(command == "plugins")
{
if(!package.size() || !attrib.size())
{
rospack::log_error("rospack", "no package / attrib given");
return 1;
}
if(target.size() || length_str.size() || zombie_only)
{
rospack::log_error("rospack", "invalid option(s) given");
return 1;
}
std::vector<std::string> flags;
if(!rp.plugins(package, attrib, top, flags))
return 1;
for(std::vector<std::string>::const_iterator it = flags.begin();
it != flags.end();
++it)
printf("%s\n", it->c_str());
return 0;
}
// COMMAND: cflags-only-I [--deps-only] [package]
else if(command == "cflags-only-I")
{
if(!package.size())
{
rospack::log_error("rospack", "no package given");
return 1;
}
if(target.size() || top.size() || length_str.size() || zombie_only)
{
rospack::log_error("rospack", "invalid option(s) given");
return 1;
}
std::vector<std::string> flags;
if(!rp.exports(package, "cpp", "cflags", deps_only, flags))
return 1;
std::string combined;
for(std::vector<std::string>::const_iterator it = flags.begin();
it != flags.end();
++it)
combined.append(*it + " ");
std::string result;
parse_compiler_flags(combined, "-I", true, false, result);
printf("%s\n", result.c_str());
return 0;
}
// COMMAND: cflags-only-other [--deps-only] [package]
else if(command == "cflags-only-other")
{
if(!package.size())
{
rospack::log_error("rospack", "no package given");
return 1;
}
if(target.size() || top.size() || length_str.size() || zombie_only)
{
rospack::log_error("rospack", "invalid option(s) given");
return 1;
}
std::vector<std::string> flags;
if(!rp.exports(package, "cpp", "cflags", deps_only, flags))
return 1;
std::string combined;
for(std::vector<std::string>::const_iterator it = flags.begin();
it != flags.end();
++it)
combined.append(*it + " ");
std::string result;
parse_compiler_flags(combined, "-I", false, false, result);
printf("%s\n", result.c_str());
return 0;
}
// COMMAND: libs-only-L [--deps-only] [package]
else if(command == "libs-only-L")
{
if(!package.size())
{
rospack::log_error("rospack", "no package given");
return 1;
}
if(target.size() || top.size() || length_str.size() || zombie_only)
{
rospack::log_error("rospack", "invalid option(s) given");
return 1;
}
std::vector<std::string> flags;
if(!rp.exports(package, "cpp", "lflags", deps_only, flags))
return 1;
std::string combined;
for(std::vector<std::string>::const_iterator it = flags.begin();
it != flags.end();
++it)
combined.append(*it + " ");
std::string result;
parse_compiler_flags(combined, "-L", true, false, result);
printf("%s\n", result.c_str());
return 0;
}
// COMMAND: libs-only-l [--deps-only] [package]
else if(command == "libs-only-l")
{
if(!package.size())
{
rospack::log_error("rospack", "no package given");
return 1;
}
if(target.size() || top.size() || length_str.size() || zombie_only)
{
rospack::log_error("rospack", "invalid option(s) given");
return 1;
}
std::vector<std::string> flags;
if(!rp.exports(package, "cpp", "lflags", deps_only, flags))
return 1;
std::string combined;
for(std::vector<std::string>::const_iterator it = flags.begin();
it != flags.end();
++it)
combined.append(*it + " ");
std::string result;
parse_compiler_flags(combined, "-l", true, true, result);
printf("%s\n", result.c_str());
return 0;
}
// COMMAND: libs-only-other [--deps-only] [package]
else if(command == "libs-only-other")
{
if(!package.size())
{
rospack::log_error("rospack", "no package given");
return 1;
}
if(target.size() || top.size() || length_str.size() || zombie_only)
{
rospack::log_error("rospack", "invalid option(s) given");
return 1;
}
std::vector<std::string> flags;
if(!rp.exports(package, "cpp", "lflags", deps_only, flags))
return 1;
std::string combined;
for(std::vector<std::string>::const_iterator it = flags.begin();
it != flags.end();
++it)
combined.append(*it + " ");
std::string intermediate;
parse_compiler_flags(combined, "-L", false, false, intermediate);
std::string result;
parse_compiler_flags(intermediate, "-l", false, false, result);
printf("%s\n", result.c_str());
return 0;
}
// COMMAND: help
else if(command == "help")
{
if(package_given || top.size() || length_str.size() ||
zombie_only || deps_only || lang.size() || attrib.size())
{
rospack::log_error("rospack", "invalid option(s) given");
return 1;
}
printf("%s", usage());
return 0;
}
else
{
rospack::log_error("rospack",
std::string("command ") + command + " not implemented");
return 1;
}
}
void
deduplicate_tokens(const std::string& instring,
bool last,
std::string& outstring)
{
std::vector<std::string> vec;
std::tr1::unordered_set<std::string> set;
boost::split(vec, instring,
boost::is_any_of("\t "),
boost::token_compress_on);
if(last)
std::reverse(vec.begin(), vec.end());
std::vector<std::string> vec_out;
vec_out.resize(vec.size());
int i = 0;
for(std::vector<std::string>::const_iterator it = vec.begin();
it != vec.end();
++it)
{
if(set.find(*it) == set.end())
{
vec_out[i] = *it;
set.insert(*it);
i++;
}
}
if(last)
std::reverse(vec_out.begin(), vec_out.end());
for(std::vector<std::string>::const_iterator it = vec_out.begin();
it != vec_out.end();
++it)
outstring.append(*it + " ");
}
void
parse_compiler_flags(const std::string& instring,
const std::string& token,
bool select,
bool last,
std::string& outstring)
{
std::string intermediate;
std::vector<std::string> result_vec;
boost::split(result_vec, instring,
boost::is_any_of("\t "),
boost::token_compress_on);
for(std::vector<std::string>::const_iterator it = result_vec.begin();
it != result_vec.end();
++it)
{
// Combined into one arg
if(it->size() > token.size() && it->substr(0,token.size()) == token)
{
if(select)
intermediate.append(it->substr(token.size()) + " ");
}
// Space-separated
else if((*it) == token)
{
std::vector<std::string>::const_iterator iit = it;
if(++iit != result_vec.end())
{
if(it->size() >= token.size() && it->substr(0,token.size()) == token)
{
// skip it
}
else
{
if(select)
intermediate.append((*iit) + " ");
it = iit;
}
}
}
// Special case: if we're told to look for -l, then also find *.a
else if(it->size() > 2 &&
(*it)[0] == '/' &&
it->substr(it->size()-2) == ".a")
{
if(select)
intermediate.append((*it) + " ");
}
else if(!select)
intermediate.append((*it) + " ");
}
deduplicate_tokens(intermediate, last, outstring);
}
const char* usage()
{
return "USAGE: rospack <command> [options] [package]\n"
" Allowed commands:\n"
" help\n"
" find [package]\n"
" list\n"
" list-names\n"
" list-duplicates\n"
" langs\n"
" depends [package] (alias: deps)\n"
" depends-manifests [package] (alias: deps-manifests)\n"
" depends-msgsrv [package] (alias: deps-msgsrv)\n"
" depends1 [package] (alias: deps1)\n"
" depends-indent [package] (alias: deps-indent)\n"
" depends-why --target=<target> [package] (alias: deps-why)\n"
" rosdep [package] (alias: rosdeps)\n"
" rosdep0 [package] (alias: rosdeps0)\n"
" vcs [package]\n"
" vcs0 [package]\n"
" depends-on [package]\n"
" depends-on1 [package]\n"
" export [--deps-only] --lang=<lang> --attrib=<attrib> [package]\n"
" plugins --attrib=<attrib> [--top=<toppkg>] [package]\n"
" cflags-only-I [--deps-only] [package]\n"
" cflags-only-other [--deps-only] [package]\n"
" libs-only-L [--deps-only] [package]\n"
" libs-only-l [--deps-only] [package]\n"
" libs-only-other [--deps-only] [package]\n"
" profile [--length=<length>] [--zombie-only]\n"
" Extra options:\n"
" -q Quiets error reports.\n\n"
" If [package] is omitted, the current working directory\n"
" is used (if it contains a manifest.xml).\n\n";
}
bool
parse_args(int argc, char** argv, po::variables_map& vm)
{
po::options_description desc("Allowed options");
desc.add_options()
("command", po::value<std::string>(), "command")
("package", po::value<std::string>(), "package")
("target", po::value<std::string>(), "target")
("deps-only", "deps-only")
("lang", po::value<std::string>(), "lang")
("attrib", po::value<std::string>(), "attrib")
("top", po::value<std::string>(), "top")
("length", po::value<std::string>(), "length")
("zombie-only", "zombie-only")
("quiet,q", "quiet");
po::positional_options_description pd;
pd.add("command", 1).add("package", 1);
try
{
po::store(po::command_line_parser(argc, argv).options(desc).positional(pd).run(), vm);
}
catch(boost::program_options::error e)
{
rospack::log_error("rospack", std::string("failed to parse command-line options: ") + e.what());
return false;
}
po::notify(vm);
return true;
}

View File

@ -1,43 +0,0 @@
/*
* Copyright (C) 2008, Willow Garage, Inc.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the names of Stanford University or Willow Garage, Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "rp.h"
#include <boost/program_options.hpp>
int
main(int argc, char** argv)
{
rospack::Rosstack rs;
std::vector<std::string> search_path;
search_path.push_back("/Users/gerkey/code/ros/ros");
search_path.push_back("/Users/gerkey/code/ros/ros/tools/rospack");
search_path.push_back("/Users/gerkey/code/ros/ros_comm");
rs.crawl(search_path, false);
return 0;
}

View File

@ -1,530 +0,0 @@
/** @mainpage
<h1> TinyXML </h1>
TinyXML is a simple, small, C++ XML parser that can be easily
integrated into other programs.
<h2> What it does. </h2>
In brief, TinyXML parses an XML document, and builds from that a
Document Object Model (DOM) that can be read, modified, and saved.
XML stands for "eXtensible Markup Language." It allows you to create
your own document markups. Where HTML does a very good job of marking
documents for browsers, XML allows you to define any kind of document
markup, for example a document that describes a "to do" list for an
organizer application. XML is a very structured and convenient format.
All those random file formats created to store application data can
all be replaced with XML. One parser for everything.
The best place for the complete, correct, and quite frankly hard to
read spec is at <a href="http://www.w3.org/TR/2004/REC-xml-20040204/">
http://www.w3.org/TR/2004/REC-xml-20040204/</a>. An intro to XML
(that I really like) can be found at
<a href="http://skew.org/xml/tutorial/">http://skew.org/xml/tutorial</a>.
There are different ways to access and interact with XML data.
TinyXML uses a Document Object Model (DOM), meaning the XML data is parsed
into a C++ objects that can be browsed and manipulated, and then
written to disk or another output stream. You can also construct an XML document
from scratch with C++ objects and write this to disk or another output
stream.
TinyXML is designed to be easy and fast to learn. It is two headers
and four cpp files. Simply add these to your project and off you go.
There is an example file - xmltest.cpp - to get you started.
TinyXML is released under the ZLib license,
so you can use it in open source or commercial code. The details
of the license are at the top of every source file.
TinyXML attempts to be a flexible parser, but with truly correct and
compliant XML output. TinyXML should compile on any reasonably C++
compliant system. It does not rely on exceptions or RTTI. It can be
compiled with or without STL support. TinyXML fully supports
the UTF-8 encoding, and the first 64k character entities.
<h2> What it doesn't do. </h2>
TinyXML doesn't parse or use DTDs (Document Type Definitions) or XSLs
(eXtensible Stylesheet Language.) There are other parsers out there
(check out www.sourceforge.org, search for XML) that are much more fully
featured. But they are also much bigger, take longer to set up in
your project, have a higher learning curve, and often have a more
restrictive license. If you are working with browsers or have more
complete XML needs, TinyXML is not the parser for you.
The following DTD syntax will not parse at this time in TinyXML:
@verbatim
<!DOCTYPE Archiv [
<!ELEMENT Comment (#PCDATA)>
]>
@endverbatim
because TinyXML sees this as a !DOCTYPE node with an illegally
embedded !ELEMENT node. This may be addressed in the future.
<h2> Tutorials. </h2>
For the impatient, here is a tutorial to get you going. A great way to get started,
but it is worth your time to read this (very short) manual completely.
- @subpage tutorial0
<h2> Code Status. </h2>
TinyXML is mature, tested code. It is very stable. If you find
bugs, please file a bug report on the sourceforge web site
(www.sourceforge.net/projects/tinyxml). We'll get them straightened
out as soon as possible.
There are some areas of improvement; please check sourceforge if you are
interested in working on TinyXML.
<h2> Related Projects </h2>
TinyXML projects you may find useful! (Descriptions provided by the projects.)
<ul>
<li> <b>TinyXPath</b> (http://tinyxpath.sourceforge.net). TinyXPath is a small footprint
XPath syntax decoder, written in C++.</li>
<li> <b>TinyXML++</b> (http://code.google.com/p/ticpp/). TinyXML++ is a completely new
interface to TinyXML that uses MANY of the C++ strengths. Templates,
exceptions, and much better error handling.</li>
</ul>
<h2> Features </h2>
<h3> Using STL </h3>
TinyXML can be compiled to use or not use STL. When using STL, TinyXML
uses the std::string class, and fully supports std::istream, std::ostream,
operator<<, and operator>>. Many API methods have both 'const char*' and
'const std::string&' forms.
When STL support is compiled out, no STL files are included whatsoever. All
the string classes are implemented by TinyXML itself. API methods
all use the 'const char*' form for input.
Use the compile time #define:
TIXML_USE_STL
to compile one version or the other. This can be passed by the compiler,
or set as the first line of "tinyxml.h".
Note: If compiling the test code in Linux, setting the environment
variable TINYXML_USE_STL=YES/NO will control STL compilation. In the
Windows project file, STL and non STL targets are provided. In your project,
It's probably easiest to add the line "#define TIXML_USE_STL" as the first
line of tinyxml.h.
<h3> UTF-8 </h3>
TinyXML supports UTF-8 allowing to manipulate XML files in any language. TinyXML
also supports "legacy mode" - the encoding used before UTF-8 support and
probably best described as "extended ascii".
Normally, TinyXML will try to detect the correct encoding and use it. However,
by setting the value of TIXML_DEFAULT_ENCODING in the header file, TinyXML
can be forced to always use one encoding.
TinyXML will assume Legacy Mode until one of the following occurs:
<ol>
<li> If the non-standard but common "UTF-8 lead bytes" (0xef 0xbb 0xbf)
begin the file or data stream, TinyXML will read it as UTF-8. </li>
<li> If the declaration tag is read, and it has an encoding="UTF-8", then
TinyXML will read it as UTF-8. </li>
<li> If the declaration tag is read, and it has no encoding specified, then TinyXML will
read it as UTF-8. </li>
<li> If the declaration tag is read, and it has an encoding="something else", then TinyXML
will read it as Legacy Mode. In legacy mode, TinyXML will work as it did before. It's
not clear what that mode does exactly, but old content should keep working.</li>
<li> Until one of the above criteria is met, TinyXML runs in Legacy Mode.</li>
</ol>
What happens if the encoding is incorrectly set or detected? TinyXML will try
to read and pass through text seen as improperly encoded. You may get some strange results or
mangled characters. You may want to force TinyXML to the correct mode.
You may force TinyXML to Legacy Mode by using LoadFile( TIXML_ENCODING_LEGACY ) or
LoadFile( filename, TIXML_ENCODING_LEGACY ). You may force it to use legacy mode all
the time by setting TIXML_DEFAULT_ENCODING = TIXML_ENCODING_LEGACY. Likewise, you may
force it to TIXML_ENCODING_UTF8 with the same technique.
For English users, using English XML, UTF-8 is the same as low-ASCII. You
don't need to be aware of UTF-8 or change your code in any way. You can think
of UTF-8 as a "superset" of ASCII.
UTF-8 is not a double byte format - but it is a standard encoding of Unicode!
TinyXML does not use or directly support wchar, TCHAR, or Microsoft's _UNICODE at this time.
It is common to see the term "Unicode" improperly refer to UTF-16, a wide byte encoding
of unicode. This is a source of confusion.
For "high-ascii" languages - everything not English, pretty much - TinyXML can
handle all languages, at the same time, as long as the XML is encoded
in UTF-8. That can be a little tricky, older programs and operating systems
tend to use the "default" or "traditional" code page. Many apps (and almost all
modern ones) can output UTF-8, but older or stubborn (or just broken) ones
still output text in the default code page.
For example, Japanese systems traditionally use SHIFT-JIS encoding.
Text encoded as SHIFT-JIS can not be read by TinyXML.
A good text editor can import SHIFT-JIS and then save as UTF-8.
The <a href="http://skew.org/xml/tutorial/">Skew.org link</a> does a great
job covering the encoding issue.
The test file "utf8test.xml" is an XML containing English, Spanish, Russian,
and Simplified Chinese. (Hopefully they are translated correctly). The file
"utf8test.gif" is a screen capture of the XML file, rendered in IE. Note that
if you don't have the correct fonts (Simplified Chinese or Russian) on your
system, you won't see output that matches the GIF file even if you can parse
it correctly. Also note that (at least on my Windows machine) console output
is in a Western code page, so that Print() or printf() cannot correctly display
the file. This is not a bug in TinyXML - just an OS issue. No data is lost or
destroyed by TinyXML. The console just doesn't render UTF-8.
<h3> Entities </h3>
TinyXML recognizes the pre-defined "character entities", meaning special
characters. Namely:
@verbatim
&amp; &
&lt; <
&gt; >
&quot; "
&apos; '
@endverbatim
These are recognized when the XML document is read, and translated to there
UTF-8 equivalents. For instance, text with the XML of:
@verbatim
Far &amp; Away
@endverbatim
will have the Value() of "Far & Away" when queried from the TiXmlText object,
and will be written back to the XML stream/file as an ampersand. Older versions
of TinyXML "preserved" character entities, but the newer versions will translate
them into characters.
Additionally, any character can be specified by its Unicode code point:
The syntax "&#xA0;" or "&#160;" are both to the non-breaking space characher.
<h3> Printing </h3>
TinyXML can print output in several different ways that all have strengths and limitations.
- Print( FILE* ). Output to a std-C stream, which includes all C files as well as stdout.
- "Pretty prints", but you don't have control over printing options.
- The output is streamed directly to the FILE object, so there is no memory overhead
in the TinyXML code.
- used by Print() and SaveFile()
- operator<<. Output to a c++ stream.
- Integrates with standart C++ iostreams.
- Outputs in "network printing" mode without line breaks. Good for network transmission
and moving XML between C++ objects, but hard for a human to read.
- TiXmlPrinter. Output to a std::string or memory buffer.
- API is less concise
- Future printing options will be put here.
- Printing may change slightly in future versions as it is refined and expanded.
<h3> Streams </h3>
With TIXML_USE_STL on TinyXML supports C++ streams (operator <<,>>) streams as well
as C (FILE*) streams. There are some differences that you may need to be aware of.
C style output:
- based on FILE*
- the Print() and SaveFile() methods
Generates formatted output, with plenty of white space, intended to be as
human-readable as possible. They are very fast, and tolerant of ill formed
XML documents. For example, an XML document that contains 2 root elements
and 2 declarations, will still print.
C style input:
- based on FILE*
- the Parse() and LoadFile() methods
A fast, tolerant read. Use whenever you don't need the C++ streams.
C++ style output:
- based on std::ostream
- operator<<
Generates condensed output, intended for network transmission rather than
readability. Depending on your system's implementation of the ostream class,
these may be somewhat slower. (Or may not.) Not tolerant of ill formed XML:
a document should contain the correct one root element. Additional root level
elements will not be streamed out.
C++ style input:
- based on std::istream
- operator>>
Reads XML from a stream, making it useful for network transmission. The tricky
part is knowing when the XML document is complete, since there will almost
certainly be other data in the stream. TinyXML will assume the XML data is
complete after it reads the root element. Put another way, documents that
are ill-constructed with more than one root element will not read correctly.
Also note that operator>> is somewhat slower than Parse, due to both
implementation of the STL and limitations of TinyXML.
<h3> White space </h3>
The world simply does not agree on whether white space should be kept, or condensed.
For example, pretend the '_' is a space, and look at "Hello____world". HTML, and
at least some XML parsers, will interpret this as "Hello_world". They condense white
space. Some XML parsers do not, and will leave it as "Hello____world". (Remember
to keep pretending the _ is a space.) Others suggest that __Hello___world__ should become
Hello___world.
It's an issue that hasn't been resolved to my satisfaction. TinyXML supports the
first 2 approaches. Call TiXmlBase::SetCondenseWhiteSpace( bool ) to set the desired behavior.
The default is to condense white space.
If you change the default, you should call TiXmlBase::SetCondenseWhiteSpace( bool )
before making any calls to Parse XML data, and I don't recommend changing it after
it has been set.
<h3> Handles </h3>
Where browsing an XML document in a robust way, it is important to check
for null returns from method calls. An error safe implementation can
generate a lot of code like:
@verbatim
TiXmlElement* root = document.FirstChildElement( "Document" );
if ( root )
{
TiXmlElement* element = root->FirstChildElement( "Element" );
if ( element )
{
TiXmlElement* child = element->FirstChildElement( "Child" );
if ( child )
{
TiXmlElement* child2 = child->NextSiblingElement( "Child" );
if ( child2 )
{
// Finally do something useful.
@endverbatim
Handles have been introduced to clean this up. Using the TiXmlHandle class,
the previous code reduces to:
@verbatim
TiXmlHandle docHandle( &document );
TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).ToElement();
if ( child2 )
{
// do something useful
@endverbatim
Which is much easier to deal with. See TiXmlHandle for more information.
<h3> Row and Column tracking </h3>
Being able to track nodes and attributes back to their origin location
in source files can be very important for some applications. Additionally,
knowing where parsing errors occured in the original source can be very
time saving.
TinyXML can tracks the row and column origin of all nodes and attributes
in a text file. The TiXmlBase::Row() and TiXmlBase::Column() methods return
the origin of the node in the source text. The correct tabs can be
configured in TiXmlDocument::SetTabSize().
<h2> Using and Installing </h2>
To Compile and Run xmltest:
A Linux Makefile and a Windows Visual C++ .dsw file is provided.
Simply compile and run. It will write the file demotest.xml to your
disk and generate output on the screen. It also tests walking the
DOM by printing out the number of nodes found using different
techniques.
The Linux makefile is very generic and runs on many systems - it
is currently tested on mingw and
MacOSX. You do not need to run 'make depend'. The dependecies have been
hard coded.
<h3>Windows project file for VC6</h3>
<ul>
<li>tinyxml: tinyxml library, non-STL </li>
<li>tinyxmlSTL: tinyxml library, STL </li>
<li>tinyXmlTest: test app, non-STL </li>
<li>tinyXmlTestSTL: test app, STL </li>
</ul>
<h3>Makefile</h3>
At the top of the makefile you can set:
PROFILE, DEBUG, and TINYXML_USE_STL. Details (such that they are) are in
the makefile.
In the tinyxml directory, type "make clean" then "make". The executable
file 'xmltest' will be created.
<h3>To Use in an Application:</h3>
Add tinyxml.cpp, tinyxml.h, tinyxmlerror.cpp, tinyxmlparser.cpp, tinystr.cpp, and tinystr.h to your
project or make file. That's it! It should compile on any reasonably
compliant C++ system. You do not need to enable exceptions or
RTTI for TinyXML.
<h2> How TinyXML works. </h2>
An example is probably the best way to go. Take:
@verbatim
<?xml version="1.0" standalone=no>
<!-- Our to do list data -->
<ToDo>
<Item priority="1"> Go to the <bold>Toy store!</bold></Item>
<Item priority="2"> Do bills</Item>
</ToDo>
@endverbatim
Its not much of a To Do list, but it will do. To read this file
(say "demo.xml") you would create a document, and parse it in:
@verbatim
TiXmlDocument doc( "demo.xml" );
doc.LoadFile();
@endverbatim
And its ready to go. Now lets look at some lines and how they
relate to the DOM.
@verbatim
<?xml version="1.0" standalone=no>
@endverbatim
The first line is a declaration, and gets turned into the
TiXmlDeclaration class. It will be the first child of the
document node.
This is the only directive/special tag parsed by by TinyXML.
Generally directive tags are stored in TiXmlUnknown so the
commands wont be lost when it is saved back to disk.
@verbatim
<!-- Our to do list data -->
@endverbatim
A comment. Will become a TiXmlComment object.
@verbatim
<ToDo>
@endverbatim
The "ToDo" tag defines a TiXmlElement object. This one does not have
any attributes, but does contain 2 other elements.
@verbatim
<Item priority="1">
@endverbatim
Creates another TiXmlElement which is a child of the "ToDo" element.
This element has 1 attribute, with the name "priority" and the value
"1".
@verbatim
Go to the
@endverbatim
A TiXmlText. This is a leaf node and cannot contain other nodes.
It is a child of the "Item" TiXmlElement.
@verbatim
<bold>
@endverbatim
Another TiXmlElement, this one a child of the "Item" element.
Etc.
Looking at the entire object tree, you end up with:
@verbatim
TiXmlDocument "demo.xml"
TiXmlDeclaration "version='1.0'" "standalone=no"
TiXmlComment " Our to do list data"
TiXmlElement "ToDo"
TiXmlElement "Item" Attribtutes: priority = 1
TiXmlText "Go to the "
TiXmlElement "bold"
TiXmlText "Toy store!"
TiXmlElement "Item" Attributes: priority=2
TiXmlText "Do bills"
@endverbatim
<h2> Documentation </h2>
The documentation is build with Doxygen, using the 'dox'
configuration file.
<h2> License </h2>
TinyXML is released under the zlib license:
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any
damages arising from the use of this software.
Permission is granted to anyone to use this software for any
purpose, including commercial applications, and to alter it and
redistribute it freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must
not claim that you wrote the original software. If you use this
software in a product, an acknowledgment in the product documentation
would be appreciated but is not required.
2. Altered source versions must be plainly marked as such, and
must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source
distribution.
<h2> References </h2>
The World Wide Web Consortium is the definitive standard body for
XML, and there web pages contain huge amounts of information.
The definitive spec: <a href="http://www.w3.org/TR/2004/REC-xml-20040204/">
http://www.w3.org/TR/2004/REC-xml-20040204/</a>
I also recommend "XML Pocket Reference" by Robert Eckstein and published by
OReilly...the book that got the whole thing started.
<h2> Contributors, Contacts, and a Brief History </h2>
Thanks very much to everyone who sends suggestions, bugs, ideas, and
encouragement. It all helps, and makes this project fun. A special thanks
to the contributors on the web pages that keep it lively.
So many people have sent in bugs and ideas, that rather than list here
we try to give credit due in the "changes.txt" file.
TinyXML was originally written by Lee Thomason. (Often the "I" still
in the documentation.) Lee reviews changes and releases new versions,
with the help of Yves Berquin, Andrew Ellerton, and the tinyXml community.
We appreciate your suggestions, and would love to know if you
use TinyXML. Hopefully you will enjoy it and find it useful.
Please post questions, comments, file bugs, or contact us at:
www.sourceforge.net/projects/tinyxml
Lee Thomason, Yves Berquin, Andrew Ellerton
*/

View File

@ -1,118 +0,0 @@
/*
www.sourceforge.net/projects/tinyxml
Original file by Yves Berquin.
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any
damages arising from the use of this software.
Permission is granted to anyone to use this software for any
purpose, including commercial applications, and to alter it and
redistribute it freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must
not claim that you wrote the original software. If you use this
software in a product, an acknowledgment in the product documentation
would be appreciated but is not required.
2. Altered source versions must be plainly marked as such, and
must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source
distribution.
*/
/*
* THIS FILE WAS ALTERED BY Tyge Løvset, 7. April 2005.
*/
#ifndef TIXML_USE_STL
#include "tinystr.h"
namespace rospack_tinyxml {
// Error value for find primitive
const TiXmlString::size_type TiXmlString::npos = static_cast< TiXmlString::size_type >(-1);
// Null rep.
TiXmlString::Rep TiXmlString::nullrep_ = { 0, 0, { '\0' } };
void TiXmlString::reserve (size_type cap)
{
if (cap > capacity())
{
TiXmlString tmp;
tmp.init(length(), cap);
memcpy(tmp.start(), data(), length());
swap(tmp);
}
}
TiXmlString& TiXmlString::assign(const char* str, size_type len)
{
size_type cap = capacity();
if (len > cap || cap > 3*(len + 8))
{
TiXmlString tmp;
tmp.init(len);
memcpy(tmp.start(), str, len);
swap(tmp);
}
else
{
memmove(start(), str, len);
set_size(len);
}
return *this;
}
TiXmlString& TiXmlString::append(const char* str, size_type len)
{
size_type newsize = length() + len;
if (newsize > capacity())
{
reserve (newsize + capacity());
}
memmove(finish(), str, len);
set_size(newsize);
return *this;
}
TiXmlString operator + (const TiXmlString & a, const TiXmlString & b)
{
TiXmlString tmp;
tmp.reserve(a.length() + b.length());
tmp += a;
tmp += b;
return tmp;
}
TiXmlString operator + (const TiXmlString & a, const char* b)
{
TiXmlString tmp;
TiXmlString::size_type b_len = static_cast<TiXmlString::size_type>( strlen(b) );
tmp.reserve(a.length() + b_len);
tmp += a;
tmp.append(b, b_len);
return tmp;
}
TiXmlString operator + (const char* a, const TiXmlString & b)
{
TiXmlString tmp;
TiXmlString::size_type a_len = static_cast<TiXmlString::size_type>( strlen(a) );
tmp.reserve(a_len + b.length());
tmp.append(a, a_len);
tmp += b;
return tmp;
}
}
#endif // TIXML_USE_STL

View File

@ -1,322 +0,0 @@
/*
www.sourceforge.net/projects/tinyxml
Original file by Yves Berquin.
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any
damages arising from the use of this software.
Permission is granted to anyone to use this software for any
purpose, including commercial applications, and to alter it and
redistribute it freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must
not claim that you wrote the original software. If you use this
software in a product, an acknowledgment in the product documentation
would be appreciated but is not required.
2. Altered source versions must be plainly marked as such, and
must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source
distribution.
*/
/*
* THIS FILE WAS ALTERED BY Tyge Lovset, 7. April 2005.
*
* - completely rewritten. compact, clean, and fast implementation.
* - sizeof(TiXmlString) = pointer size (4 bytes on 32-bit systems)
* - fixed reserve() to work as per specification.
* - fixed buggy compares operator==(), operator<(), and operator>()
* - fixed operator+=() to take a const ref argument, following spec.
* - added "copy" constructor with length, and most compare operators.
* - added swap(), clear(), size(), capacity(), operator+().
*/
#ifndef TIXML_USE_STL
#ifndef TIXML_STRING_INCLUDED
#define TIXML_STRING_INCLUDED
#include <assert.h>
#include <string.h>
/* The support for explicit isn't that universal, and it isn't really
required - it is used to check that the TiXmlString class isn't incorrectly
used. Be nice to old compilers and macro it here:
*/
#if defined(_MSC_VER) && (_MSC_VER >= 1200 )
// Microsoft visual studio, version 6 and higher.
#define TIXML_EXPLICIT explicit
#elif defined(__GNUC__) && (__GNUC__ >= 3 )
// GCC version 3 and higher.s
#define TIXML_EXPLICIT explicit
#else
#define TIXML_EXPLICIT
#endif
namespace rospack_tinyxml {
/*
TiXmlString is an emulation of a subset of the std::string template.
Its purpose is to allow compiling TinyXML on compilers with no or poor STL support.
Only the member functions relevant to the TinyXML project have been implemented.
The buffer allocation is made by a simplistic power of 2 like mechanism : if we increase
a string and there's no more room, we allocate a buffer twice as big as we need.
*/
class TiXmlString
{
public :
// The size type used
typedef size_t size_type;
// Error value for find primitive
static const size_type npos; // = -1;
// TiXmlString empty constructor
TiXmlString () : rep_(&nullrep_)
{
}
// TiXmlString copy constructor
TiXmlString ( const TiXmlString & copy) : rep_(0)
{
init(copy.length());
memcpy(start(), copy.data(), length());
}
// TiXmlString constructor, based on a string
TIXML_EXPLICIT TiXmlString ( const char * copy) : rep_(0)
{
init( static_cast<size_type>( strlen(copy) ));
memcpy(start(), copy, length());
}
// TiXmlString constructor, based on a string
TIXML_EXPLICIT TiXmlString ( const char * str, size_type len) : rep_(0)
{
init(len);
memcpy(start(), str, len);
}
// TiXmlString destructor
~TiXmlString ()
{
quit();
}
// = operator
TiXmlString& operator = (const char * copy)
{
return assign( copy, (size_type)strlen(copy));
}
// = operator
TiXmlString& operator = (const TiXmlString & copy)
{
return assign(copy.start(), copy.length());
}
// += operator. Maps to append
TiXmlString& operator += (const char * suffix)
{
return append(suffix, static_cast<size_type>( strlen(suffix) ));
}
// += operator. Maps to append
TiXmlString& operator += (char single)
{
return append(&single, 1);
}
// += operator. Maps to append
TiXmlString& operator += (const TiXmlString & suffix)
{
return append(suffix.data(), suffix.length());
}
// Convert a TiXmlString into a null-terminated char *
const char * c_str () const { return rep_->str; }
// Convert a TiXmlString into a char * (need not be null terminated).
const char * data () const { return rep_->str; }
// Return the length of a TiXmlString
size_type length () const { return rep_->size; }
// Alias for length()
size_type size () const { return rep_->size; }
// Checks if a TiXmlString is empty
bool empty () const { return rep_->size == 0; }
// Return capacity of string
size_type capacity () const { return rep_->capacity; }
// single char extraction
const char& at (size_type index) const
{
assert( index < length() );
return rep_->str[ index ];
}
// [] operator
char& operator [] (size_type index) const
{
assert( index < length() );
return rep_->str[ index ];
}
// find a char in a string. Return TiXmlString::npos if not found
size_type find (char lookup) const
{
return find(lookup, 0);
}
// find a char in a string from an offset. Return TiXmlString::npos if not found
size_type find (char tofind, size_type offset) const
{
if (offset >= length()) return npos;
for (const char* p = c_str() + offset; *p != '\0'; ++p)
{
if (*p == tofind) return static_cast< size_type >( p - c_str() );
}
return npos;
}
void clear ()
{
//Lee:
//The original was just too strange, though correct:
// TiXmlString().swap(*this);
//Instead use the quit & re-init:
quit();
init(0,0);
}
/* Function to reserve a big amount of data when we know we'll need it. Be aware that this
function DOES NOT clear the content of the TiXmlString if any exists.
*/
void reserve (size_type cap);
TiXmlString& assign (const char* str, size_type len);
TiXmlString& append (const char* str, size_type len);
void swap (TiXmlString& other)
{
Rep* r = rep_;
rep_ = other.rep_;
other.rep_ = r;
}
private:
void init(size_type sz) { init(sz, sz); }
void set_size(size_type sz) { rep_->str[ rep_->size = sz ] = '\0'; }
char* start() const { return rep_->str; }
char* finish() const { return rep_->str + rep_->size; }
struct Rep
{
size_type size, capacity;
char str[1];
};
void init(size_type sz, size_type cap)
{
if (cap)
{
// Lee: the original form:
// rep_ = static_cast<Rep*>(operator new(sizeof(Rep) + cap));
// doesn't work in some cases of new being overloaded. Switching
// to the normal allocation, although use an 'int' for systems
// that are overly picky about structure alignment.
const size_type bytesNeeded = sizeof(Rep) + cap;
const size_type intsNeeded = ( bytesNeeded + sizeof(int) - 1 ) / sizeof( int );
rep_ = reinterpret_cast<Rep*>( new int[ intsNeeded ] );
rep_->str[ rep_->size = sz ] = '\0';
rep_->capacity = cap;
}
else
{
rep_ = &nullrep_;
}
}
void quit()
{
if (rep_ != &nullrep_)
{
// The rep_ is really an array of ints. (see the allocator, above).
// Cast it back before delete, so the compiler won't incorrectly call destructors.
delete [] ( reinterpret_cast<int*>( rep_ ) );
}
}
Rep * rep_;
static Rep nullrep_;
} ;
inline bool operator == (const TiXmlString & a, const TiXmlString & b)
{
return ( a.length() == b.length() ) // optimization on some platforms
&& ( strcmp(a.c_str(), b.c_str()) == 0 ); // actual compare
}
inline bool operator < (const TiXmlString & a, const TiXmlString & b)
{
return strcmp(a.c_str(), b.c_str()) < 0;
}
inline bool operator != (const TiXmlString & a, const TiXmlString & b) { return !(a == b); }
inline bool operator > (const TiXmlString & a, const TiXmlString & b) { return b < a; }
inline bool operator <= (const TiXmlString & a, const TiXmlString & b) { return !(b < a); }
inline bool operator >= (const TiXmlString & a, const TiXmlString & b) { return !(a < b); }
inline bool operator == (const TiXmlString & a, const char* b) { return strcmp(a.c_str(), b) == 0; }
inline bool operator == (const char* a, const TiXmlString & b) { return b == a; }
inline bool operator != (const TiXmlString & a, const char* b) { return !(a == b); }
inline bool operator != (const char* a, const TiXmlString & b) { return !(b == a); }
TiXmlString operator + (const TiXmlString & a, const TiXmlString & b);
TiXmlString operator + (const TiXmlString & a, const char* b);
TiXmlString operator + (const char* a, const TiXmlString & b);
/*
TiXmlOutStream is an emulation of std::ostream. It is based on TiXmlString.
Only the operators that we need for TinyXML have been developped.
*/
class TiXmlOutStream : public TiXmlString
{
public :
// TiXmlOutStream << operator.
TiXmlOutStream & operator << (const TiXmlString & in)
{
*this += in;
return *this;
}
// TiXmlOutStream << operator.
TiXmlOutStream & operator << (const char * in)
{
*this += in;
return *this;
}
} ;
}
#endif // TIXML_STRING_INCLUDED
#endif // TIXML_USE_STL

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,57 +0,0 @@
/*
www.sourceforge.net/projects/tinyxml
Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com)
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any
damages arising from the use of this software.
Permission is granted to anyone to use this software for any
purpose, including commercial applications, and to alter it and
redistribute it freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must
not claim that you wrote the original software. If you use this
software in a product, an acknowledgment in the product documentation
would be appreciated but is not required.
2. Altered source versions must be plainly marked as such, and
must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source
distribution.
*/
#include "tinyxml.h"
// The goal of the seperate error file is to make the first
// step towards localization. tinyxml (currently) only supports
// english error messages, but the could now be translated.
//
// It also cleans up the code a bit.
//
namespace rospack_tinyxml {
const char* TiXmlBase::errorString[ TIXML_ERROR_STRING_COUNT ] =
{
"No error",
"Error",
"Failed to open file",
"Memory allocation failed.",
"Error parsing Element.",
"Failed to read Element name",
"Error reading Element value.",
"Error reading Attributes.",
"Error: empty tag.",
"Error reading end tag.",
"Error parsing Unknown.",
"Error parsing Comment.",
"Error parsing Declaration.",
"Error document empty.",
"Error null (0) or unexpected EOF found in input stream.",
"Error parsing CDATA.",
"Error when TiXmlDocument added to document, because TiXmlDocument can only be at the root.",
};
}

File diff suppressed because it is too large Load Diff