rugged 0.21.2 → 0.21.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/rugged/version.rb +1 -1
- data/vendor/libgit2/include/git2/version.h +2 -2
- data/vendor/libgit2/src/checkout.c +27 -1
- data/vendor/libgit2/src/config_cache.c +2 -0
- data/vendor/libgit2/src/index.c +48 -25
- data/vendor/libgit2/src/path.c +256 -0
- data/vendor/libgit2/src/path.h +43 -0
- data/vendor/libgit2/src/refdb_fs.c +11 -1
- data/vendor/libgit2/src/repository.c +25 -0
- data/vendor/libgit2/src/repository.h +25 -1
- data/vendor/libgit2/src/tree.c +1 -1
- data/vendor/libgit2/src/util.c +91 -0
- data/vendor/libgit2/src/util.h +12 -0
- data/vendor/libgit2/src/win32/findfile.c +1 -0
- data/vendor/libgit2/src/win32/path_w32.c +305 -0
- data/vendor/libgit2/src/win32/path_w32.h +80 -0
- data/vendor/libgit2/src/win32/posix.h +1 -0
- data/vendor/libgit2/src/win32/posix_w32.c +25 -42
- data/vendor/libgit2/src/win32/utf-conv.c +36 -6
- data/vendor/libgit2/src/win32/utf-conv.h +0 -39
- data/vendor/libgit2/src/win32/w32_util.h +1 -0
- metadata +4 -2
@@ -0,0 +1,80 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (C) the libgit2 contributors. All rights reserved.
|
3
|
+
*
|
4
|
+
* This file is part of libgit2, distributed under the GNU GPL v2 with
|
5
|
+
* a Linking Exception. For full terms see the included COPYING file.
|
6
|
+
*/
|
7
|
+
#ifndef INCLUDE_git_path_w32_h__
|
8
|
+
#define INCLUDE_git_path_w32_h__
|
9
|
+
|
10
|
+
/*
|
11
|
+
* Provides a large enough buffer to support Windows paths: MAX_PATH is
|
12
|
+
* 260, corresponding to a maximum path length of 259 characters plus a
|
13
|
+
* NULL terminator. Prefixing with "\\?\" adds 4 characters, but if the
|
14
|
+
* original was a UNC path, then we turn "\\server\share" into
|
15
|
+
* "\\?\UNC\server\share". So we replace the first two characters with
|
16
|
+
* 8 characters, a net gain of 6, so the maximum length is MAX_PATH+6.
|
17
|
+
*/
|
18
|
+
#define GIT_WIN_PATH_UTF16 MAX_PATH+6
|
19
|
+
|
20
|
+
/* Maximum size of a UTF-8 Win32 path. We remove the "\\?\" or "\\?\UNC\"
|
21
|
+
* prefixes for presentation, bringing us back to 259 (non-NULL)
|
22
|
+
* characters. UTF-8 does have 4-byte sequences, but they are encoded in
|
23
|
+
* UTF-16 using surrogate pairs, which takes up the space of two characters.
|
24
|
+
* Two characters in the range U+0800 -> U+FFFF take up more space in UTF-8
|
25
|
+
* (6 bytes) than one surrogate pair (4 bytes).
|
26
|
+
*/
|
27
|
+
#define GIT_WIN_PATH_UTF8 (259 * 3 + 1)
|
28
|
+
|
29
|
+
/*
|
30
|
+
* The length of a Windows "shortname", for 8.3 compatibility.
|
31
|
+
*/
|
32
|
+
#define GIT_WIN_PATH_SHORTNAME 13
|
33
|
+
|
34
|
+
/* Win32 path types */
|
35
|
+
typedef wchar_t git_win32_path[GIT_WIN_PATH_UTF16];
|
36
|
+
typedef char git_win32_utf8_path[GIT_WIN_PATH_UTF8];
|
37
|
+
|
38
|
+
/**
|
39
|
+
* Create a Win32 path (in UCS-2 format) from a UTF-8 string.
|
40
|
+
*
|
41
|
+
* @param dest The buffer to receive the wide string.
|
42
|
+
* @param src The UTF-8 string to convert.
|
43
|
+
* @return The length of the wide string, in characters (not counting the NULL terminator), or < 0 for failure
|
44
|
+
*/
|
45
|
+
extern int git_win32_path_from_utf8(git_win32_path dest, const char *src);
|
46
|
+
|
47
|
+
/**
|
48
|
+
* Canonicalize a Win32 UCS-2 path so that it is suitable for delivery to the
|
49
|
+
* Win32 APIs: remove multiple directory separators, squashing to a single one,
|
50
|
+
* strip trailing directory separators, ensure directory separators are all
|
51
|
+
* canonical (always backslashes, never forward slashes) and process any
|
52
|
+
* directory entries of '.' or '..'.
|
53
|
+
*
|
54
|
+
* This processes the buffer in place.
|
55
|
+
*
|
56
|
+
* @param path The buffer to process
|
57
|
+
* @return The new length of the buffer, in wchar_t's (not counting the NULL terminator)
|
58
|
+
*/
|
59
|
+
extern int git_win32_path_canonicalize(git_win32_path path);
|
60
|
+
|
61
|
+
/**
|
62
|
+
* Create an internal format (posix-style) UTF-8 path from a Win32 UCS-2 path.
|
63
|
+
*
|
64
|
+
* @param dest The buffer to receive the UTF-8 string.
|
65
|
+
* @param src The wide string to convert.
|
66
|
+
* @return The length of the UTF-8 string, in bytes (not counting the NULL terminator), or < 0 for failure
|
67
|
+
*/
|
68
|
+
extern int git_win32_path_to_utf8(git_win32_utf8_path dest, const wchar_t *src);
|
69
|
+
|
70
|
+
/**
|
71
|
+
* Get the short name for the terminal path component in the given path.
|
72
|
+
* For example, given "C:\Foo\Bar\Asdf.txt", this will return the short name
|
73
|
+
* for the file "Asdf.txt".
|
74
|
+
*
|
75
|
+
* @param path The given path in UTF-8
|
76
|
+
* @return The name of the shortname for the given path
|
77
|
+
*/
|
78
|
+
extern char *git_win32_path_8dot3_name(const char *path);
|
79
|
+
|
80
|
+
#endif
|
@@ -7,6 +7,7 @@
|
|
7
7
|
#include "../posix.h"
|
8
8
|
#include "../fileops.h"
|
9
9
|
#include "path.h"
|
10
|
+
#include "path_w32.h"
|
10
11
|
#include "utf-conv.h"
|
11
12
|
#include "repository.h"
|
12
13
|
#include "reparse.h"
|
@@ -31,29 +32,13 @@
|
|
31
32
|
/* GetFinalPathNameByHandleW signature */
|
32
33
|
typedef DWORD(WINAPI *PFGetFinalPathNameByHandleW)(HANDLE, LPWSTR, DWORD, DWORD);
|
33
34
|
|
34
|
-
/* Helper function which converts UTF-8 paths to UTF-16.
|
35
|
-
* On failure, errno is set. */
|
36
|
-
static int utf8_to_16_with_errno(git_win32_path dest, const char *src)
|
37
|
-
{
|
38
|
-
int len = git_win32_path_from_utf8(dest, src);
|
39
|
-
|
40
|
-
if (len < 0) {
|
41
|
-
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
|
42
|
-
errno = ENAMETOOLONG;
|
43
|
-
else
|
44
|
-
errno = EINVAL; /* Bad code point, presumably */
|
45
|
-
}
|
46
|
-
|
47
|
-
return len;
|
48
|
-
}
|
49
|
-
|
50
35
|
int p_mkdir(const char *path, mode_t mode)
|
51
36
|
{
|
52
37
|
git_win32_path buf;
|
53
38
|
|
54
39
|
GIT_UNUSED(mode);
|
55
40
|
|
56
|
-
if (
|
41
|
+
if (git_win32_path_from_utf8(buf, path) < 0)
|
57
42
|
return -1;
|
58
43
|
|
59
44
|
return _wmkdir(buf);
|
@@ -64,7 +49,7 @@ int p_unlink(const char *path)
|
|
64
49
|
git_win32_path buf;
|
65
50
|
int error;
|
66
51
|
|
67
|
-
if (
|
52
|
+
if (git_win32_path_from_utf8(buf, path) < 0)
|
68
53
|
return -1;
|
69
54
|
|
70
55
|
error = _wunlink(buf);
|
@@ -271,7 +256,7 @@ static int do_lstat(const char *path, struct stat *buf, bool posixly_correct)
|
|
271
256
|
git_win32_path path_w;
|
272
257
|
int len;
|
273
258
|
|
274
|
-
if ((len =
|
259
|
+
if ((len = git_win32_path_from_utf8(path_w, path)) < 0)
|
275
260
|
return -1;
|
276
261
|
|
277
262
|
git_win32__path_trim_end(path_w, len);
|
@@ -302,7 +287,7 @@ int p_readlink(const char *path, char *buf, size_t bufsiz)
|
|
302
287
|
* could occur in the middle of the encoding of a code point,
|
303
288
|
* we need to buffer the result on the stack. */
|
304
289
|
|
305
|
-
if (
|
290
|
+
if (git_win32_path_from_utf8(path_w, path) < 0 ||
|
306
291
|
readlink_w(target_w, path_w) < 0 ||
|
307
292
|
(len = git_win32_path_to_utf8(target, target_w)) < 0)
|
308
293
|
return -1;
|
@@ -326,7 +311,7 @@ int p_open(const char *path, int flags, ...)
|
|
326
311
|
git_win32_path buf;
|
327
312
|
mode_t mode = 0;
|
328
313
|
|
329
|
-
if (
|
314
|
+
if (git_win32_path_from_utf8(buf, path) < 0)
|
330
315
|
return -1;
|
331
316
|
|
332
317
|
if (flags & O_CREAT) {
|
@@ -344,7 +329,7 @@ int p_creat(const char *path, mode_t mode)
|
|
344
329
|
{
|
345
330
|
git_win32_path buf;
|
346
331
|
|
347
|
-
if (
|
332
|
+
if (git_win32_path_from_utf8(buf, path) < 0)
|
348
333
|
return -1;
|
349
334
|
|
350
335
|
return _wopen(buf, _O_WRONLY | _O_CREAT | _O_TRUNC | STANDARD_OPEN_FLAGS, mode);
|
@@ -442,7 +427,7 @@ int p_stat(const char* path, struct stat* buf)
|
|
442
427
|
git_win32_path path_w;
|
443
428
|
int len;
|
444
429
|
|
445
|
-
if ((len =
|
430
|
+
if ((len = git_win32_path_from_utf8(path_w, path)) < 0)
|
446
431
|
return -1;
|
447
432
|
|
448
433
|
git_win32__path_trim_end(path_w, len);
|
@@ -462,7 +447,7 @@ int p_chdir(const char* path)
|
|
462
447
|
{
|
463
448
|
git_win32_path buf;
|
464
449
|
|
465
|
-
if (
|
450
|
+
if (git_win32_path_from_utf8(buf, path) < 0)
|
466
451
|
return -1;
|
467
452
|
|
468
453
|
return _wchdir(buf);
|
@@ -472,7 +457,7 @@ int p_chmod(const char* path, mode_t mode)
|
|
472
457
|
{
|
473
458
|
git_win32_path buf;
|
474
459
|
|
475
|
-
if (
|
460
|
+
if (git_win32_path_from_utf8(buf, path) < 0)
|
476
461
|
return -1;
|
477
462
|
|
478
463
|
return _wchmod(buf, mode);
|
@@ -483,7 +468,7 @@ int p_rmdir(const char* path)
|
|
483
468
|
git_win32_path buf;
|
484
469
|
int error;
|
485
470
|
|
486
|
-
if (
|
471
|
+
if (git_win32_path_from_utf8(buf, path) < 0)
|
487
472
|
return -1;
|
488
473
|
|
489
474
|
error = _wrmdir(buf);
|
@@ -512,7 +497,7 @@ char *p_realpath(const char *orig_path, char *buffer)
|
|
512
497
|
{
|
513
498
|
git_win32_path orig_path_w, buffer_w;
|
514
499
|
|
515
|
-
if (
|
500
|
+
if (git_win32_path_from_utf8(orig_path_w, orig_path) < 0)
|
516
501
|
return NULL;
|
517
502
|
|
518
503
|
/* Note that if the path provided is a relative path, then the current directory
|
@@ -533,20 +518,17 @@ char *p_realpath(const char *orig_path, char *buffer)
|
|
533
518
|
return NULL;
|
534
519
|
}
|
535
520
|
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
* characters in size. If it isn't, then we may overflow. */
|
540
|
-
if (git__utf16_to_8(buffer, GIT_WIN_PATH_UTF8, buffer_w) < 0)
|
541
|
-
return NULL;
|
542
|
-
} else {
|
543
|
-
/* If the caller did not provide a buffer, then we allocate one for the caller
|
544
|
-
* from the heap. */
|
545
|
-
if (git__utf16_to_8_alloc(&buffer, buffer_w) < 0)
|
546
|
-
return NULL;
|
521
|
+
if (!buffer && !(buffer = git__malloc(GIT_WIN_PATH_UTF8))) {
|
522
|
+
errno = ENOMEM;
|
523
|
+
return NULL;
|
547
524
|
}
|
548
525
|
|
549
|
-
/* Convert
|
526
|
+
/* Convert the path to UTF-8. If the caller provided a buffer, then it
|
527
|
+
* is assumed to be GIT_WIN_PATH_UTF8 characters in size. If it isn't,
|
528
|
+
* then we may overflow. */
|
529
|
+
if (git_win32_path_to_utf8(buffer, buffer_w) < 0)
|
530
|
+
return NULL;
|
531
|
+
|
550
532
|
git_path_mkposix(buffer);
|
551
533
|
|
552
534
|
return buffer;
|
@@ -579,6 +561,7 @@ int p_snprintf(char *buffer, size_t count, const char *format, ...)
|
|
579
561
|
return r;
|
580
562
|
}
|
581
563
|
|
564
|
+
/* TODO: wut? */
|
582
565
|
int p_mkstemp(char *tmp_path)
|
583
566
|
{
|
584
567
|
#if defined(_MSC_VER)
|
@@ -596,7 +579,7 @@ int p_access(const char* path, mode_t mode)
|
|
596
579
|
{
|
597
580
|
git_win32_path buf;
|
598
581
|
|
599
|
-
if (
|
582
|
+
if (git_win32_path_from_utf8(buf, path) < 0)
|
600
583
|
return -1;
|
601
584
|
|
602
585
|
return _waccess(buf, mode);
|
@@ -610,8 +593,8 @@ int p_rename(const char *from, const char *to)
|
|
610
593
|
int rename_succeeded;
|
611
594
|
int error;
|
612
595
|
|
613
|
-
if (
|
614
|
-
|
596
|
+
if (git_win32_path_from_utf8(wfrom, from) < 0 ||
|
597
|
+
git_win32_path_from_utf8(wto, to) < 0)
|
615
598
|
return -1;
|
616
599
|
|
617
600
|
/* wait up to 50ms if file is locked by another thread or process */
|
@@ -26,6 +26,14 @@ GIT_INLINE(DWORD) get_wc_flags(void)
|
|
26
26
|
return flags;
|
27
27
|
}
|
28
28
|
|
29
|
+
GIT_INLINE(void) git__set_errno(void)
|
30
|
+
{
|
31
|
+
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
|
32
|
+
errno = ENAMETOOLONG;
|
33
|
+
else
|
34
|
+
errno = EINVAL;
|
35
|
+
}
|
36
|
+
|
29
37
|
/**
|
30
38
|
* Converts a UTF-8 string to wide characters.
|
31
39
|
*
|
@@ -36,10 +44,15 @@ GIT_INLINE(DWORD) get_wc_flags(void)
|
|
36
44
|
*/
|
37
45
|
int git__utf8_to_16(wchar_t *dest, size_t dest_size, const char *src)
|
38
46
|
{
|
47
|
+
int len;
|
48
|
+
|
39
49
|
/* Length of -1 indicates NULL termination of the input string. Subtract 1 from the result to
|
40
50
|
* turn 0 into -1 (an error code) and to not count the NULL terminator as part of the string's
|
41
51
|
* length. MultiByteToWideChar never returns int's minvalue, so underflow is not possible */
|
42
|
-
|
52
|
+
if ((len = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, src, -1, dest, (int)dest_size) - 1) < 0)
|
53
|
+
git__set_errno();
|
54
|
+
|
55
|
+
return len;
|
43
56
|
}
|
44
57
|
|
45
58
|
/**
|
@@ -52,10 +65,15 @@ int git__utf8_to_16(wchar_t *dest, size_t dest_size, const char *src)
|
|
52
65
|
*/
|
53
66
|
int git__utf16_to_8(char *dest, size_t dest_size, const wchar_t *src)
|
54
67
|
{
|
68
|
+
int len;
|
69
|
+
|
55
70
|
/* Length of -1 indicates NULL termination of the input string. Subtract 1 from the result to
|
56
71
|
* turn 0 into -1 (an error code) and to not count the NULL terminator as part of the string's
|
57
72
|
* length. WideCharToMultiByte never returns int's minvalue, so underflow is not possible */
|
58
|
-
|
73
|
+
if ((len = WideCharToMultiByte(CP_UTF8, get_wc_flags(), src, -1, dest, (int)dest_size, NULL, NULL) - 1) < 0)
|
74
|
+
git__set_errno();
|
75
|
+
|
76
|
+
return len;
|
59
77
|
}
|
60
78
|
|
61
79
|
/**
|
@@ -76,17 +94,23 @@ int git__utf8_to_16_alloc(wchar_t **dest, const char *src)
|
|
76
94
|
/* Length of -1 indicates NULL termination of the input string */
|
77
95
|
utf16_size = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, src, -1, NULL, 0);
|
78
96
|
|
79
|
-
if (!utf16_size)
|
97
|
+
if (!utf16_size) {
|
98
|
+
git__set_errno();
|
80
99
|
return -1;
|
100
|
+
}
|
81
101
|
|
82
102
|
*dest = git__malloc(utf16_size * sizeof(wchar_t));
|
83
103
|
|
84
|
-
if (!*dest)
|
104
|
+
if (!*dest) {
|
105
|
+
errno = ENOMEM;
|
85
106
|
return -1;
|
107
|
+
}
|
86
108
|
|
87
109
|
utf16_size = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, src, -1, *dest, utf16_size);
|
88
110
|
|
89
111
|
if (!utf16_size) {
|
112
|
+
git__set_errno();
|
113
|
+
|
90
114
|
git__free(*dest);
|
91
115
|
*dest = NULL;
|
92
116
|
}
|
@@ -116,17 +140,23 @@ int git__utf16_to_8_alloc(char **dest, const wchar_t *src)
|
|
116
140
|
/* Length of -1 indicates NULL termination of the input string */
|
117
141
|
utf8_size = WideCharToMultiByte(CP_UTF8, dwFlags, src, -1, NULL, 0, NULL, NULL);
|
118
142
|
|
119
|
-
if (!utf8_size)
|
143
|
+
if (!utf8_size) {
|
144
|
+
git__set_errno();
|
120
145
|
return -1;
|
146
|
+
}
|
121
147
|
|
122
148
|
*dest = git__malloc(utf8_size);
|
123
149
|
|
124
|
-
if (!*dest)
|
150
|
+
if (!*dest) {
|
151
|
+
errno = ENOMEM;
|
125
152
|
return -1;
|
153
|
+
}
|
126
154
|
|
127
155
|
utf8_size = WideCharToMultiByte(CP_UTF8, dwFlags, src, -1, *dest, utf8_size, NULL, NULL);
|
128
156
|
|
129
157
|
if (!utf8_size) {
|
158
|
+
git__set_errno();
|
159
|
+
|
130
160
|
git__free(*dest);
|
131
161
|
*dest = NULL;
|
132
162
|
}
|
@@ -10,21 +10,6 @@
|
|
10
10
|
#include <wchar.h>
|
11
11
|
#include "common.h"
|
12
12
|
|
13
|
-
/* Equal to the Win32 MAX_PATH constant. The maximum path length is 259
|
14
|
-
* characters plus a NULL terminator. */
|
15
|
-
#define GIT_WIN_PATH_UTF16 260
|
16
|
-
|
17
|
-
/* Maximum size of a UTF-8 Win32 path. UTF-8 does have 4-byte sequences,
|
18
|
-
* but they are encoded in UTF-16 using surrogate pairs, which takes up
|
19
|
-
* the space of two characters. Two characters in the range U+0800 ->
|
20
|
-
* U+FFFF take up more space in UTF-8 (6 bytes) than one surrogate pair
|
21
|
-
* (4 bytes). */
|
22
|
-
#define GIT_WIN_PATH_UTF8 (259 * 3 + 1)
|
23
|
-
|
24
|
-
/* Win32 path types */
|
25
|
-
typedef wchar_t git_win32_path[GIT_WIN_PATH_UTF16];
|
26
|
-
typedef char git_win32_utf8_path[GIT_WIN_PATH_UTF8];
|
27
|
-
|
28
13
|
/**
|
29
14
|
* Converts a UTF-8 string to wide characters.
|
30
15
|
*
|
@@ -67,28 +52,4 @@ int git__utf8_to_16_alloc(wchar_t **dest, const char *src);
|
|
67
52
|
*/
|
68
53
|
int git__utf16_to_8_alloc(char **dest, const wchar_t *src);
|
69
54
|
|
70
|
-
/**
|
71
|
-
* Converts a UTF-8 Win32 path to wide characters.
|
72
|
-
*
|
73
|
-
* @param dest The buffer to receive the wide string.
|
74
|
-
* @param src The UTF-8 string to convert.
|
75
|
-
* @return The length of the wide string, in characters (not counting the NULL terminator), or < 0 for failure
|
76
|
-
*/
|
77
|
-
GIT_INLINE(int) git_win32_path_from_utf8(git_win32_path dest, const char *src)
|
78
|
-
{
|
79
|
-
return git__utf8_to_16(dest, GIT_WIN_PATH_UTF16, src);
|
80
|
-
}
|
81
|
-
|
82
|
-
/**
|
83
|
-
* Converts a wide Win32 path to UTF-8.
|
84
|
-
*
|
85
|
-
* @param dest The buffer to receive the UTF-8 string.
|
86
|
-
* @param src The wide string to convert.
|
87
|
-
* @return The length of the UTF-8 string, in bytes (not counting the NULL terminator), or < 0 for failure
|
88
|
-
*/
|
89
|
-
GIT_INLINE(int) git_win32_path_to_utf8(git_win32_utf8_path dest, const wchar_t *src)
|
90
|
-
{
|
91
|
-
return git__utf16_to_8(dest, GIT_WIN_PATH_UTF8, src);
|
92
|
-
}
|
93
|
-
|
94
55
|
#endif
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rugged
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.21.
|
4
|
+
version: 0.21.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Scott Chacon
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-12-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake-compiler
|
@@ -427,6 +427,8 @@ files:
|
|
427
427
|
- vendor/libgit2/src/win32/map.c
|
428
428
|
- vendor/libgit2/src/win32/mingw-compat.h
|
429
429
|
- vendor/libgit2/src/win32/msvc-compat.h
|
430
|
+
- vendor/libgit2/src/win32/path_w32.c
|
431
|
+
- vendor/libgit2/src/win32/path_w32.h
|
430
432
|
- vendor/libgit2/src/win32/posix.h
|
431
433
|
- vendor/libgit2/src/win32/posix_w32.c
|
432
434
|
- vendor/libgit2/src/win32/precompiled.c
|