-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfinder.c
88 lines (79 loc) · 2.61 KB
/
finder.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>
#include <dirent.h>
#include "common.h"
#include "finder.h"
// https://stackoverflow.com/a/744822
int checkExtension(const char *filename, const char *extension)
{
if (!filename || !extension)
return 0;
size_t lenFilename = strlen(filename);
size_t lenExtension = strlen(extension);
if (lenExtension > lenFilename)
return 0;
if ((char)*(filename + lenFilename - lenExtension - 1) != '.')
// check if last char before extension is a dot
return 0;
return strncmp(filename + lenFilename - lenExtension, extension, lenExtension) == 0;
// filename to wskażnik na początek napisu, więc dodajemy jego długość i odejmujemy długość suffixu, żeby uzyskać samo rozszerzenie pliku
}
void dirRead(char *dirName)
{
// printf("szukanie w %s\n", dirName);
DIR *rootDir;
rootDir = opendir(dirName);
struct dirent *dirEnt;
while ((dirEnt = readdir(rootDir)) != NULL)
{
char buf[1024];
switch (dirEnt->d_type)
{
case DT_DIR:
// dla katalogów innych niż "." i ".." wywołujemy dirRead rekurencyjnie
// printf("Dir %s {\n", dirEnt->d_name);
if (strcmp(dirEnt->d_name, "..") != 0 && strcmp(dirEnt->d_name, ".") != 0)
{
snprintf(buf, sizeof buf, "%s/%s", dirName, dirEnt->d_name);
dirRead(buf);
}
// printf("} \n");
break;
case DT_REG:
// dla plików regularnych o poprawnych rozszerzeniach przesyłamy ścieżkę na stos paths
// printf("Reg %s\n", dirEnt->d_name);
snprintf(buf, sizeof buf, "%s/%s", dirName, dirEnt->d_name);
int flag = 0;
for (int i = 0; i < extensionsCounter; i++) //check extensions
{
if (checkExtension(buf, extensions[i]))
flag = 1;
}
if (flag)
{
// put on paths stack
char *element = strdup(buf);
stack_push(&paths, element);
}
break;
default:
// dla innych plików ignorujemy
// printf("Other/Unkown %s\n", dirEnt->d_name);
break;
}
}
closedir(rootDir);
}
void *finder(void *info)
{
// printf("thread\n");
// printf("dir: %s\n", rootDirName);
// for (int j = 0; j < extensionsCounter; j++)
// printf("args: %s\n", extensions[j]);
dirRead(rootDirName);
// stack_read(&paths);
stack_endData(&paths);
// printf("end finder\n");
return NULL;
}