95 lines
1.8 KiB
C
95 lines
1.8 KiB
C
// Laboratorio 1 - Esercizio 1
|
|
// Matteo Schiff - s295565
|
|
|
|
#include <stdbool.h>
|
|
#include <ctype.h>
|
|
#include <stdio.h>
|
|
|
|
char *cercaRegexp(char *src, char *regexp);
|
|
|
|
// NOTE: regexp has to be incremented after calling this function
|
|
bool checkChar(char src, char **regexp)
|
|
{
|
|
switch (**regexp)
|
|
{
|
|
case '.':
|
|
return true;
|
|
case '[':
|
|
(*regexp)++;
|
|
int negate = **regexp == '^';
|
|
|
|
if (negate)
|
|
(*regexp)++;
|
|
|
|
do
|
|
{
|
|
if (src == **regexp) {
|
|
while (**regexp != ']')
|
|
(*regexp)++;
|
|
return !negate;
|
|
}
|
|
(*regexp)++;
|
|
} while (**regexp != ']');
|
|
|
|
return negate;
|
|
case '\\':
|
|
(*regexp)++;
|
|
if (**regexp == 'a') {
|
|
return islower(src);
|
|
} else if (**regexp == 'A') {
|
|
return isupper(src);
|
|
}
|
|
return false; // NOTE: regex is not valid
|
|
default:
|
|
return src == **regexp;
|
|
}
|
|
}
|
|
|
|
bool matchSubstring(char *src, char *regexp)
|
|
{
|
|
char *cur_s = src;
|
|
char *cur_meta = regexp;
|
|
|
|
while (*cur_meta != 0)
|
|
{
|
|
// match failed if regex check is false or if we reached the end
|
|
// of the string without reaching the end of the regex
|
|
if (*cur_s == 0 || !checkChar(*cur_s, &cur_meta))
|
|
return false;
|
|
|
|
cur_s++;
|
|
cur_meta++;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
char *searchRegexp(char *src, char *regexp)
|
|
{
|
|
char *cur_s = src;
|
|
|
|
while (*cur_s != 0)
|
|
{
|
|
if (matchSubstring(cur_s, regexp))
|
|
return cur_s;
|
|
cur_s++;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int main(int argc, char ** argv) {
|
|
if (argc != 3) {
|
|
puts("USAGE: ./esercizio1 string regexp");
|
|
return 1;
|
|
}
|
|
|
|
char * substr = searchRegexp(argv[1], argv[2]);
|
|
|
|
if (!substr) {
|
|
puts("No matches");
|
|
} else {
|
|
puts(substr);
|
|
}
|
|
return 0;
|
|
}
|