mirror of
git://git.psyc.eu/libpsyc
synced 2024-08-15 03:19:02 +00:00
match: intermediate version
This commit is contained in:
parent
51b50c32b4
commit
b9799ca597
2 changed files with 32 additions and 19 deletions
|
@ -11,3 +11,8 @@ diet:
|
|||
lib:
|
||||
${CC} -static -c -Os parser.c -lc -o libpsyc.o -DDEBUG -I../include
|
||||
ar rcs libpsyc.a libpsyc.o
|
||||
|
||||
match: match.c
|
||||
${CC} -o $@ -DTEST $<
|
||||
|
||||
it: match
|
||||
|
|
46
src/match.c
46
src/match.c
|
@ -1,37 +1,36 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
char *sho, *lon, *s, *l, *se, *le;
|
||||
int slen, llen;
|
||||
#ifdef TEST
|
||||
# define PT(args) printf args;
|
||||
#else
|
||||
# define PT(args)
|
||||
#endif
|
||||
|
||||
if (argc != 3) {
|
||||
printf("Usage: %s <short> <long>\n\nExample: %s _failure_delivery _failure_unsuccessful_delivery_death\n", argv[0], argv[0]);
|
||||
return -1;
|
||||
}
|
||||
sho = argv[1];
|
||||
lon = argv[2];
|
||||
int psycmatch(char* sho, char* lon) {
|
||||
char *s, *l, *se, *le;
|
||||
int slen, llen;
|
||||
|
||||
if (!(slen = strlen(sho)) || *sho != '_' ||
|
||||
!(llen = strlen(lon)) || *lon != '_') {
|
||||
printf("Please use long format keywords (compact ones would be faster, I know..)\n");
|
||||
PT(("Please use long format keywords (compact ones would be faster, I know..)\n"))
|
||||
return -2;
|
||||
}
|
||||
|
||||
if (slen > llen) {
|
||||
printf("The long string is shorter than the short one.\n");
|
||||
PT(("The long string is shorter than the short one.\n"))
|
||||
return -3;
|
||||
}
|
||||
|
||||
if (slen == llen) {
|
||||
if (!strcmp(sho, lon)) {
|
||||
printf("Identical arguments.\n");
|
||||
PT(("Identical arguments.\n"))
|
||||
return 0;
|
||||
}
|
||||
printf("Same length but different.\nNo match, but they could be related or have a common type.\n");
|
||||
PT(("Same length but different.\nNo match, but they could be related or have a common type.\n"))
|
||||
return -4;
|
||||
}
|
||||
printf("*start short '%s' long '%s'\n", sho, lon);
|
||||
PT(("*start short '%s' long '%s'\n", sho, lon))
|
||||
|
||||
se = sho+slen;
|
||||
le = lon+llen;
|
||||
|
@ -39,10 +38,10 @@ int main(int argc, char **argv) {
|
|||
sho++; lon++;
|
||||
while(s = strchr(sho, '_')) {
|
||||
*s = 0;
|
||||
printf("sho goes '%c' and lon goes '%c'\n", *sho, *lon);
|
||||
PT(("sho goes '%c' and lon goes '%c'\n", *sho, *lon))
|
||||
while(l = strchr(lon, '_')) {
|
||||
*l = 0;
|
||||
printf("strcmp short '%s' long '%s'\n", sho, lon);
|
||||
PT(("strcmp short '%s' long '%s'\n", sho, lon))
|
||||
if (!strcmp(sho, lon)) goto foundone;
|
||||
if (l == le) goto failed;
|
||||
*l = '_';
|
||||
|
@ -50,17 +49,26 @@ int main(int argc, char **argv) {
|
|||
}
|
||||
goto failed;
|
||||
foundone:
|
||||
printf("found: short '%s' long '%s'\n", sho, lon);
|
||||
PT(("found: short '%s' long '%s'\n", sho, lon))
|
||||
if (s == se) goto success;
|
||||
*l = *s = '_';
|
||||
sho = ++s;
|
||||
lon = ++l;
|
||||
}
|
||||
success:
|
||||
printf("Yes, they match!\n");
|
||||
return 0;
|
||||
failed:
|
||||
printf("No, they don't!\n");
|
||||
PT(("No, they don't match.\n"))
|
||||
return 1;
|
||||
}
|
||||
|
||||
#ifdef TEST
|
||||
int main(int argc, char **argv) {
|
||||
if (argc != 3) {
|
||||
printf("Usage: %s <short> <long>\n\nExample: %s _failure_delivery _failure_unsuccessful_delivery_death\n", argv[0], argv[0]);
|
||||
return -1;
|
||||
}
|
||||
if (psycmatch(argv[1], argv[2]) == 0)
|
||||
printf("Yes, they match!\n");
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue