Practice_2/main.c

130 lines
2.6 KiB
C

#include "main.h"
#include <alloca.h>
#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#include <getopt.h> // Получение опций командной строки
#include <locale.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
const char *program_name = NULL;
static int exit_status;
static int d_opt = 0;
static int print(const void *buf, size_t count)
{
int fd_std_out = fcntl(STDOUT_FILENO, F_DUPFD, 0);
write(fd_std_out, buf, count);
close(fd_std_out);
}
static void test_sleep()
{
int err = 0;
err = sleep(3);
printf("Err: %d\n", err);
assert(err == 0);
}
static void set_program_name(const char *argv0)
{
program_name = argv0;
}
static void usage(int status)
{
const char const msg_usage_fmt[] = "Usage: %s [OPTION]... [FILE]...\n";
const char const msg_help[] = "\
Program nothin to do while, this is just dirty example.\n\
Arguments\n\
--h display this help and exit\n";
char * restrict msg_buf;
size_t size;
// Allocate enough memory on function stack for usage message
size = strlen(program_name) + sizeof(msg_usage_fmt) - 2;
msg_buf = alloca(size);
size = snprintf(msg_buf, size, msg_usage_fmt, program_name);
write(STDOUT_FILENO, msg_buf, sizeof(msg_buf[0]) * size);
// Print usage help message
write(STDOUT_FILENO, msg_help, sizeof(msg_help));
}
static int decode_switches(int argc, char **argv)
{
int c;
while (1)
{
c = getopt(argc, argv, "h");
if (c == -1)
break;
switch (c)
{
case 'h':
usage(EXIT_SUCCESS);
break;
default:
break;
}
}
return optind;
}
static void close_stdout(void)
{
close(STDOUT_FILENO);
}
int main(int argc, char *argv[])
{
int fd_std_out;
int i;
const size_t msg_maxlen = 255;
char msg[msg_maxlen + 1];
set_program_name(argv[0]);
setlocale(LC_ALL, "");
atexit(close_stdout);
exit_status = EXIT_SUCCESS;
i = decode_switches (argc, argv);
printf("Обработано аргументов: %d\n", i);
const char const msg_fmt_argv_handled[] = "Обработано аргументов: %d\n";
size_t size;
size = snprintf(msg, msg_maxlen, msg_fmt_argv_handled, i);
write(STDOUT_FILENO, msg, sizeof(msg[0]) * size);
// Duplicate descriptor
fd_std_out = fcntl(STDOUT_FILENO, F_DUPFD, 0);
assert(fd_std_out != -1);
const char const msg_example[] = "Функциональность приложения не реализована\n";
write(STDERR_FILENO, msg_example, sizeof(msg_example)-1);
/*{
const char const * err_str = "WARN\n";
write(STDOUT_FILENO, err_str, sizeof(err_str));
}*/
close(fd_std_out);
return exit_status;
}