about summary refs log tree commit diff stats
path: root/cli.c
diff options
context:
space:
mode:
authorDaniel Santos <dacs.git@brilhante.top>2022-03-17 19:00:32 +0000
committerDaniel Santos <dacs.git@brilhante.top>2022-03-17 19:09:42 +0000
commit2bea495fe63ddf28d978eabc999e50f6c540b293 (patch)
tree7a2f7b30159b69570793fe1e7c4563be5d6be7ae /cli.c
parent6752a1a9e2fb5cc2b1fccd4380cb247f19aafec1 (diff)
downloadnumericx-c-2bea495fe63ddf28d978eabc999e50f6c540b293.tar.gz
separate into header, implementation and cli
 * separate numericx into: numericx.h, numericx.c, cli.c
 * numericx.h is the numericx library header
 * numericx.c is the numericx library implementation
 * cli.c is the numericx command-line program

Signed-off-by: Daniel Santos <dacs.git@brilhante.top>
Diffstat (limited to 'cli.c')
-rw-r--r--cli.c176
1 files changed, 176 insertions, 0 deletions
diff --git a/cli.c b/cli.c
new file mode 100644
index 0000000..816da7d
--- /dev/null
+++ b/cli.c
@@ -0,0 +1,176 @@
+/** @file cli.c
+ * Numericx command-line interface (CLI) program.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+#include <errno.h>
+#include "numericx.h"
+
+
+/* ||COMPILATION FLAGS|| */
+
+/**
+ * @name Compilation Flags
+ *
+ * These are the valid compilation flags for the definition of numerical systems.
+ * Use them to set the proprieties of the FROM and the TO numerical system, when
+ * compiling the cli executable.
+ *
+ * @{
+ */
+
+/**
+ * @param bool
+ *
+ * Configuration of the resulting numeral system
+ * to have the units place on the end of the writing direction (on the right).
+ */
+#ifndef TO_UNITS_ON_THE_END
+#define TO_UNITS_ON_THE_END false
+#endif
+
+/**
+ * @param bool
+ *
+ * Configuration of the numeral system of the number input
+ * to have the units place on the end of the writing direction (on the right).
+ */
+#ifndef FROM_UNITS_ON_THE_END
+#define FROM_UNITS_ON_THE_END false
+#endif
+
+/**
+ * @param bool
+ *
+ * Configuration of the resulting numeral system
+ * to start counting on the second number, being the
+ * first number void.
+ */
+#ifndef TO_FIRST_NUMBER_VOID
+#define TO_FIRST_NUMBER_VOID false
+#endif
+
+/**
+ * @param bool
+ *
+ * Configuration of the numeral system of the number input
+ * to start counting on the second number, being the
+ * first number void.
+ */
+#ifndef FROM_FIRST_NUMBER_VOID
+#define FROM_FIRST_NUMBER_VOID false
+#endif
+
+/**
+ * @param bool
+ *
+ * Configuration of the resulting numeral system
+ * to have the first number as an infinite number,
+ * for example, if the first number is 'A', then
+ * A == AA == AAA == AAAA ...
+ */
+#ifndef TO_INFINITE_BASE
+#define TO_INFINITE_BASE false
+#endif
+
+/**
+ * @param bool
+ *
+ * Configuration of the numeral system of the number input
+ * to have the first number as an infinite number,
+ * for example, if the first number is 'A', then
+ * A == AA == AAA == AAAA ...
+ */
+#ifndef FROM_INFINITE_BASE
+#define FROM_INFINITE_BASE false
+#endif
+
+/** @} */
+
+
+/* ||MAIN FUNCTION|| */
+
+/**
+ * @brief CLI program.
+ *
+ * This is a command-line interface program, that uses the 'numericx_*'
+ * functions. It receives one number argument from the command-line and
+ * prints the translated number, or an error message.
+ *
+ * @param argv[] - one number from the command-line.
+ *
+ * @return E2BIG in case of wrong number of arguments.
+ * @return EXIT_FAILURE in case of unsuccessful number translation.
+ * @return EXIT_SUCCESS in case of a successful number translation.
+ */
+int
+main(int argc, char* argv[])
+{
+	/* argument processing */
+	if( !(argc == 2) )
+	{
+		fprintf(stderr, "usage: %s <number>\n", PROG_NAME);
+		return E2BIG;
+	}
+
+	/* Number variables to be converted */
+	char* number = argv[1];
+
+	/* Arguments for translation */
+	char* from = malloc( (strlen(FROM_NUMERICALS) + 1) * sizeof(char) );
+	char* to = malloc( (strlen(TO_NUMERICALS) + 1) * sizeof(char) );
+
+	strcpy(from, FROM_NUMERICALS);
+	strcpy(to, TO_NUMERICALS);
+
+	bool to_units_on_the_end = TO_UNITS_ON_THE_END;
+	bool from_units_on_the_end = FROM_UNITS_ON_THE_END;
+	bool to_first_number_void = TO_FIRST_NUMBER_VOID;
+	bool from_first_number_void = FROM_FIRST_NUMBER_VOID;
+	bool to_infinite_base = TO_INFINITE_BASE;
+	bool from_infinite_base = FROM_INFINITE_BASE;
+
+	/* Translation */
+	char* result = NULL;
+	int status = numericx_translate(
+			from, from_units_on_the_end, from_first_number_void, from_infinite_base,
+			to, to_units_on_the_end, to_first_number_void, to_infinite_base,
+			number, &result);
+
+	/* Test for translation failure */
+	switch( status )
+	{
+		case EINVAL:
+			fprintf(stderr, "error: %s: %s. Resulting string variable has to be NULL.\n",
+					PROG_NAME, strerror(EINVAL));
+			break;
+		case EDOM:
+			fprintf(stderr, "error: %s: %s. Valid numerals are: \"%s\".\n",
+					PROG_NAME, strerror(EDOM), from);
+			break;
+		case ERANGE:
+				fprintf(stderr, "error: %s: Unrepresentable void number.\n", PROG_NAME);
+			break;
+	}
+	if( !(status == EXIT_SUCCESS) )
+	{
+		fprintf(stderr, "error: %s: Incapable of translating.\n", PROG_NAME);
+		free(from);
+		free(to);
+		numericx_free(result);
+
+		return EXIT_FAILURE;
+	}
+
+	/* Print */
+	printf("%s\n", result);
+
+	/* Free */
+	free(from);
+	free(to);
+	numericx_free(result);
+
+	return EXIT_SUCCESS;
+}