initial commit
This commit is contained in:
commit
be39097f63
|
@ -0,0 +1,8 @@
|
|||
CFLAGS = -I lib/ -O3 -Wall -Werror -Wextra -Wpedantic
|
||||
|
||||
build: src/main.c
|
||||
mkdir -p bin/
|
||||
gcc $(CFLAGS) -o bin/main \
|
||||
src/terminal_colors.c \
|
||||
src/main.c \
|
||||
-lm
|
|
@ -0,0 +1,5 @@
|
|||
#define COLOR_RED 1
|
||||
|
||||
void clear_color(void);
|
||||
|
||||
void set_color(int color_id);
|
|
@ -0,0 +1,180 @@
|
|||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "terminal_colors.h"
|
||||
|
||||
static int
|
||||
retrieve_double_from_string(double* p_target,
|
||||
char* p_source)
|
||||
{
|
||||
return sscanf(p_source, "%lf", p_target);
|
||||
}
|
||||
|
||||
static int
|
||||
retrieve_inputs_from_argv(char** argv,
|
||||
double* px,
|
||||
double* py)
|
||||
{
|
||||
/*
|
||||
* In binary form, shows which values have
|
||||
* failed to be read. If specific bit is set,
|
||||
* the corresponding value has not been read
|
||||
* correctly.
|
||||
*
|
||||
* return code: 00
|
||||
* ^^
|
||||
* ||
|
||||
* |`- bit 0 represents value of "x"
|
||||
* |
|
||||
* `- bit 1 represents value of "y"
|
||||
*/
|
||||
int return_code = 0;
|
||||
|
||||
if (1 != retrieve_double_from_string(px, argv[1]))
|
||||
return_code |= 0x1;
|
||||
|
||||
if (1 != retrieve_double_from_string(py, argv[2]))
|
||||
return_code |= 0x2;
|
||||
|
||||
return return_code;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
retrieve_double_from_stdin(double* p_target,
|
||||
char* p_label)
|
||||
{
|
||||
char retrieved_string[128];
|
||||
|
||||
for (int attempts = 0; attempts < 10000; ++attempts)
|
||||
{
|
||||
printf("Enter %s: ", p_label);
|
||||
|
||||
fgets(retrieved_string, 127, stdin);
|
||||
|
||||
int received_args = sscanf(retrieved_string, "%lf", p_target);
|
||||
|
||||
if (1 == received_args)
|
||||
break;
|
||||
|
||||
puts("Please, try again.");
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
retrieve_inputs_from_stdin(double* px,
|
||||
double* py)
|
||||
{
|
||||
retrieve_double_from_stdin(px, "x");
|
||||
retrieve_double_from_stdin(py, "y");
|
||||
}
|
||||
|
||||
static void
|
||||
calculate_result(double* z1,
|
||||
double* z2,
|
||||
double* x,
|
||||
double* y)
|
||||
{
|
||||
double temp1;
|
||||
|
||||
*z1 = cos(*x);
|
||||
*z1 = *z1 * *z1
|
||||
* *z1 * *z1;
|
||||
*z1 += sin(2**y);
|
||||
temp1 = sin(*x/2);
|
||||
*z1 += temp1 * temp1
|
||||
/ 4 - 1;
|
||||
|
||||
*z2 = sin(*x + *y);
|
||||
*z2 += sin(*x - *y);
|
||||
}
|
||||
|
||||
static void
|
||||
print_padding(int padding_length)
|
||||
{
|
||||
for (int i = 0; i < padding_length; i++)
|
||||
{
|
||||
fputs(" ", stdout);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
print_argument_error(char** argv,
|
||||
int argc,
|
||||
int wrong_argument_index)
|
||||
{
|
||||
fputs("[Error] ", stdout);
|
||||
|
||||
int padding_length = 0;
|
||||
|
||||
for (int i = 0; i < argc; ++i)
|
||||
{
|
||||
if (i < wrong_argument_index)
|
||||
padding_length += strlen(argv[i]) + 1;
|
||||
}
|
||||
|
||||
for (int i = 0; i < argc; ++i)
|
||||
{
|
||||
if (i == wrong_argument_index)
|
||||
set_color(COLOR_RED);
|
||||
|
||||
fputs(argv[i], stdout);
|
||||
|
||||
if (i == wrong_argument_index)
|
||||
clear_color();
|
||||
|
||||
fputs(" ", stdout);
|
||||
}
|
||||
|
||||
fputs("\n[Error]", stdout);
|
||||
print_padding(padding_length);
|
||||
puts(" ^ not a valid (double) value.");
|
||||
}
|
||||
|
||||
static void
|
||||
print_error_message(char** argv,
|
||||
int argc,
|
||||
int error_code)
|
||||
{
|
||||
puts("[Error] Incorrect CLI argument input.");
|
||||
|
||||
if (error_code & 0x1)
|
||||
print_argument_error(argv, argc, 1);
|
||||
|
||||
if (error_code & 0x2)
|
||||
print_argument_error(argv, argc, 2);
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc,
|
||||
char** argv)
|
||||
{
|
||||
double x,
|
||||
y,
|
||||
z1,
|
||||
z2;
|
||||
|
||||
if (3 == argc)
|
||||
{
|
||||
int read_errors = retrieve_inputs_from_argv(argv, &x, &y);
|
||||
|
||||
if (read_errors)
|
||||
{
|
||||
print_error_message(argv, argc, read_errors);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
retrieve_inputs_from_stdin(&x, &y);
|
||||
}
|
||||
|
||||
calculate_result(&z1, &z2, &x, &y);
|
||||
|
||||
printf("Results:\nz1 = %.10lf\nz2 = %.10lf\n", z1, z2);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
#include <stdio.h>
|
||||
|
||||
void
|
||||
clear_color()
|
||||
{
|
||||
fputs("\033[0m", stdout);
|
||||
}
|
||||
|
||||
/*
|
||||
* Color codes:
|
||||
* 1 - red
|
||||
*/
|
||||
void set_color(int color_code)
|
||||
{
|
||||
switch (color_code)
|
||||
{
|
||||
case 1:
|
||||
fputs("\033[31;1m", stdout);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue