summaryrefslogtreecommitdiff
path: root/compat/precompose_utf8.h
blob: d70b84665c61faee9e1fe1197c1fe61788d2afb2 (plain)
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
#ifndef PRECOMPOSE_UNICODE_H
#define PRECOMPOSE_UNICODE_H
 
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>
#include <iconv.h>
 
 
typedef struct dirent_prec_psx {
	ino_t d_ino;            /* Posix */
	size_t max_name_len;    /* See below */
	unsigned char d_type;   /* available on all systems git runs on */
 
	/*
	 * See http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/dirent.h.html
	 * NAME_MAX + 1 should be enough, but some systems have
	 * NAME_MAX=255 and strlen(d_name) may return 508 or 510
	 * Solution: allocate more when needed, see precompose_utf8_readdir()
	 */
	char   d_name[NAME_MAX+1];
} dirent_prec_psx;
 
 
typedef struct {
	iconv_t ic_precompose;
	DIR *dirp;
	struct dirent_prec_psx *dirent_nfc;
} PREC_DIR;
 
const char *precompose_argv_prefix(int argc, const char **argv, const char *prefix);
void probe_utf8_pathname_composition(void);
 
PREC_DIR *precompose_utf8_opendir(const char *dirname);
struct dirent_prec_psx *precompose_utf8_readdir(PREC_DIR *dirp);
int precompose_utf8_closedir(PREC_DIR *dirp);
 
#ifndef PRECOMPOSE_UNICODE_C
#define dirent dirent_prec_psx
#define opendir(n) precompose_utf8_opendir(n)
#define readdir(d) precompose_utf8_readdir(d)
#define closedir(d) precompose_utf8_closedir(d)
#define DIR PREC_DIR
#endif /* PRECOMPOSE_UNICODE_C */
 
#endif /* PRECOMPOSE_UNICODE_H */