From 58ff0b92a766ea1234c38ad752fe9e723ffafe9a Mon Sep 17 00:00:00 2001 From: Mattia Mascarello Date: Tue, 4 Oct 2022 15:48:54 +0200 Subject: [PATCH] Fixed buffer overflows, makefile --- .gitignore | 1 + Makefile | 3 +- ropipe.c | 203 ++++++++++++++++++++++++++--------------------------- 3 files changed, 104 insertions(+), 103 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..45c3120 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +ropipe diff --git a/Makefile b/Makefile index 01178a6..08cc1aa 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ else endif uninstall: ifneq ($(shell id -u), 0) - @echo "You must be root to uninstall" + @echo "You must be root to uninstall" else echo "Removing man file" rm -rf /usr/local/share/man/man1/ropipe.1 @@ -26,3 +26,4 @@ endif update: git pull make install + diff --git a/ropipe.c b/ropipe.c index 3bced61..0995c1b 100644 --- a/ropipe.c +++ b/ropipe.c @@ -1,139 +1,138 @@ +#include #include #include #include #define RDIGITS 14 +int validateN(char c) { + int n = (int)c; + return c > 47 && n < 58; +} /* * Returns the value of a roman numeral digit * @param {char} c - Roman digit -*/ -static int roman_to_integer(char c) -{ - switch (c) - { - case 'I': - return 1; - case 'V': - return 5; - case 'X': - return 10; - case 'L': - return 50; - case 'C': - return 100; - case 'D': - return 500; - case 'M': - return 1000; - default: - return 0; - } + */ +static int roman_to_integer(char c) { + switch (c) { + case 'I': + return 1; + case 'V': + return 5; + case 'X': + return 10; + case 'L': + return 50; + case 'C': + return 100; + case 'D': + return 500; + case 'M': + return 1000; + default: + return 0; + } } /* * Returns the interger value of a roman number * @param {string} s - Roman number -*/ -int roman_to_int(char *s) -{ - int i, int_num = roman_to_integer(s[0]); + */ +int roman_to_int(char *s) { + int i, int_num = roman_to_integer(s[0]); - for (i = 1; s[i] != '\0'; i++) - { - int prev_num = roman_to_integer(s[i - 1]); - int cur_num = roman_to_integer(s[i]); - if (prev_num < cur_num) - { - int_num = int_num - prev_num + (cur_num - prev_num); - } - else - { - int_num += cur_num; - } + for (i = 1; s[i] != '\0'; i++) { + int prev_num = roman_to_integer(s[i - 1]); + int cur_num = roman_to_integer(s[i]); + if (prev_num < cur_num) { + int_num = int_num - prev_num + (cur_num - prev_num); + } else { + int_num += cur_num; } - return int_num; + } + return int_num; } /* * Map of roman digits symbols and their value * @elem {string} sym - digit symbol * @elem {int} val - digit symbol -*/ -typedef struct -{ - char *sym; - int val; + */ +typedef struct { + char *sym; + int val; } numeral; /* * Returns greatest numeral index * @elem {numeral} nu - map of roman digits symbols and their value * @elem {int} num - number -*/ -int maxNume(numeral *nu, int num) -{ - int i, index; - for (i = 0; i < RDIGITS; i++) - { //RDIGITS numerals in array - if (nu[i].val <= num) - index = i; - } - //gretest value numeral index, not greater than number - return index; + */ +int maxNume(numeral *nu, int num) { + int i, index; + for (i = 0; i < RDIGITS; i++) { // RDIGITS numerals in array + if (nu[i].val <= num) + index = i; + } + // gretest value numeral index, not greater than number + return index; } /* * Prints roman number from integer * @elem {numeral} nu - map of roman digits symbols and their value * @elem {int} num - number -*/ -void decToRoman(numeral *nu, int num) -{ - int max; - if (num != 0) - { - max = maxNume(nu, num); - printf("%s", nu[max].sym); - num -= nu[max].val; //decrease number - decToRoman(nu, num); //recursively print numerals - } + */ +void decToRoman(numeral *nu, int num) { + int max; + if (num != 0) { + max = maxNume(nu, num); + printf("%s", nu[max].sym); + num -= nu[max].val; // decrease number + decToRoman(nu, num); // recursively print numerals + } } /* * Main * @elem {int} argc - Argument count * @elem {string[]} argv - Strings array -*/ -int main(int argc, char *argv[]) -{ - int direction = 0; - /* - * 0: integer to roman (default) - * 1: roman to integer - */ - for (int i = 0; i < argc; i++) - { - if (strcmp(argv[i], "-r")) - { - direction = 1; - } - else - { - direction = 0; - } + */ +int main(int argc, char *argv[]) { + int direction = 0; + /* + * 0: integer to roman (default) + * 1: roman to integer + */ + for (int i = 0; i < argc; i++) { + if (strcmp(argv[i], "-r")) { + direction = 1; + } else { + direction = 0; } - numeral nume[RDIGITS] = {{"I", 1}, {"IV", 4}, {"V", 5}, {"IX", 9}, {"X", 10}, {"XL", 40}, {"L", 50}, {"XC", 90}, {"C", 100}, {"CD", 400}, {"D", 500}, {"CM", 900}, {"M", 1000}, {"MMMM", 4000}}; - char *str1; - int inputint = 0; - switch (direction) + } + numeral nume[RDIGITS] = {{"I", 1}, {"IV", 4}, {"V", 5}, {"IX", 9}, + {"X", 10}, {"XL", 40}, {"L", 50}, {"XC", 90}, + {"C", 100}, {"CD", 400}, {"D", 500}, {"CM", 900}, + {"M", 1000}, {"MMMM", 4000}}; + char str[51]; + int inputint = 0; + switch (direction) { + case 0: + while (scanf("%50s", str) && + !feof(stdin)) // read integers and convert to roman { - case 0: - while (scanf("%s", &str1) && !feof(stdin)) // read integers and convert to roman - { - printf("%d\n", roman_to_int(&str1)); - } - break; - case 1: - while (scanf("%d", &inputint) && !feof(stdin)) // read roman and convert to integers - { - decToRoman(nume, inputint); - printf("\n"); - } - break; + printf("%d\n", roman_to_int(str)); + scanf("%*[^\n]"); // discard all until newline } - return 0; + break; + case 1: + while (scanf("%9s", str) && + !feof(stdin)) // read roman and convert to integers + { + for (int i = 0; i < strlen(str); i++) { + if (!validateN(str[i])) + break; + } + sscanf(str, "%d", &inputint); + decToRoman(nume, inputint); + printf("\n"); + scanf("%*[^\n]"); // discard all until newline + } + break; + } + return 0; }