test of ignoring // cpp-style comments in c-style */
using namespace std; int main() {
/* the test of comment with null length */ /* */
/* test of cpp-style comment // inside another cpp-style comment // */
cout << " 9 // 2 =
" << 9 / 2 << endl; /* test of ingoring // in strings */ return 0;
} /* end */ Success!
Текст программы
#include <stdio.h> #include <stdlib.h> #include <string.h>
#define MAXLEN 256
#if defined(_WIN32) || defined(WIN32) || defined(WINNT) || defined(MSVC) #define clear_console() system("cls")
#else
#define clear_console() system("clear") #endif
/* Arguments: buffer - allocated buffer of chars,
* |
size - size of |
the buffer, |
* |
last_str - the |
string to stop input. |
*Return value: size of data in the buffer.
*Purpose: reads lines from the console to the given buffer,
*until the user enters the specified string. */
size_t read_from_console(char *buffer, size_t size, char *last_str);
/* Arguments: buffer - allocated buffer of chars,
* |
size |
- |
size of the buffer, |
|
* |
file |
- |
handle of the file, |
opened for reading. |
*Return value: size of data in the buffer.
*Purpose: reads a text (data without zeros) to the given buffer from the file. */
size_t read_from_file(char *buffer, size_t size, FILE* file);
20
/* Arguments: n - length of the line, * c - char for printing.
* Purpose: prints a line of given chars to the console. */ void print_line_of_chars(size_t n, char c);
/* Arguments: buffer - pointer to the string.
* Purpose: prints text to the console and underlines comments. */
void print_analysis(char *buffer); |
|
/* Arguments: buffer - pointer to the string, |
|
* |
file - handle of the file, opened for writing. |
* Purpose: writes text to the file, replacing cpp-like comments. */ |
|
void write_result(char *buffer, FILE *file); |
|
int main() { |
|
|
size_t size; |
|
char *text; |
|
char input_str[MAXLEN], |
|
output_str[MAXLEN]; |
|
FILE *input, *output; |
|
/* Main cycle of the program */ |
|
do { |
|
output = NULL; |
|
input = NULL; |
clear_console(); puts(",---------------------------------------,");
puts("| |
C++ to C comment replacer |
|"); |
|||||
printf("| |
Max |
line |
size: % |
10d |
bytes |
|\n", |
(int)(MAXLEN - 1)); |
printf("| |
Max |
text |
size: % |
10d |
bytes |
|\n", |
(int)(MAXLEN * |
MAXLEN - 1)); |
|
|
|
|
|
|
|
puts("'---------------------------------------'\n");
puts("Source: file or console? Default: console"); fgets(input_str, MAXLEN, stdin); input_str[strlen(input_str) - 1] = '\0';
if (input_str[0] == '\0' || strcmp(input_str, "console") == 0) { strncpy(input_str, "console", MAXLEN);
input = stdin;
} else if (strcmp(input_str, "file") == 0) { puts("Enter a name of the file:"); fgets(input_str, MAXLEN, stdin); input_str[strlen(input_str) - 1] = '\0';
if ((input = fopen(input_str, "r")) == NULL)
printf("File \"%s\" does not exist or cannot be readed!\n", input_str);
} else
printf("\"%s\": unknown source type!\n", input_str);
if (input != NULL) {
puts("Destination: file or console? Default: console");
21
fgets(output_str, MAXLEN, stdin); output_str[strlen(output_str) - 1] = '\0';
if (output_str[0] == '\0' || strcmp(output_str, "console") == 0) { strncpy(output_str, "console", MAXLEN);
output = stdout;
} else if (strcmp(output_str, "file") == 0) { puts("Enter a name of the file:"); fgets(output_str, MAXLEN, stdin); output_str[strlen(output_str) - 1] = '\0';
if ((output = fopen(output_str, "w")) == NULL)
printf("File \"%s\" cannot be created or used for writing!\n", output_str);
} else
printf("\"%s\": unknown destination type!\n", output_str);
if (output != NULL) { clear_console();
size = MAXLEN * MAXLEN; text = (char *)malloc(size);
if (text != NULL) {
if (input == stdin) {
puts("Enter the text and type string \"\\q\" to continue:"); size = read_from_console(text, size, "\\q\n"); clear_console();
} else
size = read_from_file(text, size, input);
if (size > 0) {
text = (char *)realloc(text, size); printf("Input: %s\n", input_str); printf("Output: %s\n", output_str);
puts("Analysis (\"~\" - comments for replacement):\n"); print_analysis(text);
puts("\nEnter any key to continue..."); getchar();
clear_console(); puts("Writing result...\n"); write_result(text, output); puts("\nSuccess!");
} else
printf("Warning: zero-sized buffer, please check its initial
size\n");
free(text); text = NULL;
} else
puts("Memory allocation error!");
if (output != stdout) fclose(output);
}
if (input != stdin)
22
fclose(input);
}
puts("Try again? (y/n)"); fgets(input_str, MAXLEN, stdin);
} while (input_str[0] == 'y' || input_str[0] == 'Y' || input_str[0] == '\n');
return 0;
}
size_t read_from_console(char *buffer, size_t size, char *last_str) { char *c;
char temp[MAXLEN]; size_t res_size; res_size = 0;
if (size > 0) {
while (res_size < size && strcmp(fgets(temp, MAXLEN, stdin), last_str)) {
for(c = temp; *c && res_size < size; res_size++, c++) buffer[res_size] = *c;
}
if (res_size == size) buffer[size - 1] = '\0';
else
buffer[res_size++] = '\0';
}
return res_size;
}
size_t read_from_file(char *buffer, size_t size, FILE* file) { size_t res_size;
res_size = 0; if (size > 0) {
res_size = strnlen(buffer, fread(buffer, 1, size, file)); if (res_size == size)
buffer[size - 1] = '\0'; else
buffer[res_size++] = '\0';
}
return res_size;
}
void print_line_of_chars(size_t n, char c) { size_t i;
for (i = 0; i < n; i++) putchar(c);
}
void print_analysis(char *buffer) {
char last_c, is_cpp_style, is_c_style, is_string; char *c, *line_start, *comment_start; is_cpp_style = 0;
is_c_style = 0; is_string = 0;
23
last_c = 0;
for (line_start = c = buffer; *c; c++) { if (*c == '\n') {
if (is_cpp_style) { is_cpp_style = 0; putchar('\n');
print_line_of_chars(comment_start - line_start, ' '); print_line_of_chars(c - comment_start, '~');
}
line_start = c + 1;
} else if (is_c_style) {
if (last_c == '*' && *c == '/') is_c_style = 0;
} else if (!is_cpp_style) { if (*c == '\"')
is_string = 1 - is_string;
else if (!is_string && last_c == '/') { if (*c == '/') {
is_cpp_style = 1; comment_start = c;
} else if (*c == '*') is_c_style = 1;
}
}
putchar(*c); last_c = *c;
}
if (is_cpp_style) { putchar('\n');
print_line_of_chars(comment_start - line_start, ' '); print_line_of_chars(c - comment_start, '~');
}
}
void write_result(char *buffer, FILE *file) {
char last_c, is_cpp_style, is_c_style, is_string, need_to_print; char *c;
is_cpp_style = 0; is_c_style = 0; is_string = 0; last_c = 0;
for (c = buffer; *c; c++) { need_to_print = 1;
if (is_c_style) {
if (last_c == '*' && *c == '/') is_c_style = 0;
}else if (is_cpp_style) { if (*c == '\n') {
need_to_print = 0; is_cpp_style = 0; fputs(" */\n", file);
}
}else {
24