diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..23d7664 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ + +.DS_Store +/*.log +/build +/install + diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..e13beeb --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "pcre1"] + path = pcre1 + url = https://github.com/PierceLBrooks/pcre1.git diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..308c740 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,209 @@ +cmake_minimum_required(VERSION 3.18 FATAL_ERROR) + +set(REGXSTR_VERSION "1.0") +set(REGXSTR_LANGUAGES ) +set(REGXSTR_CODESIGNING ) +set(SW_VERS "") +set(UNAME_M "") + +if (APPLE) + list(APPEND REGXSTR_LANGUAGES "C") + list(APPEND REGXSTR_LANGUAGES "CXX") + list(APPEND REGXSTR_LANGUAGES "OBJC") + list(APPEND REGXSTR_LANGUAGES "OBJCXX") + execute_process(COMMAND sw_vers -productVersion OUTPUT_VARIABLE SW_VERS ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) + if ("${CMAKE_GENERATOR}" MATCHES "Xcode") + execute_process(COMMAND uname -m OUTPUT_VARIABLE UNAME_M ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) + if (NOT "$ENV{SYSROOT}" STREQUAL "") + set(SYSROOT "$ENV{SYSROOT}") + else() + execute_process(COMMAND xcodebuild -version -sdk macosx Path OUTPUT_VARIABLE SYSROOT ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) + endif() + if (NOT EXISTS "${SYSROOT}") + message(FATAL_ERROR "SYSROOT does not exist!") + endif() + set(CMAKE_OSX_SYSROOT "${SYSROOT}" CACHE STRING "CMAKE_OSX_SYSROOT" FORCE) + if ("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "") + if ("${UNAME_M}" MATCHES "arm") + set(CMAKE_OSX_ARCHITECTURES "arm64" CACHE STRING "CMAKE_OSX_ARCHITECTURES" FORCE) + else() + set(CMAKE_OSX_ARCHITECTURES "$(ARCHS_STANDARD)" CACHE STRING "CMAKE_OSX_ARCHITECTURES" FORCE) + endif() + endif() + endif() + execute_process(COMMAND security find-identity -v -p codesigning OUTPUT_VARIABLE SECURITY_FOUND_IDENTITY ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) + set(PATTERN " ") + foreach(IDX RANGE 1 40 1) + string(APPEND PATTERN "[a-fA-F0-9]") + endforeach() + string(APPEND PATTERN " ") + string(REGEX MATCH "${PATTERN}" IDENTITY "${SECURITY_FOUND_IDENTITY}") + if (NOT "${IDENTITY}" STREQUAL "") + string(STRIP "${IDENTITY}" REGXSTR_CODESIGNING) + endif() +else() + list(APPEND REGXSTR_LANGUAGES "C") + list(APPEND REGXSTR_LANGUAGES "CXX") + if (MINGW) + list(APPEND REGXSTR_LANGUAGES "RC") + endif() +endif() + +macro(set_option var default type docstring) + if (("${type}" STREQUAL "STRING" AND "${var}" STREQUAL "") OR NOT DEFINED ${var}) + set(${var} ${default}) + endif() + set(${var} ${${var}} CACHE ${type} ${docstring} FORCE) +endmacro() + +if ("${CMAKE_GENERATOR}" MATCHES "Xcode" AND NOT "${SW_VERS}" STREQUAL "") + string(REPLACE "." ";" SW_VERS_MAJOR "${SW_VERS}") + list(POP_FRONT SW_VERS_MAJOR SW_VERS_HEAD) + set(SW_VERS "${SW_VERS_HEAD}") + set_option(CMAKE_OSX_DEPLOYMENT_TARGET "${SW_VERS}" STRING "Choose the minimum MacOS deployment version") +endif() +set_option(CMAKE_BUILD_TYPE "Debug" STRING "Choose the type of build config variant (\"Debug\" or \"Release\")") +set_option(REGXSTR_LINKAGE "STATIC" STRING "Choose the type of library linkage for the libregxstr target (\"STATIC\" or \"SHARED\")") +set_option(REGXSTR_BINARY "ON" STRING "Whether or not to build the regxstr executable target (\"ON\" or \"OFF\")") +set_option(REGXSTR_TESTING "OFF" STRING "Whether or not to run unit tests (\"ON\" or \"OFF\")") + +project(regxstrproject VERSION ${REGXSTR_VERSION} LANGUAGES ${REGXSTR_LANGUAGES}) + +list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) + +set(CMAKE_SHARED_LIBRARY_PREFIX "") +set(CMAKE_STATIC_LIBRARY_PREFIX "") +if (NOT "${CMAKE_BUILD_TYPE}" STREQUAL "Release") + set(CMAKE_DEBUG_POSTFIX "${CMAKE_BUILD_TYPE}") +endif() + +set(REGXSTR_DEF ) +#list(APPEND REGXSTR_DEF "REGXSTR_VERSION=${REGXSTR_VERSION}") +if ("${REGXSTR_LINKAGE}" STREQUAL "SHARED") + list(APPEND REGXSTR_DEF REGXSTR_LIBRARY_TYPE_SHARED) + set(BUILD_SHARED_LIBS ON) +else() + list(APPEND REGXSTR_DEF REGXSTR_LIBRARY_TYPE_STATIC) +endif() +if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") + list(APPEND REGXSTR_DEF REGXSTR_DEBUG) + list(APPEND REGXSTR_DEF TEST) +endif() +if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") + list(APPEND REGXSTR_DEF REGXSTR_CLANG) +endif() +if (APPLE) + list(APPEND REGXSTR_DEF REGXSTR_OS_APPLE) +elseif (ANDROID) + list(APPEND REGXSTR_DEF REGXSTR_OS_ANDROID) +elseif (MINGW OR MSVC) + list(APPEND REGXSTR_DEF REGXSTR_OS_WINDOWS) + if (MINGW) + list(APPEND REGXSTR_DEF REGXSTR_MINGW) + endif() +else() + list(APPEND REGXSTR_DEF REGXSTR_OS_LINUX) +endif() +if ("${CMAKE_SIZEOF_VOID_P}" STREQUAL "4") + list(APPEND REGXSTR_DEF REGXSTR_BITNESS_32) +else () + list(APPEND REGXSTR_DEF REGXSTR_BITNESS_64) +endif () +include(TestBigEndian) +TEST_BIG_ENDIAN(IS_BIG_ENDIAN) +if(IS_BIG_ENDIAN) + list(APPEND REGXSTR_DEF REGXSTR_ENDIANNESS_BIG) +else() + list(APPEND REGXSTR_DEF REGXSTR_ENDIANNESS_LITTLE) +endif() + +include_directories(${CMAKE_CURRENT_LIST_DIR}) + +if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") + add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/pcre1) + include_directories(${PROJECT_BINARY_DIR}/pcre1) +endif() + +set(REGXSTR_LIB_DEF ) +foreach(DEF IN LISTS REGXSTR_DEF) + list(APPEND REGXSTR_LIB_DEF ${DEF}) +endforeach() +list(APPEND REGXSTR_LIB_DEF REGXSTR_TARGET_TYPE_LIBRARY) + +set(REGXSTR_LIB_SRC ) +set(REGXSTR_LIB_INC ) + +list(APPEND REGXSTR_LIB_SRC ${CMAKE_CURRENT_LIST_DIR}/regxstring_impl.cpp) +list(APPEND REGXSTR_LIB_SRC ${CMAKE_CURRENT_LIST_DIR}/regxstring_impl.h) + +list(APPEND REGXSTR_LIB_SRC ${CMAKE_CURRENT_LIST_DIR}/regxstring.cpp) +list(APPEND REGXSTR_LIB_SRC ${CMAKE_CURRENT_LIST_DIR}/regxstring.h) + +list(APPEND REGXSTR_LIB_INC ${CMAKE_CURRENT_LIST_DIR}/regxstring.h) + +add_library(libregxstr ${REGXSTR_LINKAGE} ${REGXSTR_LIB_SRC}) +if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") + add_dependencies(libregxstr pcre) +endif() +if ("${REGXSTR_LINKAGE}" STREQUAL "SHARED" AND (APPLE OR WINDOWS)) + install(TARGETS libregxstr RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/bin LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/bin FRAMEWORK DESTINATION ${CMAKE_INSTALL_PREFIX}/bin) +else() + install(TARGETS libregxstr) +endif() +target_compile_features(libregxstr PRIVATE cxx_std_17) +set_target_properties(libregxstr PROPERTIES LINKER_LANGUAGE CXX) +if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") + target_link_libraries(libregxstr PRIVATE pcre pcreposix pcrecpp) +endif() +target_compile_definitions(libregxstr PRIVATE ${REGXSTR_LIB_DEF}) +#set_target_properties(libregxstr PROPERTIES PUBLIC_HEADER "${REGXSTR_LIB_INC}") +install(FILES ${REGXSTR_LIB_INC} DESTINATION ${CMAKE_INSTALL_PREFIX}/include/libregxstr) + +set(REGXSTR_BIN_DEF ) +foreach(DEF IN LISTS REGXSTR_DEF) + list(APPEND REGXSTR_BIN_DEF ${DEF}) +endforeach() +list(APPEND REGXSTR_BIN_DEF REGXSTR_TARGET_TYPE_EXECUTABLE) + +set(REGXSTR_BIN_SRC ) +list(APPEND REGXSTR_BIN_SRC ${CMAKE_CURRENT_LIST_DIR}/main.cpp) +if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") + list(APPEND REGXSTR_BIN_SRC ${CMAKE_CURRENT_LIST_DIR}/test.h) +endif() + +if ("${REGXSTR_BINARY}" STREQUAL "ON") + add_executable(regxstr ${REGXSTR_BIN_SRC}) + add_dependencies(regxstr libregxstr) + install(TARGETS regxstr RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin BUNDLE DESTINATION ${CMAKE_INSTALL_PREFIX}/bin) + target_compile_features(regxstr PRIVATE cxx_std_17) + set_target_properties(regxstr PROPERTIES LINKER_LANGUAGE CXX) + if ("${REGXSTR_LINKAGE}" STREQUAL "SHARED") + target_link_libraries(regxstr PRIVATE libregxstr) + else() + target_link_libraries(regxstr PRIVATE libregxstr) + endif() + target_compile_definitions(regxstr PRIVATE ${REGXSTR_BIN_DEF}) + if (APPLE) + add_custom_command(TARGET regxstr POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_INSTALL_PREFIX}/bin COMMENT "Make binary installation" WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) + add_custom_command(TARGET regxstr POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_INSTALL_PREFIX}/lib COMMENT "Make library installation" WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) + add_custom_command(TARGET regxstr POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_INSTALL_PREFIX}/include COMMENT "Make header installation" WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) + if ("${CMAKE_GENERATOR}" MATCHES "Xcode" AND "${CMAKE_BUILD_TYPE}" STREQUAL "Debug" AND NOT "${SW_VERS}" STREQUAL "") + #set_target_properties(regxstr PROPERTIES XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Apple Development") + #set_target_properties(regxstr PROPERTIES XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "-") + set_target_properties(regxstr PROPERTIES XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS ${CMAKE_CURRENT_LIST_DIR}/regxstr.entitlements) + add_custom_command(TARGET regxstr POST_BUILD COMMAND codesign --entitlements "${CMAKE_CURRENT_LIST_DIR}/regxstr.entitlements" --sign - --force --verbose --timestamp --deep $ || :) + if ("${REGXSTR_LINKAGE}" STREQUAL "SHARED") + add_custom_command(TARGET regxstr POST_BUILD COMMAND codesign --entitlements "${CMAKE_CURRENT_LIST_DIR}/regxstr.entitlements" --sign - --force --verbose --timestamp --deep $ || :) + endif() + endif() + add_custom_command(TARGET regxstr POST_BUILD COMMAND ${CMAKE_INSTALL_NAME_TOOL} -add_rpath "@executable_path/" $ || :) + string(LENGTH "${REGXSTR_CODESIGNING}" LEN) + if ("${LEN}" STREQUAL "40" AND "${CMAKE_BUILD_TYPE}" STREQUAL "Release" AND NOT "${SW_VERS}" STREQUAL "") + add_custom_command(TARGET regxstr POST_BUILD COMMAND codesign --sign "${REGXSTR_CODESIGNING}" --force --verbose --timestamp --deep $ || :) + if ("${REGXSTR_LINKAGE}" STREQUAL "SHARED") + add_custom_command(TARGET regxstr POST_BUILD COMMAND codesign --sign "${REGXSTR_CODESIGNING}" --force --verbose --timestamp --deep $ || :) + endif() + endif() + endif() +endif() + diff --git a/Regx String.sln b/Regx String.sln deleted file mode 100644 index 62f6d64..0000000 --- a/Regx String.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Regx String", "Regx String.vcproj", "{5D9DE141-5BE7-45EB-A26C-923F12F8BF8B}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {5D9DE141-5BE7-45EB-A26C-923F12F8BF8B}.Debug|Win32.ActiveCfg = Debug|Win32 - {5D9DE141-5BE7-45EB-A26C-923F12F8BF8B}.Debug|Win32.Build.0 = Debug|Win32 - {5D9DE141-5BE7-45EB-A26C-923F12F8BF8B}.Release|Win32.ActiveCfg = Release|Win32 - {5D9DE141-5BE7-45EB-A26C-923F12F8BF8B}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Regx String.vcproj b/Regx String.vcproj deleted file mode 100644 index 875bb01..0000000 --- a/Regx String.vcproj +++ /dev/null @@ -1,250 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/main.cpp b/main.cpp index d84f79e..5c92f5e 100644 --- a/main.cpp +++ b/main.cpp @@ -106,6 +106,10 @@ int main(int argc,const char ** argv) ExtractArg(argv[i],"?",ret) || ExtractArg(argv[i],"--help",ret)) && !ret) { +#ifdef TEST + if(test) + test_pcre(c); +#endif printUsage(ProgramName(argv[0])); return 1; }else if((ExtractArg(argv[i],"-t",ret) || ExtractArg(argv[i],"-test",ret)) && !ret){ diff --git a/makefile b/makefile deleted file mode 100644 index 8e5403e..0000000 --- a/makefile +++ /dev/null @@ -1,79 +0,0 @@ -BIN_DIR := bin -OUT_TARGET := $(BIN_DIR)/regxstr -LIB_TARGET := $(BIN_DIR)/libregxstr.a -SO_TARGET := $(BIN_DIR)/libregxstr.so -INC_TARGET := regxstring.h - -INSTALL_OUT_DIR := /usr/local/bin -INSTALL_LIB_DIR := /usr/lib -INSTALL_INC_DIR := /usr/include - -DEBUG := -g -O0 -DTEST -#RELEASE := -O2 -DNDEBUG -CXXFLAGS := -Wall -fPIC $(DEBUG) $(RELEASE) -ARFLAGS := cr -LIB := /usr/lib/libpcre.a -CP := cp -f - -SRC := $(wildcard *.cpp) -OBJ := $(SRC:.cpp=.o) -DEP := $(OBJ:.o=.d) -HEADER := $(wildcard *.h) - -CXXFLAGS+=-MD - -all : out lib so - @$(CP) $(INC_TARGET) $(BIN_DIR) - -install : - $(CP) $(OUT_TARGET) $(INSTALL_OUT_DIR) - $(CP) $(LIB_TARGET) $(SO_TARGET) $(INSTALL_LIB_DIR) - $(CP) $(INC_TARGET) $(INSTALL_INC_DIR) - -uninstall : - $(RM) $(INSTALL_OUT_DIR)/$(notdir $(OUT_TARGET)) - $(RM) $(INSTALL_LIB_DIR)/$(notdir $(LIB_TARGET)) - $(RM) $(INSTALL_LIB_DIR)/$(notdir $(SO_TARGET)) - $(RM) $(INSTALL_INC_DIR)/$(INC_TARGET) - -out : $(OUT_TARGET) - -lib : $(LIB_TARGET) - -so : $(SO_TARGET) - -$(OUT_TARGET) : $(OBJ) - $(CXX) -o $@ $^ $(LIB) - -$(LIB_TARGET) : $(OBJ) - $(AR) $(ARFLAGS) $@ $^ - -$(SO_TARGET) : $(OBJ) - $(CXX) -shared -fPIC -o $@ $^ - -cleandist : - $(RM) *.o - -clean : cleandist - $(RM) *.d $(BIN_DIR)/* - -love : clean all - -lines : - @echo $(HEADER) $(SRC) | xargs wc -l - -.PHONY : all install uninstall out lib so cleandist clean love lines - -ifneq (${MAKECMDGOALS},install) -ifneq (${MAKECMDGOALS},uninstall) -ifneq (${MAKECMDGOALS},clean) -ifneq (${MAKECMDGOALS},cleandist) -ifneq (${MAKECMDGOALS},love) -ifneq (${MAKECMDGOALS},lines) -sinclude $(DEP) -endif -endif -endif -endif -endif -endif diff --git a/makefile.release b/makefile.release deleted file mode 100644 index e59e7d1..0000000 --- a/makefile.release +++ /dev/null @@ -1,79 +0,0 @@ -BIN_DIR := bin -OUT_TARGET := $(BIN_DIR)/regxstr -LIB_TARGET := $(BIN_DIR)/libregxstr.a -SO_TARGET := $(BIN_DIR)/libregxstr.so -INC_TARGET := regxstring.h - -INSTALL_OUT_DIR := /usr/local/bin -INSTALL_LIB_DIR := /usr/lib -INSTALL_INC_DIR := /usr/include - -#DEBUG := -g -O0 -DTEST -RELEASE := -O2 -DNDEBUG -CXXFLAGS := -Wall -fPIC $(DEBUG) $(RELEASE) -ARFLAGS := cr -LIB := -CP := cp -f - -SRC := $(wildcard *.cpp) -OBJ := $(SRC:.cpp=.o) -DEP := $(OBJ:.o=.d) -HEADER := $(wildcard *.h) - -CXXFLAGS+=-MD - -all : out lib so - @$(CP) $(INC_TARGET) $(BIN_DIR) - -install : - $(CP) $(OUT_TARGET) $(INSTALL_OUT_DIR) - $(CP) $(LIB_TARGET) $(SO_TARGET) $(INSTALL_LIB_DIR) - $(CP) $(INC_TARGET) $(INSTALL_INC_DIR) - -uninstall : - $(RM) $(INSTALL_OUT_DIR)/$(notdir $(OUT_TARGET)) - $(RM) $(INSTALL_LIB_DIR)/$(notdir $(LIB_TARGET)) - $(RM) $(INSTALL_LIB_DIR)/$(notdir $(SO_TARGET)) - $(RM) $(INSTALL_INC_DIR)/$(INC_TARGET) - -out : $(OUT_TARGET) - -lib : $(LIB_TARGET) - -so : $(SO_TARGET) - -$(OUT_TARGET) : $(OBJ) - $(CXX) -o $@ $^ $(LIB) - -$(LIB_TARGET) : $(OBJ) - $(AR) $(ARFLAGS) $@ $^ - -$(SO_TARGET) : $(OBJ) - $(CXX) -shared -fPIC -o $@ $^ - -cleandist : - $(RM) *.o - -clean : cleandist - $(RM) *.d $(BIN_DIR)/* - -love : clean all - -lines : - @echo $(HEADER) $(SRC) | xargs wc -l - -.PHONY : all install uninstall out lib so cleandist clean love lines - -ifneq (${MAKECMDGOALS},install) -ifneq (${MAKECMDGOALS},uninstall) -ifneq (${MAKECMDGOALS},clean) -ifneq (${MAKECMDGOALS},cleandist) -ifneq (${MAKECMDGOALS},love) -ifneq (${MAKECMDGOALS},lines) -sinclude $(DEP) -endif -endif -endif -endif -endif -endif diff --git a/pcre1 b/pcre1 new file mode 160000 index 0000000..9b20c2b --- /dev/null +++ b/pcre1 @@ -0,0 +1 @@ +Subproject commit 9b20c2b026cc953ae61c36322a3576fb6f2fde4a diff --git a/regxstr.entitlements b/regxstr.entitlements new file mode 100644 index 0000000..8cc185a --- /dev/null +++ b/regxstr.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.cs.disable-library-validation + + + diff --git a/regxstring_impl.h b/regxstring_impl.h index 2f15700..c19d430 100644 --- a/regxstring_impl.h +++ b/regxstring_impl.h @@ -9,10 +9,12 @@ #define _DZ_DEBUG 0 +#ifndef _MEM_LEAK #define _MEM_LEAK 0 +#endif //allocator choice -#ifndef __GNUC__ +#if !defined(__GNUC__) || (__GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 4)) || (defined(__clang_major__) && __clang_major__ >= 5) # define __DZ_ALLOC std::allocator #else # ifndef NDEBUG diff --git a/test.h b/test.h index 1aee3fb..3e5cf3d 100644 --- a/test.h +++ b/test.h @@ -75,17 +75,23 @@ static void test_pcre(int c) CRegxString regxstr; std::string regx; while(std::getline(cin,regx)){ + if (regx.empty()){ + continue; + } regx = pre_handle(regx); - cout<<"Test regx : "<