embox

Форк
0
/
fatfs_subr.c 
160 строк · 2.8 Кб
1
/**
2
 * @file
3
 * @brief
4
 *
5
 * @date 14.08.2012
6
 * @author Andrey Gazukin
7
 */
8

9
#include <stdio.h>
10
#include <string.h>
11
#include <stdlib.h>
12
#include <errno.h>
13

14
#include <fs/hlpr_path.h>
15

16
#include "fat.h"
17

18
int fat_check_filename(char *filename) {
19
	char *point;
20
	int len;
21
	int extlen;
22
	/* filename.ext <= 8 + 3 + dot */
23
	if(MSDOS_NAME + 1 < (len = strlen(filename))) {
24
		return ENAMETOOLONG;
25
	}
26
	point = filename + len;
27
	extlen = 0;
28

29
	/* set point to a dot */
30
	do {
31
		if(*point == '.') {
32
			break;
33
		}
34
		point --;
35
		extlen++;
36

37
	} while (point > filename);
38

39
	if(*point == '.') {
40
		if(extlen > 4) {
41
			/* normal only if name is .filename */
42
			if(point != filename) {
43
				return EINVAL;
44
			}
45
		} else {
46
			if(len - extlen > 8) {
47
				return ENAMETOOLONG;
48
			}
49
			if(1 >= extlen) {
50
				return EINVAL;
51
			}
52
		}
53
	} else if(len > 8) {
54
		return ENAMETOOLONG;
55
	}
56
	return 0;
57
}
58

59
void fat_get_filename(char *tmppath, char *filename) {
60
	char *p;
61

62
	p = tmppath;
63
	/* strip leading path separators */
64
	while (*tmppath == DIR_SEPARATOR){
65
		strcpy((char *) tmppath, (char *) tmppath + 1);
66
	}
67
	while (*(p++));
68
	p--;
69
	while (p > tmppath && *p != DIR_SEPARATOR) {
70
		p--;
71
	}
72

73
	if (*p == DIR_SEPARATOR) {
74
		p++;
75
	}
76

77
	return;
78
}
79

80
void fat_set_filetime(struct fat_dirent *de) {
81
	/* TODO set normal time */
82
		de->crttime_l = 0x20;	/* 01:01:00am, Jan 1, 2006. */
83
		de->crttime_h = 0x08;
84
		de->crtdate_l = 0x11;
85
		de->crtdate_h = 0x34;
86
		de->lstaccdate_l = 0x11;
87
		de->lstaccdate_h = 0x34;
88
		de->wrttime_l = 0x20;
89
		de->wrttime_h = 0x08;
90
		de->wrtdate_l = 0x11;
91
		de->wrtdate_h = 0x34;
92
}
93

94
/*
95
 *	Convert a filename element from canonical (8.3) to directory entry (11)
96
 *	form src must point to the first non-separator character.
97
 *	dest must point to a 12-byte buffer.
98
 */
99
char *path_canonical_to_dir(char *dest, char *src) {
100

101
	memset(dest, (int)' ', MSDOS_NAME);
102
	dest[MSDOS_NAME] = 0;
103

104
	for (int i = 0; i <= 11; i++) {
105
		if (!*src) {
106
			break;
107
		}
108
		if (*src == '/') {
109
			break;
110
		}
111
		if (*src == '.') {
112
			i = 7;
113
			src++;
114
			continue;
115
		}
116
		if (*src >= 'a' && *src <='z') {
117
			*(dest + i) = (*src - 'a') + 'A';
118
		} else {
119
			*(dest + i) = *src;
120
		}
121
		src++;
122
	}
123

124
	return dest;
125
}
126

127
/*
128
 *	Convert a filename element from directory entry (11) to canonical (8.3)
129
 */
130
char *path_dir_to_canonical(char *dest, char *src, char dir) {
131
        int i;
132
        char *dst;
133

134
        dst = dest;
135
        memset(dest, 0, MSDOS_NAME + 2);
136
        for (i = 0; i < 8; i++) {
137
			if (*src != ' ') {
138
				*dst = *src;
139
				if (*dst >= 'A' && *dst <='Z') {
140
					*dst = (*dst - 'A') + 'a';
141
				}
142
				dst++;
143
			}
144
			src++;
145
        }
146
        if ((*src != ' ') && (0 == dir)) {
147
        	*dst++ = '.';
148
        }
149
        for (i = 0; i < 3; i++) {
150
			if (*src != ' ') {
151
				*dst = *src;
152
				if (*dst >= 'A' && *dst <='Z') {
153
					*dst = (*dst - 'A') + 'a';
154
				}
155
				dst++;
156
			}
157
			src++;
158
        }
159
        return dest;
160
}
161

162

163

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.