server0451
164 строки · 3.7 Кб
1/******************* ОПИСАНИЕ *******************/
2
3/**
4* Имя файла: utilities.c
5* ----------------------------------------------------------------------------|---------------------------------------|
6* Назначение: некоторые вспомогательные макросы и функции.
7* ----------------------------------------------------------------------------|---------------------------------------|
8* Примечания:
9*/
10
11
12/************ ДИРЕКТИВЫ ПРЕПРОЦЕССОРА ***********/
13
14/*--- Включения ---*/
15
16// Из стандартной библиотеки языка Си.
17#include <stdio.h>
18#include <inttypes.h>
19#include <stdbool.h>
20#include <string.h>
21
22// Локальные модули.
23#include "utilities.h"
24
25
26/******************** ФУНКЦИИ *******************/
27
28/*--- Работа со строками ---*/
29
30bool utilities_nullify_first_CR_or_LF_in_string(char *buf)
31{
32for (uint32_t i = 0; i < strlen(buf); ++i) {
33if (buf[i] == '\r' || buf[i] == '\n') {
34buf[i] = '\0';
35
36return 1;
37}
38}
39
40return 0;
41}
42
43bool utilities_nullify_all_CR_and_LF_in_char_array(char *buf, size_t buf_size)
44{
45uint32_t i = 0;
46for (uint32_t j = 0; j < buf_size - 1; ++j) {
47if (buf[j] == '\r' || buf[i] == '\n') {
48buf[j] = '\0';
49++i;
50}
51}
52
53return i;
54}
55
56bool utilities_nullify_all_trailing_CR_and_LF_in_string(char *buf)
57{
58uint32_t i = 0;
59while (buf[strlen(buf) - 1] == '\r' || buf[strlen(buf) - 1] == '\n') {
60buf[strlen(buf) - 1] = '\0';
61++i;
62}
63
64return i;
65}
66
67bool utilities_substitute_all_CR_and_LF_in_char_array(char *buf, size_t buf_size, char character)
68{
69uint32_t i = 0;
70for (uint32_t j = 0; j < buf_size - 1; ++j) {
71if (buf[j] == '\r' || buf[i] == '\n') {
72buf[j] = character;
73++i;
74}
75}
76
77return i;
78}
79
80bool utilities_append_LF_to_string(char *buf, size_t buf_size)
81{
82if (buf_size - strlen(buf) >= 2) { // Один байт для LF, второй для нуля.
83buf[strlen(buf)] = '\n';
84
85return 1;
86}
87
88return 0;
89}
90
91bool utilities_append_LF_if_absent_to_string(char *buf, size_t buf_size)
92{
93if (buf[strlen(buf) - 1] == '\n') {
94return 0;
95} else if (buf_size - strlen(buf) >= 2) { // Один байт для LF, второй для нуля.
96buf[strlen(buf)] = '\n';
97
98return 1;
99}
100
101return 0;
102}
103
104bool utilities_append_CR_to_string(char *buf, size_t buf_size)
105{
106if (buf_size - strlen(buf) >= 2) { // Один байт для CR, второй для нуля.
107buf[strlen(buf)] = '\r';
108
109return 1;
110}
111
112return 0;
113}
114
115void utilities_to_lowercase_string(char *buf)
116{
117for (uint32_t i = 0; i < strlen(buf); ++i) {
118if (buf[i] >= 'A' && buf[i] <= 'Z') {
119buf[i] += 32; // Разница между ASCII-кодом заглавной и строчной буквы.
120}
121}
122}
123
124
125/*--- Работа с файлами ---*/
126
127void utilities_write_to_file_single_line(char *str, char *file_path)
128{
129FILE *f = fopen(file_path, "w");
130fputs(str, f);
131fclose(f);
132}
133
134void utilities_read_from_file_single_line(char *buf, size_t buf_size, char *file_path)
135{
136FILE *f = fopen(file_path, "r");
137
138if (f == NULL) {
139f = fopen(file_path, "w");
140freopen(NULL, "r", f);
141}
142
143fgets(buf, buf_size, f);
144fclose(f);
145}
146
147void utilities_read_from_file(char *buf, size_t buf_size, char *file_path)
148{
149FILE *f = fopen(file_path, "r");
150
151uint32_t i = 0;
152char c = 0;
153while (c != EOF && i < buf_size - 1) {
154c = fgetc(f);
155
156if (c != EOF) {
157buf[i] = c;
158}
159
160++i;
161}
162
163fclose(f);
164}
165