130 lines
2.6 KiB
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;
|
|
}
|