diff options
| -rw-r--r-- | CMakeLists.txt | 69 | ||||
| -rw-r--r-- | main.c | 3 | ||||
| -rw-r--r-- | nimisewi.c | 63 |
3 files changed, 99 insertions, 36 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index eb42777..a0c299d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.10) project(nimisewi - VERSION 0.2.0 + VERSION 0.3.0 DESCRIPTION "small program that generates random toki pona noun phrase" HOMEPAGE_URL "https://fsl.aaoth.xyz/nimisewi.c/home") @@ -24,34 +24,70 @@ include(CheckIncludeFile) include(CheckSymbolExists) include(CheckCSourceCompiles) +set(WARNING_STATIC_BUILD "static build won't work here") + # check libraries cmake_host_system_information(RESULT OS_NAME QUERY OS_NAME) message(VERBOSE "OS_NAME is ${OS_NAME}") if(OS_NAME MATCHES "Linux") check_include_file("bsd/string.h" HAVE_BSD_STRING_H) - if(HAVE_BSD_STRING_H) + check_include_file("bsd/stdlib.h" HAVE_BSD_STDLIB_H) + if(HAVE_BSD_STRING_H AND HAVE_BSD_STDLIB_H) set(CMAKE_REQUIRED_LIBRARIES "bsd") + check_symbol_exists(strlcat "bsd/string.h" HAVE_STRLCAT) if (HAVE_STRLCAT) list(APPEND EXTRA_DEFINITIONS HAVE_BSD_STRING_H HAVE_STRLCAT) endif() + + check_symbol_exists(arc4random_uniform "bsd/stdlib.h" + HAVE_ARC4RANDOM_UNIFORM) + if (HAVE_ARC4RANDOM_UNIFORM) + list(APPEND EXTRA_DEFINITIONS HAVE_BSD_STDLIB_H HAVE_ARC4RANDOM_UNIFORM) + endif() + + # check static libraries set(CMAKE_REQUIRED_LINK_OPTIONS "-static") check_c_source_compiles( - "#include<bsd/string.h>\nint main(void){return 0;}" HAVE_LIBBSD_STATIC) - if(NOT HAVE_LIBBSD_STATIC) - message(WARNING "static build won't work here") + "#include<bsd/string.h>\nint main(void){return 0;}" + HAVE_LIBBSD_STATIC) + # libpthread and libmd are needed when linking statically on linux. + # these test aren't really checking particular functions, but + # they are here to make sure that program could be linked statically + unset(CMAKE_REQUIRED_LIBRARIES) + set(CMAKE_REQUIRED_LIBRARIES "pthread") + check_c_source_compiles( + "#include<pthread.h>\nint main(void){return 0;}" + HAVE_LIBPTHREAD_STATIC) + + unset(CMAKE_REQUIRED_LIBRARIES) + set(CMAKE_REQUIRED_LIBRARIES "md") + check_c_source_compiles( + "#include<sha2.h>\nint main(void){return 0;}" + HAVE_LIBMD_STATIC) + + if(NOT (HAVE_LIBBSD_STATIC + AND HAVE_LIBPTHREAD_STATIC + AND HAVE_LIBMD_STATIC)) + message(WARNING ${WARNING_STATIC_BUILD}) endif() - list(APPEND EXTRA_LIBS bsd) + + list(APPEND EXTRA_LIBS bsd pthread md) unset(CMAKE_REQUIRED_LIBRARIES) unset(CMAKE_REQUIRED_LINK_OPTIONS) endif() endif() + if(OS_NAME MATCHES "(.*BSD)|(DragonFly)") check_symbol_exists(strlcat "string.h" HAVE_STRLCAT) if(HAVE_STRLCAT) list(APPEND EXTRA_DEFINITIONS HAVE_STRLCAT) endif() + check_symbol_exists(arc4random_uniform "stdlib.h" HAVE_ARC4RANDOM_UNIFORM) + if(HAVE_ARC4RANDOM_UNIFORM) + list(APPEND EXTRA_DEFINITIONS HAVE_ARC4RANDOM_UNIFORM) + endif() check_symbol_exists(pledge "unistd.h" HAVE_PLEDGE) if(HAVE_PLEDGE) list(APPEND EXTRA_DEFINITIONS HAVE_PLEDGE) @@ -63,7 +99,7 @@ check_c_source_compiles( "#include<stdio.h>\nint main(void){return 0;}" HAVE_LIBC_STATIC ) if(NOT HAVE_LIBC_STATIC) - message(WARNING "static build won't work here") + message(WARNING ${WARNING_STATIC_BUILD}) endif() target_link_libraries(nimisewi PUBLIC ${EXTRA_LIBS}) @@ -71,7 +107,7 @@ target_compile_definitions(nimisewi PRIVATE ${EXTRA_DEFINITIONS}) set(NIMISEWI_CGI_STATIC_BUILD FALSE) if(HAVE_LIBC_STATIC) - if(HAVE_BSD_STRING_H) + if(HAVE_BSD_STRING_H AND HAVE_BSD_STDLIB_H) if(HAVE_LIBBSD_STATIC) set(NIMISEWI_CGI_STATIC_BUILD TRUE) endif() @@ -88,9 +124,11 @@ if(BUILD_CGI) ${PROJECT_BINARY_DIR}/nimitoki.c) option(CGI_INSTALL_DIR "specify installation directory of cgi script") if(CGI_INSTALL_DIR) - set_property(TARGET nimisewi.cgi PROPERTY CGI_INSTALL_DIR ${CGI_INSTALL_DIR}) + set_property(TARGET nimisewi.cgi PROPERTY CGI_INSTALL_DIR + ${CGI_INSTALL_DIR}) else() - set_property(TARGET nimisewi.cgi PROPERTY CGI_INSTALL_DIR "var/www/htdocs/cgi-bin") + set_property(TARGET nimisewi.cgi PROPERTY CGI_INSTALL_DIR + "var/www/htdocs/cgi-bin") endif() target_include_directories(nimisewi.cgi PUBLIC "${PROJECT_BINARY_DIR}") target_compile_definitions(nimisewi.cgi PRIVATE ${EXTRA_DEFINITIONS}) @@ -106,9 +144,11 @@ if(BUILD_GEMINI_CGI) ${PROJECT_BINARY_DIR}/nimitoki.c) option(GEMINI_CGI_INSTALL_DIR "specify installation directory of cgi script") if(GEMINI_CGI_INSTALL_DIR) - set_property(TARGET nimisewi_gemini.cgi PROPERTY GEMINI_CGI_INSTALL_DIR ${GEMINI_CGI_INSTALL_DIR}) + set_property(TARGET nimisewi_gemini.cgi PROPERTY GEMINI_CGI_INSTALL_DIR + ${GEMINI_CGI_INSTALL_DIR}) else() - set_property(TARGET nimisewi_gemini.cgi PROPERTY GEMINI_CGI_INSTALL_DIR "var/gemini/cgi-bin") + set_property(TARGET nimisewi_gemini.cgi PROPERTY GEMINI_CGI_INSTALL_DIR + "var/gemini/cgi-bin") endif() target_include_directories(nimisewi_gemini.cgi PUBLIC "${PROJECT_BINARY_DIR}") target_compile_definitions(nimisewi_gemini.cgi PRIVATE ${EXTRA_DEFINITIONS}) @@ -136,13 +176,16 @@ set(CPACK_PROJECT_VERSION_MAJOR ${nimisewi_VERSION_MAJOR}) set(CPACK_PROJECT_VERSION_MINOR ${nimisewi_VERSION_MINOR}) set(CPACK_PROJECT_VERSION_PATCH ${nimisewi_VERSION_PATCH}) set(CPACK_PACKAGE_FILE_NAME - ${CMAKE_PROJECT_NAME}-${nimisewi_VERSION}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}) + ${CMAKE_PROJECT_NAME}-${nimisewi_VERSION} + -${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}) set(CPACK_GENERATOR "TGZ" "ZIP") set(CPACK_SOURCE_GENERATOR "TGZ" "ZIP") set(CPACK_SOURCE_IGNORE_FILES \.fslckout \.fossil-settings build/ + utils/ + download.md ) set(CPACK_STRIP_FILES TRUE) include(CPack) @@ -50,6 +50,9 @@ main(int argc, char *argv[]) #ifdef HAVE_STRLCAT printf("HAVE_STRLCAT\n"); #endif +#ifdef HAVE_ARC4RANDOM_UNIFORM + printf("HAVE_ARC4RANDOM_UNIFORM\n"); +#endif return EXIT_SUCCESS; } } @@ -29,17 +29,22 @@ #include <config.h> #include <err.h> #include <stdio.h> -#include <stdlib.h> #include <unistd.h> +#include <stdint.h> +#include <sys/types.h> +#include <sys/time.h> -#ifdef HAVE_BSD_STRING_H -#include <bsd/string.h> +#ifdef HAVE_BSD_STDLIB_H + #include <bsd/stdlib.h> #else -#include <string.h> + #include <stdlib.h> #endif -#include <sys/types.h> -#include <sys/time.h> +#ifdef HAVE_BSD_STRING_H + #include <bsd/string.h> +#else + #include <string.h> +#endif #include "nimisewi.h" #include "nimitoki.h" /* nimi_toki, suli_pi_nimi_toki */ @@ -53,6 +58,27 @@ struct nanpa_nimi { size_t suli_pi_nimi_sewi; /* length of generated phrase */ }; +static uint32_t +nsrand(uint32_t limit) +{ +#ifdef HAVE_ARC4RANDOM_UNIFORM + return arc4random_uniform(limit); +#else + return rand() % limit; +#endif +} + +static size_t +catstr(char *dst, const char *src, size_t size) +{ +#ifdef HAVE_STRLCAT + return strlcat(dst, src, size); +#else + strncat(dst, src, size); + return strlen(dst); +#endif +} + static void open_e_nanpa_sewi(void) { @@ -109,7 +135,7 @@ nanpa_nimi_pana_e_pi(struct nanpa_nimi *nn) * - word1 word2 word3 * - word1 pi word2 word3 */ - nn->pi_li_lon = rand() % 2; + nn->pi_li_lon = nsrand(2); } else if (nn->nanpa_nimi > 2) { nn->pi_li_lon = 1; } @@ -142,7 +168,7 @@ static struct nanpa_nimi nn->nanpa_sewi_nimi = NULL; nn->suli_pi_nimi_sewi = 0; - nn->nanpa_nimi = (rand() % 6); + nn->nanpa_nimi = (nsrand(6)); /* to use with arbitrary wordlist, remove following function call */ nanpa_nimi_pana_e_pi(nn); @@ -153,7 +179,7 @@ static struct nanpa_nimi return NULL; } for (i = 0; i <= nn->nanpa_nimi; i++) { - nn->nanpa_sewi_nimi[i] = rand() % suli_pi_nimi_toki; + nn->nanpa_sewi_nimi[i] = nsrand(suli_pi_nimi_toki); } if (nn->pi_li_lon) { nn->nanpa_sewi_nimi[nn->nanpa_pi] = -1; @@ -183,7 +209,9 @@ char char *nimi_pana; struct nanpa_nimi *nn; +#ifndef HAVE_ARC4RANDOM_UNIFORM open_e_nanpa_sewi(); +#endif nn = pana_e_nanpa_nimi(); @@ -194,25 +222,14 @@ char } for (i = 0; i < nn->nanpa_nimi; i++) { -#ifdef HAVE_STRLCAT - strlcat(nimi_pana, + catstr(nimi_pana, pana_e_nimi(nn->nanpa_sewi_nimi[i]), nn->suli_pi_nimi_sewi); - strlcat(nimi_pana, " ", nn->suli_pi_nimi_sewi); -#else - strcat(nimi_pana, - pana_e_nimi(nn->nanpa_sewi_nimi[i])); - strcat(nimi_pana, " "); -#endif + catstr(nimi_pana, " ", nn->suli_pi_nimi_sewi); } -#ifdef HAVE_STRLCAT - strlcat(nimi_pana, + catstr(nimi_pana, pana_e_nimi(nn->nanpa_sewi_nimi[i]), nn->suli_pi_nimi_sewi); -#else - strcat(nimi_pana, - pana_e_nimi(nn->nanpa_sewi_nimi[i])); -#endif weka_e_nanpa_nimi(nn); |
