aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorla-ninpre <leobrekalini@gmail.com>2021-09-10 14:06:29 +0000
committerla-ninpre <leobrekalini@gmail.com>2021-09-10 14:06:29 +0000
commit60d1b0c720c58dc08b070dd9d39d72f93a07b028 (patch)
tree0bad69bc7864d2aeb2f9d6c6ddc5cd369589b66a
parente6e5718516d6258696287e24c1303898510ff091 (diff)
downloadnimisewi_c-60d1b0c720c58dc08b070dd9d39d72f93a07b028.tar.gz
nimisewi_c-60d1b0c720c58dc08b070dd9d39d72f93a07b028.zip
added support for arc4random_uniform functionv0.3.0
i know that it's probably an overkill for such stupid little program, but why not :D also refactored strlcat support a bit, to make sure that strncat function is used if strlcat could not be found. FossilOrigin-Name: 1b72489c7f0f5b72bac65f1469c9bec650d7ffdabfa4f88409e15c630ac5a52d
-rw-r--r--CMakeLists.txt69
-rw-r--r--main.c3
-rw-r--r--nimisewi.c63
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)
diff --git a/main.c b/main.c
index 04116fd..8c87c54 100644
--- a/main.c
+++ b/main.c
@@ -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;
}
}
diff --git a/nimisewi.c b/nimisewi.c
index bb42d2c..989e227 100644
--- a/nimisewi.c
+++ b/nimisewi.c
@@ -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);