SayoriOS  0.3.3
pathinfo.c
См. документацию.
1 
10 #include <lib/php/pathinfo.h>
11 #include "mem/vmm.h"
12 
13 char* pathinfo(const char* Path, int Mode){
14  int i = 0, length = strlen(Path), dot_index = -1;
15  char* info = kmalloc(length + 1);
16  memset(info, 0, length + 1);
17  if (Mode == PATHINFO_DIRNAME) {
18  if (Path[(length - 1)] == '/' || Path[(length - 1)] == '\\'){
19  length--;
20  }
21  for (i = length - 1; i >= 0; i--) {
22  if (Path[i] == '/' || Path[i] == '\\') {
23  break;
24  }
25  }
26  if (i >= 0) {
27  strncpy(info, Path, i + 1);
28  info[i + 1] = '\0';
29  } else {
30  info[0] = '/';
31  info[1] = '\0';
32  }
33  } else if (Mode == PATHINFO_BASENAME){
34  if (Path[(length - 1)] == '/' || Path[(length - 1)] == '\\'){
35  length--;
36  }
37  for (i = length - 1; i >= 0; i--) {
38  if (Path[i] == '/' || Path[i] == '\\') {
39  break;
40  }
41  }
42 
43  if (i >= 0) {
44  strncpy(info, Path + i + 1, length - i);
45  info[length - i - 1] = '\0';
46  } else {
47  strcpy(info, Path);
48  }
49  } else if (Mode == PATHINFO_EXTENSION){
50  for (i = length - 1; i >= 0; i--) {
51  if (Path[i] == '.') {
52  break;
53  }
54  }
55 
56  if (i >= 0 && i < length - 1) {
57  strncpy(info, Path + i + 1, length - i);
58  info[length - i] = '\0';
59  } else {
60  info[0] = '\0';
61  }
62  } else {
63  for (i = length - 1; i >= 0; i--) {
64  if (Path[i] == '.') {
65  dot_index = i;
66  break;
67  }
68  }
69 
70  if (dot_index >= 0) {
71  strncpy(info, Path, dot_index);
72  info[dot_index] = '\0';
73  } else {
74  // Если точка не найдена, возвращаем полное имя файла
75  strcpy(info, Path);
76  }
77  }
78  return info;
79 }
size_t strlen(const char *str)
Возращает длину строки
Definition: string.c:88
char * strncpy(char *dest, const char *src, size_t n)
Копирование строк c ограничением длины
Definition: string.c:447
void * memset(void *ptr, char value, size_t num)
Заполнение массива указанными символами
Definition: string.c:203
int strcpy(char *dest, const char *src)
Копирование строк
Definition: string.c:282