mirror of
https://git.savannah.gnu.org/git/coreutils.git
synced 2025-09-10 07:59:52 +02:00
Compare commits
2045 Commits
FILEUTILS-
...
FILEUTILS-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5d2bbddf97 | ||
|
|
6dda2aaa52 | ||
|
|
3fa1d4bb24 | ||
|
|
1c84606b56 | ||
|
|
b1b273f24f | ||
|
|
e211d3960f | ||
|
|
9282f5f8a6 | ||
|
|
1d2074e02a | ||
|
|
8dce8df49a | ||
|
|
4d4b2c8e5e | ||
|
|
a72bab1a32 | ||
|
|
affbb977af | ||
|
|
aa1c5467ec | ||
|
|
435fa5a7dd | ||
|
|
b7441176e3 | ||
|
|
f3c14cb59f | ||
|
|
8ba97d963e | ||
|
|
223e88f957 | ||
|
|
83d4b736d2 | ||
|
|
257c5c4737 | ||
|
|
391c960cba | ||
|
|
62f208d493 | ||
|
|
60ae0b81a5 | ||
|
|
09d344df5b | ||
|
|
43f4099c95 | ||
|
|
476cb02516 | ||
|
|
159788fcca | ||
|
|
f32dc5a2b0 | ||
|
|
ea7102f120 | ||
|
|
41ef62c472 | ||
|
|
26d5ce2f26 | ||
|
|
868ed3b0af | ||
|
|
6552bb980b | ||
|
|
79a6760fe4 | ||
|
|
531453d901 | ||
|
|
1d94869663 | ||
|
|
ce195c7a07 | ||
|
|
09a2261919 | ||
|
|
c5eb9edf26 | ||
|
|
dd9470cb58 | ||
|
|
02fc5fa0d0 | ||
|
|
b62793b100 | ||
|
|
c7af539321 | ||
|
|
e989012b57 | ||
|
|
7aeda9a4d3 | ||
|
|
d51682ef43 | ||
|
|
ab869ed00e | ||
|
|
73ab48d4e7 | ||
|
|
73e6d60538 | ||
|
|
032aecf5e7 | ||
|
|
8f3524de4a | ||
|
|
439fdff851 | ||
|
|
933b990ab9 | ||
|
|
ae965a958a | ||
|
|
214ee5aecd | ||
|
|
4dc12acc27 | ||
|
|
a92dd43b7c | ||
|
|
d2698caef3 | ||
|
|
db8fe3cf1f | ||
|
|
664ba0841c | ||
|
|
26d84b6c70 | ||
|
|
70c8aaf873 | ||
|
|
182a1780ac | ||
|
|
cf430d3590 | ||
|
|
6ae99a4290 | ||
|
|
c76172fbb0 | ||
|
|
dd040b917a | ||
|
|
4ec1fad4e7 | ||
|
|
9d9fef5595 | ||
|
|
6fd3c331ba | ||
|
|
9b989298f4 | ||
|
|
07507c07da | ||
|
|
c96968a2a3 | ||
|
|
a3e1200b4a | ||
|
|
2b2424aab8 | ||
|
|
994c3c82ef | ||
|
|
dfc86db1cc | ||
|
|
162f6824cf | ||
|
|
feccdc6c58 | ||
|
|
2f617e52d6 | ||
|
|
d200f4974b | ||
|
|
de45950430 | ||
|
|
4d95aa356f | ||
|
|
d82af243b1 | ||
|
|
2781ec69b7 | ||
|
|
4a9222e0c2 | ||
|
|
84c104b6da | ||
|
|
500594433a | ||
|
|
ed1fdb8841 | ||
|
|
5d59e18618 | ||
|
|
94ff35fc2d | ||
|
|
dc6658157d | ||
|
|
36fc028151 | ||
|
|
6db9dc96d3 | ||
|
|
7af859841f | ||
|
|
dcfb3e037a | ||
|
|
bc63f10b59 | ||
|
|
ce42a622b2 | ||
|
|
5cd15e8abb | ||
|
|
c685d1c4cb | ||
|
|
cc13b3d81f | ||
|
|
f23d890626 | ||
|
|
e7976515e2 | ||
|
|
25485fa497 | ||
|
|
ab4ea710f1 | ||
|
|
39f78131e2 | ||
|
|
75637a7ef4 | ||
|
|
9e1c89c38e | ||
|
|
c726bc5709 | ||
|
|
585b65b676 | ||
|
|
b815641481 | ||
|
|
84d222f735 | ||
|
|
001e1b4302 | ||
|
|
dd2934197b | ||
|
|
ad174925d9 | ||
|
|
2aacc55e9b | ||
|
|
6f050de759 | ||
|
|
45d32cef80 | ||
|
|
3f51edcdec | ||
|
|
59c9c4036b | ||
|
|
ef2860263b | ||
|
|
d6b76c3f75 | ||
|
|
efa242bee1 | ||
|
|
8ea818e214 | ||
|
|
9bd57c9f22 | ||
|
|
0d457a6aee | ||
|
|
2722883a87 | ||
|
|
8105878c15 | ||
|
|
231c5aec0f | ||
|
|
e4e242e839 | ||
|
|
da8b83f81a | ||
|
|
df610e05ba | ||
|
|
9dab634c13 | ||
|
|
e5154f74b1 | ||
|
|
67786e0fb6 | ||
|
|
c84011e059 | ||
|
|
e36f49348b | ||
|
|
e786c1a0eb | ||
|
|
c057d35836 | ||
|
|
d9b628359a | ||
|
|
29b1eab1af | ||
|
|
9abd463ffb | ||
|
|
b54c86e8bc | ||
|
|
b885f7cbca | ||
|
|
7006d5fed6 | ||
|
|
976664803c | ||
|
|
3fdd4e6cd2 | ||
|
|
42755ceb62 | ||
|
|
8f03befb52 | ||
|
|
78af2f9732 | ||
|
|
88b4a9a940 | ||
|
|
045ebed00c | ||
|
|
24a7456cc0 | ||
|
|
b17e1af41c | ||
|
|
349b13e33a | ||
|
|
7b1d31a9b1 | ||
|
|
085866c1a3 | ||
|
|
4f75855c2e | ||
|
|
d649910685 | ||
|
|
e3e1698c6b | ||
|
|
b49e060cda | ||
|
|
e769659852 | ||
|
|
33d7cba8a7 | ||
|
|
65b2d6c97e | ||
|
|
2f3c1a3561 | ||
|
|
d8b68fc0c5 | ||
|
|
06ffb13ff0 | ||
|
|
3e62291a3c | ||
|
|
10972f68e8 | ||
|
|
15aac9a45d | ||
|
|
43fd950ef9 | ||
|
|
6c4002b2b5 | ||
|
|
816ee7dc0d | ||
|
|
916c762152 | ||
|
|
0d7fe8a4de | ||
|
|
841c6fbfe0 | ||
|
|
859bfc78b1 | ||
|
|
21ae3d911c | ||
|
|
4520ff31e2 | ||
|
|
92ce634177 | ||
|
|
6d89cf5f12 | ||
|
|
83a4462018 | ||
|
|
2b416bd83e | ||
|
|
96ab6a541a | ||
|
|
571a29d870 | ||
|
|
20f1f8b063 | ||
|
|
4e1e8c600d | ||
|
|
d816bb4f14 | ||
|
|
ce60ef7400 | ||
|
|
6e98d78fd4 | ||
|
|
2c5862c808 | ||
|
|
268db2760a | ||
|
|
0062e8f915 | ||
|
|
057743741f | ||
|
|
3f2774c8b4 | ||
|
|
3e0c559579 | ||
|
|
e7d6615b76 | ||
|
|
91df5bbc48 | ||
|
|
4cc5661b42 | ||
|
|
19a98e3edc | ||
|
|
50e17793c8 | ||
|
|
8a0a50e6b0 | ||
|
|
a42054dd57 | ||
|
|
24da56f990 | ||
|
|
d8e6937773 | ||
|
|
e1b2b2337d | ||
|
|
60c77b6c28 | ||
|
|
c7b3d3e91b | ||
|
|
60c1207b74 | ||
|
|
d344aaa129 | ||
|
|
83c2cfa04d | ||
|
|
53c7a54a58 | ||
|
|
e81bcd87cb | ||
|
|
10d98345b4 | ||
|
|
e17b601d5e | ||
|
|
f5d8ee465e | ||
|
|
51c06c49cf | ||
|
|
bbf4d37373 | ||
|
|
9bb85624cf | ||
|
|
9b5402ec48 | ||
|
|
77728e4f4b | ||
|
|
9db889c372 | ||
|
|
caace05438 | ||
|
|
cd7f8d6e9b | ||
|
|
bf598c02ba | ||
|
|
3954a4f441 | ||
|
|
506343b223 | ||
|
|
2f8dc98340 | ||
|
|
d015aad1f2 | ||
|
|
a99c3df843 | ||
|
|
e78bc7655d | ||
|
|
a519a07f25 | ||
|
|
02efcd60ed | ||
|
|
39e2377300 | ||
|
|
cda5bf9db9 | ||
|
|
27c8d53a3a | ||
|
|
3e7e7d0792 | ||
|
|
a5b0ca6f24 | ||
|
|
1f62fd20a3 | ||
|
|
254fc64f64 | ||
|
|
9dc7d5d2ae | ||
|
|
45af919ce6 | ||
|
|
89c9e683a3 | ||
|
|
d20d0fc27d | ||
|
|
5b7e895b65 | ||
|
|
2e97d27586 | ||
|
|
a155c3d684 | ||
|
|
3489f267a4 | ||
|
|
3fc7024e49 | ||
|
|
30b522371a | ||
|
|
88013e3cb4 | ||
|
|
7c8a2cdacf | ||
|
|
876f399d50 | ||
|
|
05ffec210e | ||
|
|
163f7f9c20 | ||
|
|
8fbf79b4e0 | ||
|
|
08b5c3046c | ||
|
|
551b879bf1 | ||
|
|
bd1eee0315 | ||
|
|
72f7eb4e63 | ||
|
|
fef313b2b0 | ||
|
|
464e2ce05d | ||
|
|
a48999494d | ||
|
|
d5d061ee9b | ||
|
|
b44e91e99d | ||
|
|
ce3668f3c1 | ||
|
|
44fa09dc5e | ||
|
|
808b938840 | ||
|
|
83d4d74a88 | ||
|
|
0d38a270a4 | ||
|
|
3f017c26ca | ||
|
|
4c946943ea | ||
|
|
7dd872d963 | ||
|
|
b7d50ca523 | ||
|
|
fe18d63a65 | ||
|
|
6668e39160 | ||
|
|
d738449858 | ||
|
|
7254d243f2 | ||
|
|
91da5cedc7 | ||
|
|
1187f5eb7f | ||
|
|
5bcc1fd7fd | ||
|
|
e4c9ae3c6b | ||
|
|
d1121fa4c0 | ||
|
|
713c315978 | ||
|
|
8cc46c2a18 | ||
|
|
518f85fc40 | ||
|
|
48990a9078 | ||
|
|
69a3ee0b49 | ||
|
|
8ed3137f52 | ||
|
|
d4257e63c7 | ||
|
|
7154d646cb | ||
|
|
b388203a65 | ||
|
|
66c7b3c41d | ||
|
|
ac7b3c4fa9 | ||
|
|
b402870080 | ||
|
|
1cbe202b0a | ||
|
|
d618576e0e | ||
|
|
51fe35760e | ||
|
|
8bbe8ab5d4 | ||
|
|
ba51843a2c | ||
|
|
397d9be228 | ||
|
|
dddfcab3b3 | ||
|
|
00ea94587f | ||
|
|
49875c1593 | ||
|
|
7b9c4d3d03 | ||
|
|
3783d6be57 | ||
|
|
632ebfa209 | ||
|
|
29cc8bf4f3 | ||
|
|
50892edd61 | ||
|
|
72193ba149 | ||
|
|
854b5197ad | ||
|
|
d90641d9d8 | ||
|
|
300be5a250 | ||
|
|
3911fadcf9 | ||
|
|
382ca69cec | ||
|
|
9fc10dc6c3 | ||
|
|
f0a8ebf596 | ||
|
|
53c085b7e5 | ||
|
|
faa759b349 | ||
|
|
398e92a2ec | ||
|
|
3483943ebc | ||
|
|
108b074aea | ||
|
|
19fcb4356c | ||
|
|
c4b7f217a5 | ||
|
|
cb04f85936 | ||
|
|
902bbe7707 | ||
|
|
c9a9ec9b53 | ||
|
|
840a08ccde | ||
|
|
5fbcd963df | ||
|
|
953c42bd52 | ||
|
|
765122f558 | ||
|
|
e46a424ce9 | ||
|
|
095c92bc46 | ||
|
|
7957dcc00a | ||
|
|
108f8f2d04 | ||
|
|
39463d50ed | ||
|
|
4a46351e06 | ||
|
|
8aca15bac0 | ||
|
|
1ddffff8c0 | ||
|
|
e7683a577a | ||
|
|
3063e56f2e | ||
|
|
eb3a4daa24 | ||
|
|
b6844f1931 | ||
|
|
a636450727 | ||
|
|
6456a7d8ac | ||
|
|
a57d5061ff | ||
|
|
45e8e5c550 | ||
|
|
69412999dc | ||
|
|
85b39cb589 | ||
|
|
9f358e6830 | ||
|
|
defb2bdef8 | ||
|
|
6e577f0b56 | ||
|
|
c157e5fbef | ||
|
|
ca6cf35a5e | ||
|
|
ede420f14a | ||
|
|
52a2ff839c | ||
|
|
821a0823b1 | ||
|
|
e52d8736b1 | ||
|
|
5c0ee776d4 | ||
|
|
465ebf7c37 | ||
|
|
18ad404d02 | ||
|
|
28cb02fc78 | ||
|
|
cbf0181378 | ||
|
|
bca2db9877 | ||
|
|
aa71be25c0 | ||
|
|
cd053a291e | ||
|
|
fa4148be50 | ||
|
|
5695f8ea2d | ||
|
|
18d159d47e | ||
|
|
0bb2acd9da | ||
|
|
7a8b4afa3e | ||
|
|
3a0352ad9a | ||
|
|
55569d4f9f | ||
|
|
eeef5c523d | ||
|
|
e8ab1c28f8 | ||
|
|
df4ba7d9ca | ||
|
|
e832812173 | ||
|
|
ac648dbc8a | ||
|
|
c75ccba2d3 | ||
|
|
a33adfebb2 | ||
|
|
b50b941826 | ||
|
|
6ec5bace8a | ||
|
|
b48e78e3b7 | ||
|
|
33179975d7 | ||
|
|
d4a8891aef | ||
|
|
fcbfefa513 | ||
|
|
fcf6405f2d | ||
|
|
0ecb6ace02 | ||
|
|
6d42c7e9d7 | ||
|
|
6684ffa826 | ||
|
|
bfbc3ce20c | ||
|
|
0f5f23cb9e | ||
|
|
93494dde07 | ||
|
|
be3b9520ad | ||
|
|
c2c6f081c5 | ||
|
|
36b10d9f21 | ||
|
|
72c0980585 | ||
|
|
58647fd63d | ||
|
|
6eb5e899e1 | ||
|
|
a01c762a81 | ||
|
|
c29025e6ed | ||
|
|
b3582e7533 | ||
|
|
12f49aa1ae | ||
|
|
f31f7e1c75 | ||
|
|
d34d42ca05 | ||
|
|
6974d67aa2 | ||
|
|
85d9447441 | ||
|
|
45c381f4ba | ||
|
|
184c0062a4 | ||
|
|
7024c7d55c | ||
|
|
d84a21ea2d | ||
|
|
2f6fa9d160 | ||
|
|
4ac374c8e5 | ||
|
|
17070ae7bf | ||
|
|
a1cc8f5961 | ||
|
|
27caa20d7b | ||
|
|
757555a4dc | ||
|
|
ada5e63612 | ||
|
|
a8d20df6b2 | ||
|
|
4a28ea9bd6 | ||
|
|
e4a1ead494 | ||
|
|
ad1a2f76ce | ||
|
|
a7a6111f81 | ||
|
|
7c579a0231 | ||
|
|
6630a24b7a | ||
|
|
6429ffabbb | ||
|
|
e558629ce1 | ||
|
|
fefa8511b8 | ||
|
|
347db9ce77 | ||
|
|
92da57a7be | ||
|
|
4078ae8de8 | ||
|
|
3086193091 | ||
|
|
823425b310 | ||
|
|
e03fc9bc82 | ||
|
|
64379c5cd8 | ||
|
|
d4825df6cf | ||
|
|
cb3b5ed486 | ||
|
|
7ee8ed7e37 | ||
|
|
a991132f3e | ||
|
|
7f0867df00 | ||
|
|
6354d07ea0 | ||
|
|
3216105fbb | ||
|
|
8d5c4784b8 | ||
|
|
ec47f73107 | ||
|
|
94cd0c09f6 | ||
|
|
db3440d444 | ||
|
|
e8bec0725e | ||
|
|
8598c54bb1 | ||
|
|
e457645eac | ||
|
|
a14303dbc9 | ||
|
|
84ad5c47c8 | ||
|
|
998b3a148c | ||
|
|
71ee764f1e | ||
|
|
07a6f7a9e2 | ||
|
|
0f5ca22215 | ||
|
|
fc50286759 | ||
|
|
0a1fd1d2ad | ||
|
|
7a04e95c62 | ||
|
|
938e7fe7ef | ||
|
|
d8ab75cedc | ||
|
|
650b182278 | ||
|
|
f31f7889fb | ||
|
|
b1f2e5a7fd | ||
|
|
34141257cf | ||
|
|
c96ef37ba9 | ||
|
|
ccc65c4a81 | ||
|
|
be5250f0ec | ||
|
|
d1c1677873 | ||
|
|
6eae430477 | ||
|
|
82d361dc53 | ||
|
|
6e05a13259 | ||
|
|
a1413ad1cd | ||
|
|
c9dd33ec3f | ||
|
|
b9a394eec5 | ||
|
|
f315b52ca9 | ||
|
|
26c02dd946 | ||
|
|
a03a97d7d8 | ||
|
|
ead1152ef8 | ||
|
|
2326be84d5 | ||
|
|
7980fa3b78 | ||
|
|
70a8ff09ed | ||
|
|
38a63c863e | ||
|
|
a4fb33a110 | ||
|
|
bd9a38183c | ||
|
|
45d85e3ba2 | ||
|
|
afa328c54e | ||
|
|
c66e967d70 | ||
|
|
ccaf565665 | ||
|
|
b1a82ad6f2 | ||
|
|
c9a2ec01e5 | ||
|
|
f7acc2f589 | ||
|
|
5bf77e1015 | ||
|
|
3aa15eac61 | ||
|
|
5799c6474d | ||
|
|
f8998dae41 | ||
|
|
a7ba2688ca | ||
|
|
6810b30f39 | ||
|
|
f8d66bde6a | ||
|
|
4675b67c10 | ||
|
|
ae3c7c2fb1 | ||
|
|
a3ff199f12 | ||
|
|
61ef81a837 | ||
|
|
dcb8db3c82 | ||
|
|
92b49f0da1 | ||
|
|
f322649c58 | ||
|
|
f49fee3e5f | ||
|
|
6dbc8ff80b | ||
|
|
65978b6328 | ||
|
|
5f8949c46c | ||
|
|
b302e2becc | ||
|
|
5921d6bc50 | ||
|
|
ec76108bb7 | ||
|
|
519365bb08 | ||
|
|
c1fc9dbe64 | ||
|
|
06b4686f8a | ||
|
|
5a244d2598 | ||
|
|
497a1e0c04 | ||
|
|
32ee7fb170 | ||
|
|
db7449461c | ||
|
|
9ed89c9d9c | ||
|
|
6110857115 | ||
|
|
36afcc383a | ||
|
|
9e7ca26738 | ||
|
|
de38f9c61f | ||
|
|
aa14b2d994 | ||
|
|
a6a3dee962 | ||
|
|
0324f8d422 | ||
|
|
5a9c4223f6 | ||
|
|
eeeb6c7b23 | ||
|
|
206e3f08de | ||
|
|
61a80b3a12 | ||
|
|
4da3feb0e9 | ||
|
|
a3d39ceb13 | ||
|
|
b252cc8d6d | ||
|
|
afac7f3a78 | ||
|
|
fae6846955 | ||
|
|
f79e8bdcaf | ||
|
|
ebfdc834f2 | ||
|
|
6e5ac55673 | ||
|
|
43d2406f55 | ||
|
|
29772527c8 | ||
|
|
4e72061130 | ||
|
|
470cfd9491 | ||
|
|
ff9a9a2bdf | ||
|
|
a3db75c4b3 | ||
|
|
46fb234f5f | ||
|
|
1e985af9d7 | ||
|
|
8ef38f80ec | ||
|
|
047f0c2125 | ||
|
|
a10c7fcd7c | ||
|
|
54a0879129 | ||
|
|
494d8173bd | ||
|
|
e8b739e317 | ||
|
|
ef4765e11b | ||
|
|
ca9451a39d | ||
|
|
1349c30df2 | ||
|
|
8659ec88d4 | ||
|
|
e27d21668c | ||
|
|
902598d05d | ||
|
|
fc026cd548 | ||
|
|
7d4a70eaff | ||
|
|
186958482f | ||
|
|
da80ee04d2 | ||
|
|
dd3a865a8e | ||
|
|
aaf66a2413 | ||
|
|
0eba2a8dd7 | ||
|
|
7c04ce1f09 | ||
|
|
7b4833b03c | ||
|
|
3a62f8785f | ||
|
|
85923cb2bc | ||
|
|
bc05ba3d5a | ||
|
|
ea2969da49 | ||
|
|
0966b97bd1 | ||
|
|
8c3fb79a89 | ||
|
|
fc68d2786b | ||
|
|
0d26afa6e0 | ||
|
|
bb964b3eec | ||
|
|
638776e577 | ||
|
|
0881032a16 | ||
|
|
c58c644f8f | ||
|
|
6e602a0232 | ||
|
|
097d40b3d3 | ||
|
|
57258b3446 | ||
|
|
39508b8db3 | ||
|
|
cd4c2d0fdc | ||
|
|
8a0550a816 | ||
|
|
663d8b143c | ||
|
|
2a1a1843b7 | ||
|
|
9c70563ee7 | ||
|
|
37ce5a5497 | ||
|
|
37a3052a36 | ||
|
|
2a4842f7f3 | ||
|
|
d82fadf365 | ||
|
|
ef63ce007d | ||
|
|
6a8e657775 | ||
|
|
309819620b | ||
|
|
f7bb262cc8 | ||
|
|
d5494d57f5 | ||
|
|
14a2593daf | ||
|
|
9cdd2e05e6 | ||
|
|
6cce6a1b7f | ||
|
|
d9f0ca41bd | ||
|
|
df7cef21c7 | ||
|
|
9f2d1beded | ||
|
|
ff59218d54 | ||
|
|
1a18272561 | ||
|
|
2bdf8621d6 | ||
|
|
758ab7a013 | ||
|
|
734d1cccc3 | ||
|
|
13de1036ac | ||
|
|
2167febcb1 | ||
|
|
2c11b736aa | ||
|
|
a52e0efbe2 | ||
|
|
4935348b67 | ||
|
|
e6a0306b1b | ||
|
|
2bec121abb | ||
|
|
412043f1d8 | ||
|
|
4ffa362cc4 | ||
|
|
35592ba64c | ||
|
|
c1618a8c4c | ||
|
|
96be8bca99 | ||
|
|
b8a16a3f2a | ||
|
|
f1217e4976 | ||
|
|
62279c6e2d | ||
|
|
71545a6276 | ||
|
|
53cfcbd19c | ||
|
|
5618133eed | ||
|
|
ade1f58e11 | ||
|
|
74cf3e8bab | ||
|
|
ca50e875af | ||
|
|
a75ea1014e | ||
|
|
98af2e9636 | ||
|
|
68e5877403 | ||
|
|
2b906615c2 | ||
|
|
443f852f61 | ||
|
|
d1f4e617b5 | ||
|
|
1aa070dd2e | ||
|
|
007e81132a | ||
|
|
6bcfff640e | ||
|
|
aa2880362c | ||
|
|
88bd90109b | ||
|
|
dba300a0d0 | ||
|
|
b9ed71e46e | ||
|
|
7bba3e945f | ||
|
|
1bdfcabd2c | ||
|
|
c88a4c91da | ||
|
|
136f2fd28c | ||
|
|
82739833a1 | ||
|
|
1c5c2597b5 | ||
|
|
eacbf12ea4 | ||
|
|
0ccdf3419d | ||
|
|
cec85a4b3a | ||
|
|
a077a7833c | ||
|
|
a3094b0529 | ||
|
|
d73dd15544 | ||
|
|
27c1ad9576 | ||
|
|
2eefbf7647 | ||
|
|
79d39ab7bf | ||
|
|
12782f54b0 | ||
|
|
fff6de7b04 | ||
|
|
cc76db2016 | ||
|
|
77c94909cf | ||
|
|
3b8d19272d | ||
|
|
6099914170 | ||
|
|
09d96ac539 | ||
|
|
3edbca0e04 | ||
|
|
c062a35803 | ||
|
|
3da029a5d9 | ||
|
|
de1dabf7d7 | ||
|
|
03283b5000 | ||
|
|
9f5dc7e7d0 | ||
|
|
ab9cd27938 | ||
|
|
c767a49741 | ||
|
|
0fdd1b9130 | ||
|
|
f19ca6fe29 | ||
|
|
6cc3cf776c | ||
|
|
e162abfc5b | ||
|
|
866773c72a | ||
|
|
06bab849fc | ||
|
|
ed0becde29 | ||
|
|
8d64a37a77 | ||
|
|
0520188821 | ||
|
|
05d9a7233b | ||
|
|
f664e44a2f | ||
|
|
5705eaaee2 | ||
|
|
0e69432852 | ||
|
|
2d69426882 | ||
|
|
5d4f8ebdfd | ||
|
|
b246280c27 | ||
|
|
60e021ee4e | ||
|
|
63c0f480ad | ||
|
|
e375f4e9c8 | ||
|
|
109b9c5f94 | ||
|
|
126c1a40e5 | ||
|
|
2440fd8bac | ||
|
|
98b9c4bed7 | ||
|
|
40f708f534 | ||
|
|
ebc5dc0b0c | ||
|
|
e0ed4e6a77 | ||
|
|
c24393e0fd | ||
|
|
e15db4ca81 | ||
|
|
1059e96721 | ||
|
|
234ea05171 | ||
|
|
0fa007e352 | ||
|
|
9e6b379dbf | ||
|
|
d46bab3a59 | ||
|
|
541699c01c | ||
|
|
23a8ea7992 | ||
|
|
6b4321fd1b | ||
|
|
2fb86e2eb8 | ||
|
|
53bc7b04cb | ||
|
|
43c2a5f62b | ||
|
|
b3d19ee824 | ||
|
|
2c2fa642c4 | ||
|
|
cb5e8a14c2 | ||
|
|
48221eb8bd | ||
|
|
3e6934d53e | ||
|
|
741e2bd94b | ||
|
|
0327bae400 | ||
|
|
e3d35f6789 | ||
|
|
b76a453304 | ||
|
|
069e564d89 | ||
|
|
cadfe29978 | ||
|
|
da111683d5 | ||
|
|
57da248b85 | ||
|
|
b66148ba39 | ||
|
|
86d2f9eaa8 | ||
|
|
25e06fece0 | ||
|
|
d1de57abbc | ||
|
|
5cc8090de2 | ||
|
|
e2ed51f99e | ||
|
|
134ed86e33 | ||
|
|
f7d4fc0e38 | ||
|
|
3531b69552 | ||
|
|
ce9923ab87 | ||
|
|
6d02c37081 | ||
|
|
b2e7f8b0af | ||
|
|
08c3f260a1 | ||
|
|
cde7e42dde | ||
|
|
4656a7e55b | ||
|
|
3513f31730 | ||
|
|
1bcedd2345 | ||
|
|
456d579624 | ||
|
|
c02b9b75c6 | ||
|
|
012a6455ea | ||
|
|
bb48c492c6 | ||
|
|
1a952f8145 | ||
|
|
2bb1686d0c | ||
|
|
1f1ea6519b | ||
|
|
f10648f6c7 | ||
|
|
d9f1fd86d9 | ||
|
|
ea0f644cdd | ||
|
|
4f71c21910 | ||
|
|
9897ca0150 | ||
|
|
1a8e1f7bfd | ||
|
|
c9f538deb9 | ||
|
|
88df9ef6f6 | ||
|
|
46e9b477a9 | ||
|
|
82e77237a6 | ||
|
|
f54368ec1b | ||
|
|
44dddb31c0 | ||
|
|
2e308957d4 | ||
|
|
2391251527 | ||
|
|
3858d01133 | ||
|
|
62fed0f3a2 | ||
|
|
37998fc5bd | ||
|
|
6123a88852 | ||
|
|
3d0e13a00d | ||
|
|
2f606bcf56 | ||
|
|
1ed365fb82 | ||
|
|
2b2fb0cf91 | ||
|
|
76d9ec0ad0 | ||
|
|
32068e5812 | ||
|
|
90d217b19a | ||
|
|
726c48d02f | ||
|
|
1af374e6a4 | ||
|
|
9ef99e168b | ||
|
|
bdcaa361bc | ||
|
|
a1003f154f | ||
|
|
3ba71d6de1 | ||
|
|
ac5fc8ea73 | ||
|
|
a3e0b4392c | ||
|
|
cbd71d8eea | ||
|
|
a2c7ebd49c | ||
|
|
727298f3f5 | ||
|
|
27d24b46ad | ||
|
|
a2f0f9ac89 | ||
|
|
ece81e9e4a | ||
|
|
70618de21b | ||
|
|
589a3c2872 | ||
|
|
03f9f3dbec | ||
|
|
fc22546441 | ||
|
|
08b3d2975e | ||
|
|
5d764734f7 | ||
|
|
36665a7464 | ||
|
|
1ca40285b2 | ||
|
|
ce939d6f44 | ||
|
|
f126c8d3a1 | ||
|
|
970ffd8520 | ||
|
|
7dcb361c82 | ||
|
|
5867abf11e | ||
|
|
9afbb6eec6 | ||
|
|
ef938e62d0 | ||
|
|
e68f7b2e4b | ||
|
|
b1bd801e94 | ||
|
|
56b3459d40 | ||
|
|
f684c873f7 | ||
|
|
7c474bb76f | ||
|
|
31c36865e5 | ||
|
|
a6c30b90a3 | ||
|
|
386843fd25 | ||
|
|
457d8d9aef | ||
|
|
15f5e27eaf | ||
|
|
1ac1f811f6 | ||
|
|
b86f6c2308 | ||
|
|
444c6da144 | ||
|
|
84a050b56f | ||
|
|
b5697888a0 | ||
|
|
8f38e99480 | ||
|
|
f977e4b5cf | ||
|
|
d75ca19d76 | ||
|
|
587a9df786 | ||
|
|
295372322d | ||
|
|
b2959537e6 | ||
|
|
39546ad7d7 | ||
|
|
322f7b0971 | ||
|
|
a320eee158 | ||
|
|
603137e2ab | ||
|
|
4f242b4d51 | ||
|
|
3cd84da3a6 | ||
|
|
92f0098844 | ||
|
|
45ef6ccef8 | ||
|
|
20e1875a32 | ||
|
|
b73786146f | ||
|
|
a587b015d0 | ||
|
|
a353313b22 | ||
|
|
7209272d72 | ||
|
|
6ee3c1a91a | ||
|
|
9f50126a03 | ||
|
|
5d1987b3da | ||
|
|
04c29cd1db | ||
|
|
d91c95fda0 | ||
|
|
8f1aea2bc0 | ||
|
|
ad7eabb3b3 | ||
|
|
468e83a183 | ||
|
|
66fbc2c8f6 | ||
|
|
2807179898 | ||
|
|
216037574d | ||
|
|
4f670edacc | ||
|
|
5c3d73a99b | ||
|
|
d29ca45595 | ||
|
|
9e2eec1ca9 | ||
|
|
e0da3d8d39 | ||
|
|
3f7e011ab0 | ||
|
|
bca6f1740d | ||
|
|
d7d6efb0d7 | ||
|
|
3203b1d69c | ||
|
|
fbe1ba7079 | ||
|
|
00c42a8936 | ||
|
|
5320bf5037 | ||
|
|
79111711fe | ||
|
|
f7acc655f4 | ||
|
|
e5781fe090 | ||
|
|
a10fdc591f | ||
|
|
f7ecccf234 | ||
|
|
5112b2973f | ||
|
|
10aa5f6fd7 | ||
|
|
9c59f1dcc4 | ||
|
|
d08a2b63dc | ||
|
|
6ed8115087 | ||
|
|
76916942ca | ||
|
|
72bc3b818f | ||
|
|
a5fe3a240b | ||
|
|
b8c474191a | ||
|
|
0f411474da | ||
|
|
dcd4c05dfa | ||
|
|
07783bcdf0 | ||
|
|
240cb49efe | ||
|
|
412d0aba50 | ||
|
|
25fabf3d2d | ||
|
|
f633782aa1 | ||
|
|
ce43e130bb | ||
|
|
8754a488e0 | ||
|
|
75a5b970b3 | ||
|
|
e08f95ef54 | ||
|
|
4eac40b0e5 | ||
|
|
04712f52ad | ||
|
|
c781b840f2 | ||
|
|
d8415fe94f | ||
|
|
9928e82eac | ||
|
|
49803907f5 | ||
|
|
4c3aa5cba3 | ||
|
|
c04cb4522a | ||
|
|
f62113bea3 | ||
|
|
d92a618daf | ||
|
|
1110f5f335 | ||
|
|
68c59ca300 | ||
|
|
65eb6ca593 | ||
|
|
9ed80c0140 | ||
|
|
6106d5a733 | ||
|
|
59b9b24bad | ||
|
|
f1b490166e | ||
|
|
3c94a67faa | ||
|
|
434a17cc05 | ||
|
|
aa96253ae1 | ||
|
|
87cff95abc | ||
|
|
4da60d3e2c | ||
|
|
fec9572013 | ||
|
|
1076c92f8d | ||
|
|
8def3e3ec1 | ||
|
|
83ef9b531a | ||
|
|
f9d9d1cbb4 | ||
|
|
31c1d2ed3d | ||
|
|
e66833e32e | ||
|
|
e6186db39f | ||
|
|
ae2984e8ca | ||
|
|
ed5048e229 | ||
|
|
e84c69c6cf | ||
|
|
7ee6b0046f | ||
|
|
708a265b39 | ||
|
|
df29ef2431 | ||
|
|
3022e9b806 | ||
|
|
db984f4c6d | ||
|
|
e0d703658c | ||
|
|
f52ec0e772 | ||
|
|
d29c650718 | ||
|
|
690342eae7 | ||
|
|
2e21152e49 | ||
|
|
7afa02b918 | ||
|
|
7ba5fcb251 | ||
|
|
f1af5f9504 | ||
|
|
5b399f4fe0 | ||
|
|
c0cc0c26ed | ||
|
|
b74c9a14fd | ||
|
|
b3828d9190 | ||
|
|
4842565b62 | ||
|
|
4d1e1b28f8 | ||
|
|
992fc3869f | ||
|
|
e96a4f0ed1 | ||
|
|
65dd91dfc3 | ||
|
|
99910b9591 | ||
|
|
dbac29a533 | ||
|
|
5e28f75496 | ||
|
|
bc445a1f16 | ||
|
|
572930e171 | ||
|
|
9694cb0f15 | ||
|
|
03fbbc6ee0 | ||
|
|
ab08d64445 | ||
|
|
d9173c1c81 | ||
|
|
6d3a217c16 | ||
|
|
979f238fb3 | ||
|
|
6af4f825de | ||
|
|
9ef77c1298 | ||
|
|
7417f884af | ||
|
|
b391c8ba91 | ||
|
|
cc2fcaa6ab | ||
|
|
214ed98dd8 | ||
|
|
36ce9a1c1c | ||
|
|
d87c244809 | ||
|
|
19058180fa | ||
|
|
55405358b3 | ||
|
|
aaf22602f2 | ||
|
|
a313a7d147 | ||
|
|
a8da87911c | ||
|
|
cbd4a8af0f | ||
|
|
752325fc8e | ||
|
|
d17ebff653 | ||
|
|
0ad181ef01 | ||
|
|
c9848717d6 | ||
|
|
aafe49ef49 | ||
|
|
c417b4e790 | ||
|
|
1919353d75 | ||
|
|
65673815ac | ||
|
|
ab5ff1597f | ||
|
|
d6174d58f9 | ||
|
|
ea3c071c2d | ||
|
|
3f3c12d723 | ||
|
|
f2ddecd375 | ||
|
|
07e8ae7cb1 | ||
|
|
1b3376c9da | ||
|
|
6327a7ad45 | ||
|
|
ae21be058f | ||
|
|
53424a8278 | ||
|
|
267987dd44 | ||
|
|
1b4242d631 | ||
|
|
c70a6df8c7 | ||
|
|
0b5e948104 | ||
|
|
41431bbd91 | ||
|
|
7da7de8f59 | ||
|
|
3426a19c60 | ||
|
|
f831d9c32d | ||
|
|
94c4bdd4c8 | ||
|
|
b67ad81f67 | ||
|
|
d9eac1e2c0 | ||
|
|
fb9673ea4a | ||
|
|
83dd3a893b | ||
|
|
ce7a44e806 | ||
|
|
91a4b3d1ed | ||
|
|
910c82eff8 | ||
|
|
eb5fa8bdd2 | ||
|
|
6f82682a64 | ||
|
|
0ef0b74972 | ||
|
|
a091e5e93d | ||
|
|
956fa0cc78 | ||
|
|
504453762c | ||
|
|
71a0d20bf5 | ||
|
|
9386131a43 | ||
|
|
0819395283 | ||
|
|
c5c9c39bb9 | ||
|
|
139d0623b8 | ||
|
|
bf3f82daa0 | ||
|
|
f399320c40 | ||
|
|
df445b0891 | ||
|
|
b3ab88e970 | ||
|
|
e2609be248 | ||
|
|
226e5a6478 | ||
|
|
123a921fc2 | ||
|
|
e6503ed629 | ||
|
|
01b84d9480 | ||
|
|
c740c3f8ae | ||
|
|
e211bb2aff | ||
|
|
cfcb7f0117 | ||
|
|
0927513b16 | ||
|
|
0873056df7 | ||
|
|
b480949713 | ||
|
|
f4ae4ca4ef | ||
|
|
a0b56b516a | ||
|
|
7dcae67d92 | ||
|
|
866a9c5e2d | ||
|
|
4c29214245 | ||
|
|
d6b68f0fff | ||
|
|
fe4e67e1a0 | ||
|
|
cd4c834ded | ||
|
|
1c97532caf | ||
|
|
220323bbbf | ||
|
|
5aa2bbe173 | ||
|
|
ba1b5f6db1 | ||
|
|
c25ff2f7c9 | ||
|
|
23fa5c1d3f | ||
|
|
bd38753847 | ||
|
|
d1ea3d6f17 | ||
|
|
339afbb210 | ||
|
|
f4d8e10147 | ||
|
|
9fec99f4a6 | ||
|
|
3faf14fe5c | ||
|
|
eae64f3a4f | ||
|
|
2190ae8456 | ||
|
|
5d95b57e31 | ||
|
|
ddac742eb8 | ||
|
|
9e51e01450 | ||
|
|
096b53e6c6 | ||
|
|
1f98316792 | ||
|
|
58e904c6fd | ||
|
|
308d4d7b56 | ||
|
|
fd9508f73e | ||
|
|
92f84dde01 | ||
|
|
c7ba7d37a5 | ||
|
|
e3d7071595 | ||
|
|
00bc2c29ca | ||
|
|
f11893c764 | ||
|
|
1aad2e1c4a | ||
|
|
d4899bad7e | ||
|
|
1323b4bc13 | ||
|
|
9f1ddc8d01 | ||
|
|
d0a698d984 | ||
|
|
1bf2efdbf0 | ||
|
|
394f851071 | ||
|
|
b36a76ab70 | ||
|
|
916300ba27 | ||
|
|
22b1971cbc | ||
|
|
a7e650ac12 | ||
|
|
53e807719a | ||
|
|
b51e8b8ec4 | ||
|
|
6f976ee5d4 | ||
|
|
3fa5a54f68 | ||
|
|
72ab8e314c | ||
|
|
d255fdbe9c | ||
|
|
71c4a4524f | ||
|
|
c555721842 | ||
|
|
0dcc4a0d58 | ||
|
|
d6cdc3e8f5 | ||
|
|
df400162fc | ||
|
|
695b9df0ec | ||
|
|
1a68cff356 | ||
|
|
acf88c6fa8 | ||
|
|
1bcc596ada | ||
|
|
f015b15dc9 | ||
|
|
e803da432b | ||
|
|
8f8e6f63d8 | ||
|
|
bbc161b496 | ||
|
|
e3fe6a0efd | ||
|
|
1ab25ef4a1 | ||
|
|
0fab8dca59 | ||
|
|
55707840f3 | ||
|
|
8d3d73c573 | ||
|
|
2bb1be5ca0 | ||
|
|
cb3a4594b9 | ||
|
|
a1796c88cb | ||
|
|
ed63af49a2 | ||
|
|
e1927c2248 | ||
|
|
0fa42caea6 | ||
|
|
69c54c088c | ||
|
|
bf5606ff49 | ||
|
|
3f7506491b | ||
|
|
8c96da80b0 | ||
|
|
df3a123e85 | ||
|
|
8b924d2318 | ||
|
|
7fff797d97 | ||
|
|
42a2bc2846 | ||
|
|
b2ff7dd7c5 | ||
|
|
27c0b63dfc | ||
|
|
588d5520d6 | ||
|
|
1f96e81489 | ||
|
|
a41c38cb7d | ||
|
|
c4aa5c4df7 | ||
|
|
2c32c6a11a | ||
|
|
b01df13c39 | ||
|
|
3616231d94 | ||
|
|
b7e7317be0 | ||
|
|
045d8da585 | ||
|
|
0ac3a6acde | ||
|
|
9ee502b57d | ||
|
|
79bfec7ced | ||
|
|
168acf8b9c | ||
|
|
eed785a714 | ||
|
|
a9e92e39a3 | ||
|
|
ee9b6aa2e5 | ||
|
|
d7f5a724ca | ||
|
|
b9b4d6b169 | ||
|
|
3d6090e6f7 | ||
|
|
3ea2606e41 | ||
|
|
3f3f566627 | ||
|
|
05bbdbd786 | ||
|
|
54abd85010 | ||
|
|
5db3c9bdb4 | ||
|
|
45e8ddd2c9 | ||
|
|
e5549867e2 | ||
|
|
2e1d300fe5 | ||
|
|
4e3811ecb7 | ||
|
|
40fa6cc699 | ||
|
|
7a4cc2dff1 | ||
|
|
b6bc4c265e | ||
|
|
f8265dd3d8 | ||
|
|
48f0a08332 | ||
|
|
c8eb28c84b | ||
|
|
e13ae8ea54 | ||
|
|
947713c68b | ||
|
|
7bff8c9b50 | ||
|
|
eb2947bbbd | ||
|
|
fe12b67113 | ||
|
|
22a4f828db | ||
|
|
03ae2c6b97 | ||
|
|
3445d47a10 | ||
|
|
a3ce4b756d | ||
|
|
5873623fd5 | ||
|
|
a1faaa73d3 | ||
|
|
792a091d75 | ||
|
|
f76c31d4cd | ||
|
|
e762d8ee73 | ||
|
|
a8cf858306 | ||
|
|
20694b3960 | ||
|
|
0b26f06ded | ||
|
|
5bdecc6cc7 | ||
|
|
d24d45b2b4 | ||
|
|
65ad25c5dc | ||
|
|
a84d00ebd3 | ||
|
|
40dfaeed5c | ||
|
|
de2517a1f4 | ||
|
|
4a32d010ef | ||
|
|
3fca18930e | ||
|
|
02ade899f9 | ||
|
|
3e90df41a9 | ||
|
|
a25003439a | ||
|
|
7899ec4a2b | ||
|
|
dd3edcb414 | ||
|
|
b7bfc2d2a2 | ||
|
|
9177f974da | ||
|
|
77e927d501 | ||
|
|
aa298d7bbe | ||
|
|
f1e4f5cf82 | ||
|
|
3f11fc8041 | ||
|
|
535135e826 | ||
|
|
89d48552da | ||
|
|
29becc72ac | ||
|
|
99e8d1ac51 | ||
|
|
0ea3fb3c07 | ||
|
|
7449936903 | ||
|
|
004c583882 | ||
|
|
fc802521f3 | ||
|
|
2e1922942c | ||
|
|
2dd7796da0 | ||
|
|
20539121db | ||
|
|
daeaff8c14 | ||
|
|
e760bf3708 | ||
|
|
5f20a181aa | ||
|
|
2fef57672b | ||
|
|
bba93bb711 | ||
|
|
fa1ece2973 | ||
|
|
4d09de4e63 | ||
|
|
95343e720d | ||
|
|
96c7801048 | ||
|
|
85f74e093b | ||
|
|
ddc44210a4 | ||
|
|
e52535af00 | ||
|
|
3a0056aa09 | ||
|
|
3e9c67e385 | ||
|
|
821279c98b | ||
|
|
312d78eca6 | ||
|
|
6a4773b2d9 | ||
|
|
c9b7235ea0 | ||
|
|
942ecc6d94 | ||
|
|
2c53930cbb | ||
|
|
dc0e1d4cb5 | ||
|
|
5b421e3103 | ||
|
|
c2bbb8e875 | ||
|
|
1822e3bd68 | ||
|
|
b4204ff74c | ||
|
|
45853bf653 | ||
|
|
ee62735854 | ||
|
|
370d12c241 | ||
|
|
a3576f081b | ||
|
|
425f0215f8 | ||
|
|
eaa1924e36 | ||
|
|
e33f73ba8d | ||
|
|
e01071c1d7 | ||
|
|
6d77a9d346 | ||
|
|
f5be07c5c7 | ||
|
|
2adf9f295e | ||
|
|
bf886f22b7 | ||
|
|
cb92ddeb53 | ||
|
|
ddbf490eb4 | ||
|
|
8dae34819a | ||
|
|
5a74e8ae4e | ||
|
|
ac1bb837ca | ||
|
|
686c105caa | ||
|
|
cb628f9be3 | ||
|
|
cc76a774e3 | ||
|
|
9aef26e3d0 | ||
|
|
c2210482ee | ||
|
|
fe57800e4c | ||
|
|
d5f56f9cd7 | ||
|
|
22c2c69da4 | ||
|
|
d9f0902259 | ||
|
|
f61c317736 | ||
|
|
aa8336c08f | ||
|
|
548bd7cf11 | ||
|
|
b208989a75 | ||
|
|
849a724b76 | ||
|
|
12c9be75c3 | ||
|
|
322a087077 | ||
|
|
230bf922dd | ||
|
|
1778193988 | ||
|
|
85bb9aba83 | ||
|
|
3e8068282b | ||
|
|
f8356568bd | ||
|
|
fced145a6f | ||
|
|
75b17ba951 | ||
|
|
76bf15f3f5 | ||
|
|
9610d3daa9 | ||
|
|
1b868e164e | ||
|
|
561028f4ac | ||
|
|
ea05c547f4 | ||
|
|
16f5d0a11b | ||
|
|
85925f6fe8 | ||
|
|
a72c09608f | ||
|
|
163218e095 | ||
|
|
7f519808bb | ||
|
|
eb5eb4b184 | ||
|
|
30e5bc03f5 | ||
|
|
08774a1668 | ||
|
|
c08bc8f748 | ||
|
|
90df7a344e | ||
|
|
156f60ff68 | ||
|
|
b3dd93b242 | ||
|
|
2d93d34275 | ||
|
|
262b5c6bb6 | ||
|
|
dbc71f8be4 | ||
|
|
84de13d6fe | ||
|
|
f59116179b | ||
|
|
ba1852e6f1 | ||
|
|
3f27c2b654 | ||
|
|
fbd9c922b4 | ||
|
|
2d87c8508a | ||
|
|
9d07e1de5c | ||
|
|
8188297c46 | ||
|
|
7515c4a994 | ||
|
|
da4376bb23 | ||
|
|
173606dfc6 | ||
|
|
3d061807bb | ||
|
|
bb22f10c37 | ||
|
|
4aa3cfc3db | ||
|
|
fe531f25e6 | ||
|
|
8a788f502e | ||
|
|
a98be62643 | ||
|
|
c0270058fe | ||
|
|
f5d34cdce9 | ||
|
|
72bf7437cb | ||
|
|
7d6f2ec75d | ||
|
|
2e828fa1eb | ||
|
|
13bbc7d111 | ||
|
|
0180caa0c5 | ||
|
|
5ca242d9a0 | ||
|
|
e340982761 | ||
|
|
c98bd4b9f3 | ||
|
|
031bd9ac31 | ||
|
|
7435d83352 | ||
|
|
ea4e209b2b | ||
|
|
a0ccfc52c8 | ||
|
|
42c0f57881 | ||
|
|
a14eed3cb2 | ||
|
|
59e5cb3ea3 | ||
|
|
377f2fbc55 | ||
|
|
e81e47663f | ||
|
|
e7d45e86d1 | ||
|
|
9ecc0c5517 | ||
|
|
83e5d2b29b | ||
|
|
fffe6020aa | ||
|
|
e7eb4ca699 | ||
|
|
e5c36df55c | ||
|
|
0f3d7f59a9 | ||
|
|
c3cdbb8d3f | ||
|
|
2a1bb90a7e | ||
|
|
2f1095be00 | ||
|
|
72a9275f65 | ||
|
|
92715a3867 | ||
|
|
4a3c8c53e3 | ||
|
|
1f3b5a3dd8 | ||
|
|
a1d61ec70e | ||
|
|
c83761c759 | ||
|
|
88eb1da1da | ||
|
|
6b099582bd | ||
|
|
fada8884a3 | ||
|
|
2fc81ec762 | ||
|
|
b5ef7a4be7 | ||
|
|
41347fc40e | ||
|
|
2bd0aa26c2 | ||
|
|
962cb92146 | ||
|
|
db00e4acb1 | ||
|
|
754478c6f5 | ||
|
|
caa34fb806 | ||
|
|
aad3038b71 | ||
|
|
a4def0664d | ||
|
|
8075bc7e8a | ||
|
|
c710dafd38 | ||
|
|
dc16b600a5 | ||
|
|
c091f9835b | ||
|
|
6993b5780b | ||
|
|
6e08ff4f71 | ||
|
|
6df8557d33 | ||
|
|
9608d12c39 | ||
|
|
dd9b964694 | ||
|
|
b8f7d0087d | ||
|
|
70611589b3 | ||
|
|
94c7a45d8e | ||
|
|
9a012ca907 | ||
|
|
9bb6fc54aa | ||
|
|
eb1e691d00 | ||
|
|
45764b9af2 | ||
|
|
fb1e26800f | ||
|
|
910502b044 | ||
|
|
2ff9982e42 | ||
|
|
f6e8b41a5f | ||
|
|
42e5deb36c | ||
|
|
8bff24291a | ||
|
|
16340bfef0 | ||
|
|
fa5f24c4c6 | ||
|
|
b78d012e9d | ||
|
|
43e8e1245e | ||
|
|
8569f8ffa9 | ||
|
|
821c3f6fda | ||
|
|
e36d0b9d89 | ||
|
|
720e3dc89a | ||
|
|
4fcb103952 | ||
|
|
a267b98f43 | ||
|
|
afc73d862b | ||
|
|
9a1113585f | ||
|
|
f1ee29eac3 | ||
|
|
1bc1e233ca | ||
|
|
dddf0d13df | ||
|
|
b9551de86a | ||
|
|
5bd6c2209a | ||
|
|
08bc7404bc | ||
|
|
78b6253dea | ||
|
|
10055f8398 | ||
|
|
1a91d3ecc2 | ||
|
|
74ed7c9f94 | ||
|
|
f46c35a744 | ||
|
|
f574936f77 | ||
|
|
8abf2733e0 | ||
|
|
8c6a8c7743 | ||
|
|
197d78d428 | ||
|
|
64c3a36a0e | ||
|
|
bf72a762d8 | ||
|
|
78364faa8b | ||
|
|
92435ee51b | ||
|
|
589e18a1f7 | ||
|
|
566451e5be | ||
|
|
8ea7459457 | ||
|
|
3a58489962 | ||
|
|
3ef794ff5f | ||
|
|
e30da6776c | ||
|
|
a33a897f29 | ||
|
|
f43d9ab8a6 | ||
|
|
8acf7844dc | ||
|
|
a3adba60c8 | ||
|
|
25ec733e8d | ||
|
|
08e6bd4da0 | ||
|
|
7c97f17f9b | ||
|
|
5b0298d2b5 | ||
|
|
7e73237bac | ||
|
|
8568fe543b | ||
|
|
1c9c4d7230 | ||
|
|
3e129adac4 | ||
|
|
8f6f2a4cc1 | ||
|
|
4f110142bb | ||
|
|
23497d87b7 | ||
|
|
73f3647fe2 | ||
|
|
a305c4a189 | ||
|
|
b05ff2249b | ||
|
|
7fe4db1451 | ||
|
|
393e4a8c36 | ||
|
|
aba02b5978 | ||
|
|
708d4a74de | ||
|
|
6e1340462e | ||
|
|
aeea923e99 | ||
|
|
d461077920 | ||
|
|
d0c515b45c | ||
|
|
4b84ea8745 | ||
|
|
51a0fa60c8 | ||
|
|
2d8c67c7d5 | ||
|
|
ad0f8c9b71 | ||
|
|
67fe78f11c | ||
|
|
b18c5abf1c | ||
|
|
59f66af0f4 | ||
|
|
4cf5b77561 | ||
|
|
65738c9162 | ||
|
|
6341f011d7 | ||
|
|
558f0fa3ea | ||
|
|
7673378e0a | ||
|
|
97fca9a840 | ||
|
|
f124c131af | ||
|
|
ee81a6190f | ||
|
|
d1a07e1ad2 | ||
|
|
3dcfda7bda | ||
|
|
3f275a59a5 | ||
|
|
67132b480f | ||
|
|
d9921abba7 | ||
|
|
626e48dcca | ||
|
|
f1994a3f6e | ||
|
|
b6a57ff354 | ||
|
|
0e6b6d4c5c | ||
|
|
309b8c57fb | ||
|
|
a3294a01b0 | ||
|
|
204f6064e5 | ||
|
|
17ca5d8c74 | ||
|
|
4a2df8ccf5 | ||
|
|
2d1baaeb31 | ||
|
|
1a2964b988 | ||
|
|
4170f6416d | ||
|
|
735847657b | ||
|
|
8d6318c532 | ||
|
|
36df273199 | ||
|
|
1db47deedb | ||
|
|
d6bdaed4c0 | ||
|
|
1481657ca1 | ||
|
|
99f8939150 | ||
|
|
45eb103e4c | ||
|
|
990c0d0fad | ||
|
|
9295c4fdca | ||
|
|
41c1791ddd | ||
|
|
c8fbd48706 | ||
|
|
ccd911b026 | ||
|
|
deb5b314a5 | ||
|
|
c23aa46af6 | ||
|
|
8dfdbd327c | ||
|
|
49ec273bd5 | ||
|
|
b09226e1b4 | ||
|
|
d68871bdec | ||
|
|
6b544d3d8a | ||
|
|
2624654a78 | ||
|
|
2d3d80a3f2 | ||
|
|
f6ffa56bc6 | ||
|
|
8d71f2bb2d | ||
|
|
a9309ad872 | ||
|
|
bc1634bc1a | ||
|
|
6da5f51d3a | ||
|
|
a8068a365d | ||
|
|
29e0df8652 | ||
|
|
f9f695018a | ||
|
|
64320d0470 | ||
|
|
5e0ce74b1d | ||
|
|
47489a5b27 | ||
|
|
a5d528d3d7 | ||
|
|
3358aeb5d3 | ||
|
|
bc16e65a8e | ||
|
|
6bb8c4e904 | ||
|
|
89743fce5c | ||
|
|
8f19e15873 | ||
|
|
c2f3a114a8 | ||
|
|
ba6af15f00 | ||
|
|
0c073269a5 | ||
|
|
4e9441a1e7 | ||
|
|
c2b8fe4acf | ||
|
|
f3a329069e | ||
|
|
244fb561f8 | ||
|
|
2cd9474cb6 | ||
|
|
abd1bad4b6 | ||
|
|
f066a3acfe | ||
|
|
83c3f08048 | ||
|
|
d0caad54ae | ||
|
|
f873ad6e6c | ||
|
|
0c5e6d93cd | ||
|
|
2b0ecc7fa5 | ||
|
|
afe6283539 | ||
|
|
0735c835a9 | ||
|
|
a1cf1abf4d | ||
|
|
1fca2b262a | ||
|
|
08f38fd930 | ||
|
|
573588283f | ||
|
|
8e14d7accc | ||
|
|
77ef7e08a7 | ||
|
|
ac0ee614d6 | ||
|
|
8e04be3e8d | ||
|
|
4369606f15 | ||
|
|
f014f4f60f | ||
|
|
581b1540f5 | ||
|
|
a7da25a2bb | ||
|
|
14608042dd | ||
|
|
f8bedd0047 | ||
|
|
4d8f9c4929 | ||
|
|
1e80216861 | ||
|
|
b541bff3de | ||
|
|
bea4748f5c | ||
|
|
19d151cbbd | ||
|
|
d61ab3fc24 | ||
|
|
70cfca742f | ||
|
|
677ddac432 | ||
|
|
93b02c5289 | ||
|
|
22ff29fe3e | ||
|
|
ab171ee6b5 | ||
|
|
c86d0a7a45 | ||
|
|
4396edc12e | ||
|
|
442d670b3a | ||
|
|
7a280a0fda | ||
|
|
df05506016 | ||
|
|
b3580d0a75 | ||
|
|
2499628bff | ||
|
|
b5e0f033a6 | ||
|
|
059ccb6ac7 | ||
|
|
5f14bb768e | ||
|
|
7f490dad0e | ||
|
|
3e81211212 | ||
|
|
3f0b15ac80 | ||
|
|
41faa55aed | ||
|
|
04c0cd59a5 | ||
|
|
6ad0d51107 | ||
|
|
bc8c5033e3 | ||
|
|
dc404c4107 | ||
|
|
e44678aac2 | ||
|
|
42a63be148 | ||
|
|
1226259896 | ||
|
|
cabc10b909 | ||
|
|
90e9fd9c77 | ||
|
|
0935e2ce3f | ||
|
|
611cf8e97b | ||
|
|
3d9239c750 | ||
|
|
551c02f7b6 | ||
|
|
90c131fa21 | ||
|
|
a6b6c95b83 | ||
|
|
25c1d1dccd | ||
|
|
d9741142c8 | ||
|
|
a84d2bada4 | ||
|
|
9654920c40 | ||
|
|
a13135d09e | ||
|
|
f657d65570 | ||
|
|
9bcfe15afe | ||
|
|
4378dcecdf | ||
|
|
fa4894b30c | ||
|
|
6700c89ac7 | ||
|
|
d18dc59619 | ||
|
|
973f13ccb2 | ||
|
|
e148f6d293 | ||
|
|
3841b591c1 | ||
|
|
e8b0678fed | ||
|
|
08f074fb34 | ||
|
|
2f91f08a79 | ||
|
|
9bf8c1c229 | ||
|
|
504b9fe47a | ||
|
|
57f7889059 | ||
|
|
8b4d49fc79 | ||
|
|
a6526f2171 | ||
|
|
bfc9115ee5 | ||
|
|
5e3188fba4 | ||
|
|
57c0f5cfff | ||
|
|
19342feca7 | ||
|
|
7b097c0e37 | ||
|
|
952a76e506 | ||
|
|
0dcca900cc | ||
|
|
ab029fd3e5 | ||
|
|
acdc74dbf5 | ||
|
|
1830d29be9 | ||
|
|
3b4748d124 | ||
|
|
50e65a424c | ||
|
|
aca4091fae | ||
|
|
2add756624 | ||
|
|
2f1768f676 | ||
|
|
4f0bef5377 | ||
|
|
4dc1f7070b | ||
|
|
63ca47adfc | ||
|
|
c8460daf24 | ||
|
|
a6062bfb05 | ||
|
|
83461932b5 | ||
|
|
23c6ab8674 | ||
|
|
25f6a4a7c0 | ||
|
|
8eebff2029 | ||
|
|
6ecad0839e | ||
|
|
9fb965dfd8 | ||
|
|
bcdaf2c1a5 | ||
|
|
e737958ebb | ||
|
|
44df08ee55 | ||
|
|
8406b91aba | ||
|
|
2078f2391e | ||
|
|
f442eb2941 | ||
|
|
f1390de4c3 | ||
|
|
93ede2c8e1 | ||
|
|
ae7a2a007a | ||
|
|
1f107588fa | ||
|
|
a45a7e3819 | ||
|
|
5f0bf654a4 | ||
|
|
985bd80461 | ||
|
|
8bb2bf5d28 | ||
|
|
cc167bce98 | ||
|
|
f5291be83e | ||
|
|
2c0e561933 | ||
|
|
a488983890 | ||
|
|
94468e0921 | ||
|
|
4377246ee3 | ||
|
|
6edc738156 | ||
|
|
4f690a51e3 | ||
|
|
7eaf75e3b1 | ||
|
|
4354caa2d4 | ||
|
|
106775512b | ||
|
|
72559c0e30 | ||
|
|
437b98461e | ||
|
|
074c7edade | ||
|
|
e4f25ca7b1 | ||
|
|
dd547a84bf | ||
|
|
bc50ceb474 | ||
|
|
4c2adcbd56 | ||
|
|
f0c27dac9e | ||
|
|
93e9fef09f | ||
|
|
187f712b73 | ||
|
|
aa8b6cf83c | ||
|
|
46a9863033 | ||
|
|
c213bae308 | ||
|
|
ca55ba3715 | ||
|
|
168eb7758e | ||
|
|
96c4c01019 | ||
|
|
926c6c3301 | ||
|
|
8805ede31b | ||
|
|
cd29ba84ab | ||
|
|
a65a081656 | ||
|
|
8b36f9cbcd | ||
|
|
0cc1681a5b | ||
|
|
e3e8f658c4 | ||
|
|
07876bcb5d | ||
|
|
11080b7544 | ||
|
|
1b71b3372e | ||
|
|
1bfb2c3ec7 | ||
|
|
1ba34180d7 | ||
|
|
54a61c3cf6 | ||
|
|
f735e157e9 | ||
|
|
5708e7bba8 | ||
|
|
6919955eb1 | ||
|
|
4f99d359c8 | ||
|
|
6fd92cf72b | ||
|
|
2ebfd210cd | ||
|
|
d5659aa5e1 | ||
|
|
9add219c87 | ||
|
|
4d347c9e1f | ||
|
|
90721ff4a4 | ||
|
|
1024238089 | ||
|
|
b0f8e63615 | ||
|
|
c8062f789d | ||
|
|
3dc7a93409 | ||
|
|
59ed92cdcf | ||
|
|
d0a506b84b | ||
|
|
ccb48f46d6 | ||
|
|
9080de09fc | ||
|
|
44848c0887 | ||
|
|
f6a1207cf9 | ||
|
|
6c04dfc1e1 | ||
|
|
795d254715 | ||
|
|
e5ce0d8b3e | ||
|
|
9778fd673b | ||
|
|
3a46eb9695 | ||
|
|
3a84136d8c | ||
|
|
a77bf7510f | ||
|
|
afdfd95be8 | ||
|
|
3f9d8ee21b | ||
|
|
480a5db227 | ||
|
|
9874f0eedf | ||
|
|
39361c9d6e | ||
|
|
7f74dcb1a6 | ||
|
|
738818ee66 | ||
|
|
90e1281e8e | ||
|
|
907f15c7d6 | ||
|
|
258186e1ce | ||
|
|
2e1059b400 | ||
|
|
58a9554b17 | ||
|
|
ca70b66b72 | ||
|
|
b3f0804efd | ||
|
|
ebce57b0e6 | ||
|
|
3426e7ca7a | ||
|
|
39b444e420 | ||
|
|
00ea088ccd | ||
|
|
cd45cc7335 | ||
|
|
7ecf5ed43b | ||
|
|
6d648c45ed | ||
|
|
cc093a9945 | ||
|
|
3416bdb6e1 | ||
|
|
a37da82c38 | ||
|
|
f101a9b57f | ||
|
|
c7b5fd2423 | ||
|
|
f1c111d469 | ||
|
|
24ffa56fd0 | ||
|
|
e269fcdb28 | ||
|
|
61ac269c6e | ||
|
|
e71f8cf087 | ||
|
|
b524db4e87 | ||
|
|
37e05875d5 | ||
|
|
fcc31060fa | ||
|
|
e328e25bd1 | ||
|
|
bf435650e1 | ||
|
|
cd0aba1c14 | ||
|
|
a1e46876c6 | ||
|
|
66c246fc17 | ||
|
|
fbe78f2ef6 | ||
|
|
33da7dcdda | ||
|
|
3f2ded808d | ||
|
|
bcdeccb6a3 | ||
|
|
808a6a2308 | ||
|
|
29e56fa096 | ||
|
|
f02b837782 | ||
|
|
294ea6ffc2 | ||
|
|
c127695e96 | ||
|
|
d713508802 | ||
|
|
c42ed1e1fb | ||
|
|
e64db863dd | ||
|
|
40b667e0e9 | ||
|
|
effc683cfc | ||
|
|
898fd10ec0 | ||
|
|
7017b8f67f | ||
|
|
c230f7db00 | ||
|
|
5ed7bf6069 | ||
|
|
a7cbdd04cd | ||
|
|
4e81181981 | ||
|
|
1dc27001d5 | ||
|
|
9034e099da | ||
|
|
78f4331cab | ||
|
|
a9616d4982 | ||
|
|
f1fbec95d5 | ||
|
|
dd2f783492 | ||
|
|
fac7cfba06 | ||
|
|
613357b0ab | ||
|
|
de397548a8 | ||
|
|
8a3180c8f0 | ||
|
|
73e03453df | ||
|
|
ea805db369 | ||
|
|
d358cd813b | ||
|
|
571f4f4fde | ||
|
|
8c93627ccb | ||
|
|
80409f292d | ||
|
|
8b2b45e172 | ||
|
|
94cab36432 | ||
|
|
e1b834211b | ||
|
|
a0400ec19b | ||
|
|
27237bfb10 | ||
|
|
df86f458a2 | ||
|
|
88c3a362e9 | ||
|
|
a4ccff96f9 | ||
|
|
6df1efb30c | ||
|
|
75bc50c6fc | ||
|
|
5cb0201730 | ||
|
|
db78b4797a | ||
|
|
9de7f6a024 | ||
|
|
4b0e6d0a33 | ||
|
|
a6ebe05733 | ||
|
|
e16668553e | ||
|
|
3b459d46bc | ||
|
|
2e31651a02 | ||
|
|
9e2c86c67a | ||
|
|
4af2c36dfa | ||
|
|
5234813a09 | ||
|
|
3b8313838c | ||
|
|
9b47c04ac1 | ||
|
|
11332e0c26 | ||
|
|
785168be90 | ||
|
|
91eb812c61 | ||
|
|
2be08dd6d3 | ||
|
|
6d09ea7b0d | ||
|
|
7bb258353f | ||
|
|
35ec0a08b5 | ||
|
|
1b1bca8a63 | ||
|
|
11e498679b | ||
|
|
30979f06d8 | ||
|
|
c321e5b51a | ||
|
|
bf8b53e78b | ||
|
|
1ee3e32c80 | ||
|
|
668010de9e | ||
|
|
24f79bb72c | ||
|
|
1bdee95e06 | ||
|
|
90bdeb65ca | ||
|
|
522f1f2f27 | ||
|
|
0d457a8063 | ||
|
|
5db942f46c | ||
|
|
80cccededc | ||
|
|
dd77d0602a | ||
|
|
4722a74bcf | ||
|
|
16632f72fc | ||
|
|
be855de208 | ||
|
|
feb2f918b3 | ||
|
|
6bdbdae68c | ||
|
|
59f891e8b8 | ||
|
|
2be25646bd | ||
|
|
4ee12115f0 | ||
|
|
7eb03c4372 | ||
|
|
b7ffe8cdaf | ||
|
|
dbc538f92b | ||
|
|
562488ee9c | ||
|
|
3e9c9be49e | ||
|
|
9e2ad11286 | ||
|
|
5d159ca17a | ||
|
|
b7a12bb110 | ||
|
|
155fa29f27 | ||
|
|
8257531353 | ||
|
|
49e3c8fee2 | ||
|
|
7a5980964b | ||
|
|
c1e4806502 | ||
|
|
84ed9c3db9 | ||
|
|
3c97cf0102 | ||
|
|
9e61c5f51a | ||
|
|
a0aa288531 | ||
|
|
1235c944d2 | ||
|
|
05ff9c82a6 | ||
|
|
e4af7abbde | ||
|
|
e8bcfd934a | ||
|
|
1b5a74d1a7 | ||
|
|
a2ffd5db02 | ||
|
|
704a69781e | ||
|
|
5f24ab538f | ||
|
|
6a203a2347 | ||
|
|
16e150496f | ||
|
|
44a82a9eb6 | ||
|
|
a15366696c | ||
|
|
c64a391bb2 | ||
|
|
1d286acd9a | ||
|
|
b63df62ce1 | ||
|
|
ff323743c5 | ||
|
|
50d2bb5b7b | ||
|
|
1a375e421b | ||
|
|
09e2cc2fdf | ||
|
|
d262a3cc82 | ||
|
|
badb35bdb7 | ||
|
|
3cca84e543 | ||
|
|
4ea19e3b31 | ||
|
|
118cbe89db | ||
|
|
f13f9c1936 | ||
|
|
0bda501d01 | ||
|
|
8e6d4e2d3e | ||
|
|
c859133450 | ||
|
|
1b4dfdc778 | ||
|
|
620317a6bf | ||
|
|
c1c6d5fa1f | ||
|
|
576b49f9f0 | ||
|
|
f18a2cdcd6 | ||
|
|
b6aa3e6c17 | ||
|
|
2e2fe82afe | ||
|
|
67c5175138 | ||
|
|
bece4592b4 | ||
|
|
0081aea9e1 | ||
|
|
fec37a7211 | ||
|
|
5d3c42ac61 | ||
|
|
cd0b33c839 | ||
|
|
a7dbd3f5e4 | ||
|
|
e077b7593b | ||
|
|
a882d55b52 | ||
|
|
899a90bfd9 | ||
|
|
09f70cf63b | ||
|
|
d4efcf477e | ||
|
|
0e291b59ed | ||
|
|
b8c82a8e39 | ||
|
|
4f51b86bfb | ||
|
|
c2d2dec516 | ||
|
|
1e40423be8 | ||
|
|
0c5ab92b59 | ||
|
|
b9278db095 | ||
|
|
944b08f293 | ||
|
|
307b54a273 | ||
|
|
795162649b | ||
|
|
3181551ddd | ||
|
|
4cbcb32a53 | ||
|
|
13a5e426f3 | ||
|
|
56557d787a | ||
|
|
6b1d2c4de1 | ||
|
|
bca3705ac5 | ||
|
|
9fcda065b6 | ||
|
|
188edf1546 | ||
|
|
22922b8765 | ||
|
|
e16812dea8 | ||
|
|
20580c3f25 | ||
|
|
a6871ebbce | ||
|
|
0ce61713d5 | ||
|
|
d705b6c469 | ||
|
|
771ab6e1bf | ||
|
|
b103723acc | ||
|
|
03ebea3ec6 | ||
|
|
5f011471a3 | ||
|
|
6b3f36f935 | ||
|
|
1010c1f580 | ||
|
|
7490632078 | ||
|
|
537381d409 | ||
|
|
3a01be66d4 | ||
|
|
8a87c1a169 | ||
|
|
07b07ca07c | ||
|
|
26a10a8026 | ||
|
|
072c1efe39 | ||
|
|
c38939be8e | ||
|
|
e48314ac1b | ||
|
|
7c94dda02d | ||
|
|
fe6c711f48 | ||
|
|
2c7c121c13 | ||
|
|
7a8b837062 | ||
|
|
25eb22e88f | ||
|
|
7f798f5f4f | ||
|
|
9d502e7240 | ||
|
|
c1ecd3afea | ||
|
|
a95088a5ea | ||
|
|
fb43ebcbae | ||
|
|
73ed11f2b7 | ||
|
|
6390686aab | ||
|
|
3e0c759c3a | ||
|
|
10f565971b | ||
|
|
e1ea22da05 | ||
|
|
1e71247ea0 | ||
|
|
46f650f6b0 | ||
|
|
74bca24efe | ||
|
|
e385fd1e4c | ||
|
|
239899ae58 | ||
|
|
2a3863e2b8 | ||
|
|
bd30083472 | ||
|
|
01839f9f82 | ||
|
|
6f807a8598 | ||
|
|
94439345f5 | ||
|
|
e9dc554349 | ||
|
|
68ed0308cf | ||
|
|
fb04070061 | ||
|
|
9200311684 | ||
|
|
dd374cd779 | ||
|
|
71076df2d8 | ||
|
|
a1a27df129 | ||
|
|
fd685e41d6 | ||
|
|
c672fc6df6 | ||
|
|
0a735b7b9e | ||
|
|
5aaadded9d | ||
|
|
a8bcd782c4 | ||
|
|
2be7ff8311 | ||
|
|
0894db7b3f | ||
|
|
d58a074dea | ||
|
|
d73bc3ca57 | ||
|
|
186d893f27 | ||
|
|
edeada009c | ||
|
|
18195dd699 | ||
|
|
338b31ba60 | ||
|
|
562eb3d16d | ||
|
|
175fb661e0 | ||
|
|
50c04a9d3e | ||
|
|
8a66d0dd57 | ||
|
|
1f678023d5 | ||
|
|
b66a30133f | ||
|
|
598a7bda46 | ||
|
|
0800b55642 | ||
|
|
5ac433d292 | ||
|
|
b22469537b | ||
|
|
591844b387 | ||
|
|
2611844743 | ||
|
|
c04fc60484 | ||
|
|
ffb626613a | ||
|
|
3452006a53 | ||
|
|
161422b9b2 | ||
|
|
2091adbbb1 | ||
|
|
ccbf5f37f1 | ||
|
|
ef2b6836fd | ||
|
|
44386ac6ff | ||
|
|
5c7e1b6bee | ||
|
|
3266134b2a | ||
|
|
63571532a2 | ||
|
|
82b01ee905 | ||
|
|
48569d6b98 | ||
|
|
211fe36692 | ||
|
|
8dd8bb78b1 | ||
|
|
d64cc3c1ef | ||
|
|
db7201835d | ||
|
|
74cb2ee314 | ||
|
|
6d24eee926 | ||
|
|
aeb7c0bc47 | ||
|
|
940f23f4a4 | ||
|
|
f3f1cae097 | ||
|
|
fbe50426e2 | ||
|
|
8011a147de | ||
|
|
3cca257a3b | ||
|
|
de96d28c57 | ||
|
|
783fb6b2a6 | ||
|
|
b969dad022 | ||
|
|
c1db691c12 | ||
|
|
5f9c33edfe | ||
|
|
10d7644859 | ||
|
|
6cb5a99aa7 | ||
|
|
f696bb6737 | ||
|
|
8a9acec293 | ||
|
|
7eeedf8385 | ||
|
|
4c066c3552 | ||
|
|
6e5149f0ab | ||
|
|
af12dd6260 | ||
|
|
f8e40348be | ||
|
|
be8f2b0de2 | ||
|
|
279f065a06 | ||
|
|
c7837e95d2 | ||
|
|
9130f4b9d2 | ||
|
|
5aa14aeef0 | ||
|
|
61976fe88d | ||
|
|
0868a7d0bd | ||
|
|
48be557ad6 | ||
|
|
371f45401c | ||
|
|
9b9213f122 | ||
|
|
4c3d7d6a8b | ||
|
|
720d1c1c5e | ||
|
|
0dac1e107c | ||
|
|
31a8ced738 | ||
|
|
eb07a88b9e | ||
|
|
0503b28076 | ||
|
|
f45eaa5782 | ||
|
|
2f00343264 | ||
|
|
323c9cfee7 | ||
|
|
676a608318 |
166
ABOUT-NLS
166
ABOUT-NLS
@@ -1,16 +1,16 @@
|
||||
Notes on the GNU Translation Project
|
||||
************************************
|
||||
Notes on the Free Translation Project
|
||||
*************************************
|
||||
|
||||
GNU is going international! The GNU Translation Project is a way to
|
||||
get maintainers, translators, and users all together, so that GNU will
|
||||
gradually become able to speak many languages. A few packages already
|
||||
provide translations for their messages.
|
||||
Free software is going international! The Free Translation Project
|
||||
is a way to get maintainers of free software, translators, and users all
|
||||
together, so that will gradually become able to speak many languages.
|
||||
A few packages already provide translations for their messages.
|
||||
|
||||
If you found this `ABOUT-NLS' file inside a GNU distribution, you
|
||||
may assume that the distributed package does use GNU `gettext'
|
||||
internally, itself available at your nearest GNU archive site. But you
|
||||
do *not* need to install GNU `gettext' prior to configuring, installing
|
||||
or using this package with messages translated.
|
||||
If you found this `ABOUT-NLS' file inside a distribution, you may
|
||||
assume that the distributed package does use GNU `gettext' internally,
|
||||
itself available at your nearest GNU archive site. But you do *not*
|
||||
need to install GNU `gettext' prior to configuring, installing or using
|
||||
this package with messages translated.
|
||||
|
||||
Installers will find here some useful hints. These notes also
|
||||
explain how users should proceed for getting the programs to use the
|
||||
@@ -31,19 +31,23 @@ should configure it using
|
||||
./configure --with-included-gettext
|
||||
|
||||
to force usage of internationalizing routines provided within this
|
||||
package, despite the existence of internationalizing capabilities in
|
||||
the operating system where this package is being installed. So far, no
|
||||
prior implementation provides as many useful features (such as locale
|
||||
alias or message inheritance). It is also not possible to offer this
|
||||
additional functionality on top of a `catgets' implementation. Future
|
||||
versions of GNU `gettext' will very likely convey even more
|
||||
functionality. So it might be a good idea to change to GNU `gettext'
|
||||
as soon as possible.
|
||||
package, despite the existence of internationalizing capabilities in the
|
||||
operating system where this package is being installed. So far, only
|
||||
the `gettext' implementation in the GNU C library version 2 provides as
|
||||
many features (such as locale alias or message inheritance) as the
|
||||
implementation here. It is also not possible to offer this additional
|
||||
functionality on top of a `catgets' implementation. Future versions of
|
||||
GNU `gettext' will very likely convey even more functionality. So it
|
||||
might be a good idea to change to GNU `gettext' as soon as possible.
|
||||
|
||||
So you need not provide this option if you are using GNU libc 2 or
|
||||
you have installed a recent copy of the GNU gettext package with the
|
||||
included `libintl'.
|
||||
|
||||
INSTALL Matters
|
||||
===============
|
||||
|
||||
Some GNU packages are "localizable" when properly installed; the
|
||||
Some packages are "localizable" when properly installed; the
|
||||
programs they contain can be made to speak your own native language.
|
||||
Most such packages use GNU `gettext'. Other packages have their own
|
||||
ways to internationalization, predating GNU `gettext'.
|
||||
@@ -113,21 +117,20 @@ shell prompt, merely execute `setenv LANG de' (in `csh'),
|
||||
can be done from your `.login' or `.profile' file, once and for all.
|
||||
|
||||
An operating system might already offer message localization for
|
||||
many of its programs, while other programs (whether GNU or not) have
|
||||
been installed locally with the full capabilities of GNU `gettext'.
|
||||
Just using `gettext' extended syntax for `LANG' would break proper
|
||||
localization of already available operating system programs. In this
|
||||
case, users should set both `LANGUAGE' and `LANG' variables in their
|
||||
environment, as programs using GNU `gettext' give preference to
|
||||
`LANGUAGE'. For example, some Swedish users would rather read
|
||||
translations in German than English for when Swedish is not available.
|
||||
This is easily accomplished by setting `LANGUAGE' to `sv:de' while
|
||||
leaving `LANG' to `sv'.
|
||||
many of its programs, while other programs have been installed locally
|
||||
with the full capabilities of GNU `gettext'. Just using `gettext'
|
||||
extended syntax for `LANG' would break proper localization of already
|
||||
available operating system programs. In this case, users should set
|
||||
both `LANGUAGE' and `LANG' variables in their environment, as programs
|
||||
using GNU `gettext' give preference to `LANGUAGE'. For example, some
|
||||
Swedish users would rather read translations in German than English for
|
||||
when Swedish is not available. This is easily accomplished by setting
|
||||
`LANGUAGE' to `sv:de' while leaving `LANG' to `sv'.
|
||||
|
||||
Translating Teams
|
||||
=================
|
||||
|
||||
For the GNU Translation Project to be a success, we need interested
|
||||
For the Free Translation Project to be a success, we need interested
|
||||
people who like their own language and write it well, and who are also
|
||||
able to synergize with other translators speaking the same language.
|
||||
Each translation team has its own mailing list, courtesy of Linux
|
||||
@@ -135,15 +138,14 @@ International. You may reach your translation team at the address
|
||||
`LL@li.org', replacing LL by the two-letter ISO 639 code for your
|
||||
language. Language codes are *not* the same as the country codes given
|
||||
in ISO 3166. The following translation teams exist, as of December
|
||||
1996:
|
||||
1997:
|
||||
|
||||
Arabic `ar', Chinese `zh', Czech `cs', Danish `da', Dutch `nl',
|
||||
English `en', Esperanto `eo', Finnish `fi', French `fr', German
|
||||
`de', Greek `el', Hebrew `he', Hungarian `hu', Irish `ga', Italian
|
||||
`it', Indonesian `id', Japanese `ja', Korean `ko', Latin `la',
|
||||
Norwegian `no', Persian `fa', Polish `pl', Portuguese `pt',
|
||||
Russian `ru', Slovenian `sl', Spanish `es', Swedish `sv', Telugu
|
||||
`te', Turkish `tr' and Ukrainian `uk'.
|
||||
Chinese `zh', Czech `cs', Danish `da', Dutch `nl', English `en',
|
||||
Esperanto `eo', Finnish `fi', French `fr', German `de', Hungarian
|
||||
`hu', Irish `ga', Italian `it', Indonesian `id', Japanese `ja',
|
||||
Korean `ko', Latin `la', Norwegian `no', Persian `fa', Polish
|
||||
`pl', Portuguese `pt', Russian `ru', Slovenian `sl', Spanish `es',
|
||||
Swedish `sv', and Turkish `tr'.
|
||||
|
||||
For example, you may reach the Chinese translation team by writing to
|
||||
`zh@li.org'.
|
||||
@@ -160,55 +162,53 @@ message to `sv-request@li.org', having this message body:
|
||||
*actively* in translations, or at solving translational difficulties,
|
||||
rather than merely lurking around. If your team does not exist yet and
|
||||
you want to start one, or if you are unsure about what to do or how to
|
||||
get started, please write to `gnu-translation@gnu.ai.mit.edu' to reach
|
||||
the GNU coordinator for all translator teams.
|
||||
get started, please write to `translation@iro.umontreal.ca' to reach the
|
||||
coordinator for all translator teams.
|
||||
|
||||
The English team is special. It works at improving and uniformizing
|
||||
the terminology used in GNU. Proven linguistic skill are praised more
|
||||
than programming skill, here. For the time being, please avoid
|
||||
subscribing to the English team unless explicitly invited to do so.
|
||||
the terminology in use. Proven linguistic skill are praised more than
|
||||
programming skill, here.
|
||||
|
||||
Available Packages
|
||||
==================
|
||||
|
||||
Languages are not equally supported in all GNU packages. The
|
||||
following matrix shows the current state of GNU internationalization,
|
||||
as of December 1996. The matrix shows, in regard of each package, for
|
||||
which languages PO files have been submitted to translation
|
||||
coordination.
|
||||
Languages are not equally supported in all packages. The following
|
||||
matrix shows the current state of internationalization, as of December
|
||||
1997. The matrix shows, in regard of each package, for which languages
|
||||
PO files have been submitted to translation coordination.
|
||||
|
||||
Ready PO files cs de en es fi fr ja ko nl no pl pt sl sv
|
||||
.-------------------------------------------.
|
||||
bash | [] [] [] | 3
|
||||
bison | [] [] [] | 3
|
||||
clisp | [] [] [] | 3
|
||||
cpio | [] [] [] [] | 4
|
||||
diffutils | [] [] [] [] | 4
|
||||
enscript | [] [] [] [] [] | 5
|
||||
fileutils | [] [] [] [] [] [] [] [] | 8
|
||||
findutils | [] [] [] [] [] [] | 6
|
||||
flex | [] [] | 2
|
||||
gcal | [] [] [] | 3
|
||||
gettext | [] [] [] [] [] [] [] [] [] [] | 11
|
||||
grep | [] [] [] [] [] [] [] [] | 8
|
||||
hello | [] [] [] [] [] [] [] [] [] [] | 10
|
||||
id-utils | [] [] | 2
|
||||
indent | | 0
|
||||
libc | [] [] [] [] [] [] | 6
|
||||
m4 | [] [] [] [] [] | 5
|
||||
make | [] [] [] [] [] | 5
|
||||
music | [] | 1
|
||||
ptx | [] [] [] [] [] [] [] [] | 8
|
||||
recode | [] [] [] [] [] [] [] | 7
|
||||
sh-utils | [] [] [] [] [] | 5
|
||||
sharutils | [] [] [] [] | 4
|
||||
tar | [] [] [] [] [] [] [] [] [] | 9
|
||||
texinfo | | 0
|
||||
textutils | [] [] [] [] [] [] | 6
|
||||
wdiff | [] [] [] [] [] [] [] [] | 8
|
||||
`-------------------------------------------'
|
||||
14 languages cs de en es fi fr ja ko nl no pl pt sl sv
|
||||
27 packages 1 21 1 11 1 24 1 8 20 7 14 6 7 14 136
|
||||
Ready PO files cs da de en es fi fr it ja ko nl no pl pt ru sl sv
|
||||
.----------------------------------------------------.
|
||||
bash | [] [] [] | 3
|
||||
bison | [] [] [] | 3
|
||||
clisp | [] [] [] [] | 4
|
||||
cpio | [] [] [] [] [] [] | 6
|
||||
diffutils | [] [] [] [] [] | 5
|
||||
enscript | [] [] [] [] [] [] | 6
|
||||
fileutils | [] [] [] [] [] [] [] [] [] [] | 10
|
||||
findutils | [] [] [] [] [] [] [] [] [] | 9
|
||||
flex | [] [] [] [] | 4
|
||||
gcal | [] [] [] [] [] | 5
|
||||
gettext | [] [] [] [] [] [] [] [] [] [] [] | 12
|
||||
grep | [] [] [] [] [] [] [] [] [] [] | 10
|
||||
hello | [] [] [] [] [] [] [] [] [] [] [] | 11
|
||||
id-utils | [] [] [] | 3
|
||||
indent | [] [] [] [] [] | 5
|
||||
libc | [] [] [] [] [] [] [] | 7
|
||||
m4 | [] [] [] [] [] [] | 6
|
||||
make | [] [] [] [] [] [] | 6
|
||||
music | [] [] | 2
|
||||
ptx | [] [] [] [] [] [] [] [] | 8
|
||||
recode | [] [] [] [] [] [] [] [] [] | 9
|
||||
sh-utils | [] [] [] [] [] [] [] [] | 8
|
||||
sharutils | [] [] [] [] [] [] | 6
|
||||
tar | [] [] [] [] [] [] [] [] [] [] [] | 11
|
||||
texinfo | [] [] [] | 3
|
||||
textutils | [] [] [] [] [] [] [] [] [] | 9
|
||||
wdiff | [] [] [] [] [] [] [] [] | 8
|
||||
`----------------------------------------------------'
|
||||
17 languages cs da de en es fi fr it ja ko nl no pl pt ru sl sv
|
||||
27 packages 6 4 25 1 18 1 26 2 1 12 20 9 19 7 4 7 17 179
|
||||
|
||||
Some counters in the preceding matrix are higher than the number of
|
||||
visible blocks let us expect. This is because a few extra PO files are
|
||||
@@ -219,8 +219,8 @@ dialects.
|
||||
which it applies should also have been internationalized and
|
||||
distributed as such by its maintainer. There might be an observable
|
||||
lag between the mere existence a PO file and its wide availability in a
|
||||
GNU distribution.
|
||||
distribution.
|
||||
|
||||
If December 1996 seems to be old, you may fetch a more recent copy
|
||||
If December 1997 seems to be old, you may fetch a more recent copy
|
||||
of this `ABOUT-NLS' file on most GNU archive sites.
|
||||
|
||||
|
||||
9
COPYING
9
COPYING
@@ -2,7 +2,7 @@
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
@@ -279,7 +279,7 @@ POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
Appendix: How to Apply These Terms to Your New Programs
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
@@ -304,8 +304,9 @@ the "copyright" line and a pointer to where the full notice is found.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
|
||||
23
GNUmakefile
Normal file
23
GNUmakefile
Normal file
@@ -0,0 +1,23 @@
|
||||
# Having a separate GNUmakefile lets me `include' the dynamically
|
||||
# generated rules created via Makefile.maint as well as Makefile.maint itself.
|
||||
# This makefile is used only if you run GNU Make.
|
||||
# It is necessary if you want to build targets usually of interest
|
||||
# only to the maintainer.
|
||||
|
||||
have-Makefile := $(shell test -f Makefile && echo yes)
|
||||
|
||||
# If the user runs GNU make but has not yet run ./configure,
|
||||
# give them a diagnostic.
|
||||
ifeq ($(have-Makefile),yes)
|
||||
|
||||
include Makefile
|
||||
include $(srcdir)/Makefile.maint
|
||||
|
||||
else
|
||||
|
||||
all:
|
||||
@echo There seems to be no Makefile in this directory.
|
||||
@echo "You must run ./configure before running \`make'."
|
||||
@exit 1
|
||||
|
||||
endif
|
||||
7
INSTALL
7
INSTALL
@@ -31,7 +31,7 @@ The simplest way to compile this package is:
|
||||
`sh ./configure' instead to prevent `csh' from trying to execute
|
||||
`configure' itself.
|
||||
|
||||
Running `configure' takes a while. While running, it prints some
|
||||
Running `configure' takes awhile. While running, it prints some
|
||||
messages telling which features it is checking for.
|
||||
|
||||
2. Type `make' to compile the package.
|
||||
@@ -167,7 +167,9 @@ operates.
|
||||
`--quiet'
|
||||
`--silent'
|
||||
`-q'
|
||||
Do not print messages saying which checks are being made.
|
||||
Do not print messages saying which checks are being made. To
|
||||
suppress all normal output, redirect it to `/dev/null' (any error
|
||||
messages will still be shown).
|
||||
|
||||
`--srcdir=DIR'
|
||||
Look for the package's source code in directory DIR. Usually
|
||||
@@ -178,4 +180,3 @@ operates.
|
||||
script, and exit.
|
||||
|
||||
`configure' also accepts some other, not widely useful, options.
|
||||
|
||||
|
||||
44
Makefile.maint
Normal file
44
Makefile.maint
Normal file
@@ -0,0 +1,44 @@
|
||||
# -*-Makefile-*-
|
||||
# This Makefile fragment is shared between fileutils, sh-utils, textutils.
|
||||
|
||||
maintainer-check:
|
||||
if head ChangeLog| grep 'Version $(VERSION)' > /dev/null; then \
|
||||
:; \
|
||||
else \
|
||||
echo "$(VERSION) not in ChangeLog; not tagging" 1>&2; \
|
||||
exit 1; \
|
||||
fi
|
||||
$(MAKE) distcheck
|
||||
$(MAKE) my-distcheck
|
||||
|
||||
# Tag before making distribution. Also, don't make a distribution if
|
||||
# checks fail. Also, make sure the NEWS file is up-to-date.
|
||||
cvs-dist: maintainer-check
|
||||
pkg=`echo "$(PACKAGE)" | tr a-z A-Z`; \
|
||||
ver=`echo "$(VERSION)" | sed 's/\./_/g'`; \
|
||||
tag="$$pkg-$$ver"; \
|
||||
echo tag=$$tag; \
|
||||
if cvs -n log -h README| grep -e $$tag > /dev/null; then \
|
||||
echo "VERSION not new; not tagging" 1>&2; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
cvs update po; \
|
||||
cvs tag -c $$tag
|
||||
$(MAKE) dist
|
||||
|
||||
t=./=test
|
||||
my-distcheck: dist
|
||||
-rm -rf $(t)
|
||||
mkdir $(t)
|
||||
GZIP=$(GZIP) $(TAR) -C $(t) -zxf $(distdir).tar.gz
|
||||
cd $(t)/$(distdir) \
|
||||
&& ./configure --disable-nls \
|
||||
&& $(MAKE) \
|
||||
&& $(MAKE) dvi \
|
||||
&& $(MAKE) check \
|
||||
&& $(MAKE) distclean
|
||||
cd $(t) && $(TAR) --diff -z -f ../$(distdir).tar.gz
|
||||
-rm -rf $(t)
|
||||
@echo "========================"; \
|
||||
echo "$(distdir).tar.gz is ready for distribution"; \
|
||||
echo "========================"
|
||||
32
THANKS
32
THANKS
@@ -1,19 +1,47 @@
|
||||
This is just a start at listing e-mail addresses of contributors.
|
||||
The rest of the addresses are still in the ChangeLog.
|
||||
|
||||
Achim Blumensath: blume@corona.oche.de
|
||||
Andreas Schwab: schwab@issan.informatik.uni-dortmund.de
|
||||
Arne Henrik Juul: arnej@imf.unit.no
|
||||
Bauke Jan Douma: bjdouma@xs4all.nl
|
||||
Bengt Martensson: bengt@mathematik.uni-Bremen.de
|
||||
Bjorn Helgaas: helgaas@rsn.hp.com
|
||||
Charles Karney: karney@pppl.gov
|
||||
Dirk Lattermann: dlatt@t-online.de
|
||||
Don Parsons: dparsons@synapse.kent.edu
|
||||
Eirik Fuller: eirik@netcom.com
|
||||
Eli Zaretskii: eliz@is.elta.co.il
|
||||
Emile LeBlanc: leblanc@math.toronto.edu
|
||||
François Pinard: pinard@iro.umontreal.ca
|
||||
Galen Hazelwood: galenh@micron.net
|
||||
Göran Uddeborg: goeran@uddeborg.pp.se
|
||||
Greg McGary: gkm@eng.ascend.com
|
||||
Hugh Daniel: hugh@xanadu.com
|
||||
James: james@albion.glarp.com
|
||||
James Antill: jmanti%essex.ac.uk@seralph21.essex.ac.uk
|
||||
James Tanis: jtt@soscorp.com
|
||||
Jesse Thilo: jgt2@eecs.lehigh.edu
|
||||
Joakim Rosqvist: dvljrt@cs.umu.se
|
||||
John Gatewood Ham: zappaman@alphabox.compsci.buu.ac.th
|
||||
Kjetil Torgrim Homme: kjetilho@ifi.uio.no
|
||||
Lorne Baker: lbaker@nitro.avint.net
|
||||
Marcus Daniels: marcus@sysc.pdx.edu
|
||||
Mark A. Thomas: thommark@access.digex.net
|
||||
Mark Harris: mark@monitor.designacc.com
|
||||
Marty Leisner: leisner@sdsp.mc.xerox.com
|
||||
Masami Takikawa: takikawm@CS.ORST.EDU
|
||||
Matthew S. Levine: mslevine@theory.lcs.mit.edu
|
||||
Miles Bader: miles@gnu.ai.mit.edu
|
||||
Noel Cragg: noel@red-bean.com
|
||||
Peter Eriksson: peter@ifm.liu.se
|
||||
Paul Eggert: eggert@twinsun.com
|
||||
Philippe De Muyter: phdm@macqel.be
|
||||
Ross Ridge: rridge@calum.csclub.uwaterloo.ca
|
||||
Santiago Vila Doncel: sanvila@ctv.es
|
||||
Santiago Vila Doncel: sanvila@unex.es
|
||||
Stuart Kemp: skemp@peter.bmc.com
|
||||
Thomas Bushnell, n/BSG: thomas@gnu.ai.mit.edu
|
||||
Torbjorn Lindgren: tl@funcom.no
|
||||
Tony Leneis: tony@plaza.ds.adp.com
|
||||
Michael Veksler: mveksler@techunix.technion.ac.il
|
||||
Wayne Stewart: wstewa@atl.com
|
||||
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
## Process this file with automake to produce Makefile.in
|
||||
## Process this file with automake to produce Makefile.in -*-Makefile-*-
|
||||
info_TEXINFOS = fileutils.texi
|
||||
|
||||
# FIXME: remove texinfo.tex when automake has been fixed to include it
|
||||
# automatically
|
||||
EXTRA_DIST = perm.texi getdate.texi texinfo.tex
|
||||
EXTRA_DIST = perm.texi getdate.texi
|
||||
|
||||
# Tell makeinfo to put everything in a single info file: sh-utils.info.
|
||||
# Otherwise, it would also generate files with names like sh-utils.info-[123],
|
||||
|
||||
241
doc/Makefile.in
241
doc/Makefile.in
@@ -1,8 +1,14 @@
|
||||
# Makefile.in generated automatically by automake 1.1l from Makefile.am
|
||||
# Makefile.in generated automatically by automake 1.3 from Makefile.am
|
||||
|
||||
# Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc.
|
||||
# Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy, distribute and modify it.
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE.
|
||||
|
||||
|
||||
SHELL = /bin/sh
|
||||
@@ -26,32 +32,66 @@ mandir = @mandir@
|
||||
includedir = @includedir@
|
||||
oldincludedir = /usr/include
|
||||
|
||||
DISTDIR =
|
||||
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
|
||||
top_builddir = ..
|
||||
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
AUTOMAKE = @AUTOMAKE@
|
||||
AUTOHEADER = @AUTOHEADER@
|
||||
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||
transform = @program_transform_name@
|
||||
YACC = @YACC@
|
||||
GENCAT = @GENCAT@
|
||||
PERL = @PERL@
|
||||
MV = @MV@
|
||||
GMSGFMT = @GMSGFMT@
|
||||
|
||||
NORMAL_INSTALL = :
|
||||
PRE_INSTALL = :
|
||||
POST_INSTALL = :
|
||||
NORMAL_UNINSTALL = :
|
||||
PRE_UNINSTALL = :
|
||||
POST_UNINSTALL = :
|
||||
CATALOGS = @CATALOGS@
|
||||
CATOBJEXT = @CATOBJEXT@
|
||||
CC = @CC@
|
||||
CPP = @CPP@
|
||||
DATADIRNAME = @DATADIRNAME@
|
||||
DF_PROG = @DF_PROG@
|
||||
GENCAT = @GENCAT@
|
||||
GMOFILES = @GMOFILES@
|
||||
GMSGFMT = @GMSGFMT@
|
||||
GT_NO = @GT_NO@
|
||||
GT_YES = @GT_YES@
|
||||
INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@
|
||||
INSTOBJEXT = @INSTOBJEXT@
|
||||
INTLDEPS = @INTLDEPS@
|
||||
INTLLIBS = @INTLLIBS@
|
||||
INTLOBJS = @INTLOBJS@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
MKINSTALLDIRS = @MKINSTALLDIRS@
|
||||
MSGFMT = @MSGFMT@
|
||||
MVDIR_PROG = @MVDIR_PROG@
|
||||
PACKAGE = @PACKAGE@
|
||||
PERL = @PERL@
|
||||
POFILES = @POFILES@
|
||||
POSUB = @POSUB@
|
||||
RANLIB = @RANLIB@
|
||||
LN = @LN@
|
||||
RM = @RM@
|
||||
U = @U@
|
||||
USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
|
||||
USE_NLS = @USE_NLS@
|
||||
VERSION = @VERSION@
|
||||
YACC = @YACC@
|
||||
l = @l@
|
||||
|
||||
info_TEXINFOS = fileutils.texi
|
||||
|
||||
# FIXME: remove texinfo.tex when automake has been fixed to include it
|
||||
# automatically
|
||||
EXTRA_DIST = perm.texi getdate.texi texinfo.tex
|
||||
EXTRA_DIST = perm.texi getdate.texi
|
||||
|
||||
# Tell makeinfo to put everything in a single info file: sh-utils.info.
|
||||
# Otherwise, it would also generate files with names like sh-utils.info-[123],
|
||||
@@ -62,6 +102,7 @@ mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
|
||||
CONFIG_HEADER = ../config.h
|
||||
CONFIG_CLEAN_FILES =
|
||||
TEXI2DVI = texi2dvi
|
||||
TEXINFO_TEX = $(srcdir)/texinfo.tex
|
||||
INFO_DEPS = fileutils.info
|
||||
DVIS = fileutils.dvi
|
||||
TEXINFOS = fileutils.texi
|
||||
@@ -69,45 +110,44 @@ DIST_COMMON = Makefile.am Makefile.in mdate-sh stamp-vti texinfo.tex \
|
||||
version.texi
|
||||
|
||||
|
||||
PACKAGE = @PACKAGE@
|
||||
VERSION = @VERSION@
|
||||
|
||||
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) \
|
||||
$(TEXINFOS) $(MANS) $(EXTRA_DIST)
|
||||
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
|
||||
|
||||
TAR = tar
|
||||
default: all
|
||||
GZIP = --best
|
||||
all: Makefile $(INFO_DEPS)
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .texi .texinfo .info .dvi .ps
|
||||
$(srcdir)/Makefile.in: @MAINT@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL)
|
||||
cd $(top_srcdir) && automake --gnu doc/Makefile
|
||||
.SUFFIXES: .dvi .info .ps .texi .texinfo .txi
|
||||
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
|
||||
cd $(top_srcdir) && $(AUTOMAKE) --gnits doc/Makefile
|
||||
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
|
||||
cd $(top_builddir) \
|
||||
&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
|
||||
|
||||
|
||||
version.texi: @MAINT@stamp-vti
|
||||
version.texi: stamp-vti
|
||||
cp $(srcdir)/stamp-vti $(srcdir)/version.texi
|
||||
|
||||
stamp-vti: fileutils.texi $(top_srcdir)/configure.in
|
||||
echo "@set UPDATED `cd $(srcdir) \
|
||||
@echo "@set UPDATED `cd $(srcdir) \
|
||||
&& $(SHELL) ./mdate-sh fileutils.texi`" > vti.tmp
|
||||
echo "@set EDITION $(VERSION)" >> vti.tmp
|
||||
echo "@set VERSION $(VERSION)" >> vti.tmp
|
||||
cmp -s vti.tmp $(srcdir)/version.texi || cp vti.tmp $(srcdir)/version.texi
|
||||
rm vti.tmp
|
||||
echo timestamp > $(srcdir)/stamp-vti
|
||||
@echo "@set EDITION $(VERSION)" >> vti.tmp
|
||||
@echo "@set VERSION $(VERSION)" >> vti.tmp
|
||||
@cmp -s vti.tmp $(srcdir)/stamp-vti \
|
||||
|| (echo "Updating $(srcdir)/stamp-vti"; \
|
||||
cp vti.tmp $(srcdir)/stamp-vti)
|
||||
-@rm -f vti.tmp
|
||||
|
||||
mostlyclean-vti:
|
||||
rm -f vti.tmp
|
||||
-rm -f vti.tmp
|
||||
|
||||
clean-vti:
|
||||
|
||||
distclean-vti:
|
||||
|
||||
maintainer-clean-vti:
|
||||
@MAINT@rm -f stamp-vti version.texi
|
||||
-rm -f stamp-vti version.texi
|
||||
|
||||
fileutils.info: fileutils.texi version.texi
|
||||
fileutils.dvi: fileutils.texi version.texi
|
||||
@@ -116,6 +156,7 @@ fileutils.dvi: fileutils.texi version.texi
|
||||
DVIPS = dvips
|
||||
|
||||
.texi.info:
|
||||
@cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9]
|
||||
cd $(srcdir) \
|
||||
&& $(MAKEINFO) `echo $< | sed 's,.*/,,'`
|
||||
|
||||
@@ -123,41 +164,73 @@ DVIPS = dvips
|
||||
TEXINPUTS=$(srcdir):$$TEXINPUTS \
|
||||
MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $<
|
||||
|
||||
.texi:
|
||||
@cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9]
|
||||
cd $(srcdir) \
|
||||
&& $(MAKEINFO) `echo $< | sed 's,.*/,,'`
|
||||
|
||||
.texinfo.info:
|
||||
@cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9]
|
||||
cd $(srcdir) \
|
||||
&& $(MAKEINFO) `echo $< | sed 's,.*/,,'`
|
||||
|
||||
.texinfo:
|
||||
@cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9]
|
||||
cd $(srcdir) \
|
||||
&& $(MAKEINFO) `echo $< | sed 's,.*/,,'`
|
||||
|
||||
.texinfo.dvi:
|
||||
TEXINPUTS=$(srcdir):$$TEXINPUTS $(TEXI2DVI) $<
|
||||
TEXINPUTS=$(srcdir):$$TEXINPUTS \
|
||||
MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $<
|
||||
|
||||
.txi.info:
|
||||
@cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9]
|
||||
cd $(srcdir) \
|
||||
&& $(MAKEINFO) `echo $< | sed 's,.*/,,'`
|
||||
|
||||
.txi.dvi:
|
||||
TEXINPUTS=$(srcdir):$$TEXINPUTS \
|
||||
MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $<
|
||||
|
||||
.txi:
|
||||
@cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9]
|
||||
cd $(srcdir) \
|
||||
&& $(MAKEINFO) `echo $< | sed 's,.*/,,'`
|
||||
.dvi.ps:
|
||||
$(DVIPS) $< -o $@
|
||||
|
||||
install-info-am: $(INFO_DEPS)
|
||||
$(NORMAL_INSTALL)
|
||||
$(mkinstalldirs) $(infodir)
|
||||
@$(NORMAL_INSTALL)
|
||||
$(mkinstalldirs) $(DESTDIR)$(infodir)
|
||||
@for file in $(INFO_DEPS); do \
|
||||
for ifile in `cd $(srcdir) && echo $$file $$file-[0-9] $$file-[0-9][0-9]`; do \
|
||||
if test -f $(srcdir)/$$ifile; then \
|
||||
echo "$(INSTALL_DATA) $(srcdir)/$$ifile $(infodir)/$$ifile"; \
|
||||
$(INSTALL_DATA) $(srcdir)/$$ifile $(infodir)/$$ifile; \
|
||||
d=$(srcdir); \
|
||||
for ifile in `cd $$d && echo $$file $$file-[0-9] $$file-[0-9][0-9]`; do \
|
||||
if test -f $$d/$$ifile; then \
|
||||
echo " $(INSTALL_DATA) $$d/$$ifile $(DESTDIR)$(infodir)/$$ifile"; \
|
||||
$(INSTALL_DATA) $$d/$$ifile $(DESTDIR)$(infodir)/$$ifile; \
|
||||
else : ; fi; \
|
||||
done; \
|
||||
done
|
||||
$(POST_INSTALL)
|
||||
@if $(SHELL) -c 'install-info --version' >/dev/null 2>&1; then \
|
||||
@$(POST_INSTALL)
|
||||
@if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then \
|
||||
for file in $(INFO_DEPS); do \
|
||||
echo "install-info --info-dir=$(infodir) $(infodir)/$$file";\
|
||||
install-info --info-dir=$(infodir) $(infodir)/$$file; :;\
|
||||
echo " install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$file";\
|
||||
install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$file || :;\
|
||||
done; \
|
||||
else : ; fi
|
||||
|
||||
uninstall-info:
|
||||
if $(SHELL) -c 'install-info --version' >/dev/null 2>&1; then \
|
||||
$(PRE_UNINSTALL)
|
||||
@if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then \
|
||||
ii=yes; \
|
||||
else ii=; fi; \
|
||||
for file in $(INFO_DEPS); do \
|
||||
(cd $(infodir) && rm -f $$file $$file-[0-9] $$file-[0-9][0-9]); \
|
||||
test -z $ii || install-info --info-dir=$(infodir) --remove $$file; \
|
||||
test -z "$ii" \
|
||||
|| install-info --info-dir=$(DESTDIR)$(infodir) --remove $$file; \
|
||||
done
|
||||
@$(NORMAL_UNINSTALL)
|
||||
for file in $(INFO_DEPS); do \
|
||||
(cd $(DESTDIR)$(infodir) && rm -f $$file $$file-[0-9] $$file-[0-9][0-9]); \
|
||||
done
|
||||
|
||||
dist-info: $(INFO_DEPS)
|
||||
@@ -170,18 +243,24 @@ dist-info: $(INFO_DEPS)
|
||||
done; \
|
||||
done
|
||||
|
||||
mostlyclean-info:
|
||||
rm -f fileutils.aux fileutils.cp fileutils.cps fileutils.dvi \
|
||||
fileutils.fn fileutils.fns fileutils.ky fileutils.log \
|
||||
fileutils.pg fileutils.toc fileutils.tp fileutils.vr \
|
||||
fileutils.op
|
||||
mostlyclean-aminfo:
|
||||
-rm -f fileutils.aux fileutils.cp fileutils.cps fileutils.dvi \
|
||||
fileutils.fn fileutils.fns fileutils.ky fileutils.kys \
|
||||
fileutils.ps fileutils.log fileutils.pg fileutils.toc \
|
||||
fileutils.tp fileutils.tps fileutils.vr fileutils.vrs \
|
||||
fileutils.op fileutils.tr fileutils.cv fileutils.cn
|
||||
|
||||
clean-info:
|
||||
clean-aminfo:
|
||||
|
||||
distclean-info:
|
||||
distclean-aminfo:
|
||||
|
||||
maintainer-clean-info:
|
||||
for i in $(INFO_DEPS); do rm -f `eval echo $$i*`; done
|
||||
maintainer-clean-aminfo:
|
||||
for i in $(INFO_DEPS); do \
|
||||
rm -f $$i; \
|
||||
if test "`echo $$i-[0-9]*`" != "$$i-[0-9]*"; then \
|
||||
rm -f $$i-[0-9]*; \
|
||||
fi; \
|
||||
done
|
||||
tags: TAGS
|
||||
TAGS:
|
||||
|
||||
@@ -189,69 +268,73 @@ TAGS:
|
||||
distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
|
||||
|
||||
subdir = doc
|
||||
|
||||
distdir: $(DISTFILES)
|
||||
here=`cd $(top_builddir) && pwd`; \
|
||||
top_distdir=`cd $(top_distdir) && pwd`; \
|
||||
distdir=`cd $(distdir) && pwd`; \
|
||||
cd $(top_srcdir) \
|
||||
&& $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnits doc/Makefile
|
||||
@for file in $(DISTFILES); do \
|
||||
d=$(srcdir); \
|
||||
test -f $(distdir)/$$file \
|
||||
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
|
||||
|| cp -p $$d/$$file $(distdir)/$$file; \
|
||||
done
|
||||
$(MAKE) distdir="$(distdir)" dist-info
|
||||
$(MAKE) top_distdir="$(top_distdir)" distdir="$(distdir)" dist-info
|
||||
info: $(INFO_DEPS)
|
||||
dvi: $(DVIS)
|
||||
check: all
|
||||
$(MAKE)
|
||||
installcheck:
|
||||
install-exec:
|
||||
$(NORMAL_INSTALL)
|
||||
@$(NORMAL_INSTALL)
|
||||
|
||||
install-data: install-info-am
|
||||
$(NORMAL_INSTALL)
|
||||
@$(NORMAL_INSTALL)
|
||||
|
||||
install: install-exec install-data all
|
||||
@:
|
||||
|
||||
uninstall: uninstall-info
|
||||
|
||||
all: $(INFO_DEPS) Makefile
|
||||
|
||||
install-strip:
|
||||
$(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install
|
||||
$(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' INSTALL_SCRIPT='$(INSTALL_PROGRAM)' install
|
||||
installdirs:
|
||||
$(mkinstalldirs) $(infodir)
|
||||
$(mkinstalldirs) $(DESTDIR)$(infodir)
|
||||
|
||||
|
||||
mostlyclean-generic:
|
||||
test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
|
||||
-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
|
||||
|
||||
clean-generic:
|
||||
test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||
|
||||
distclean-generic:
|
||||
rm -f Makefile $(DISTCLEANFILES)
|
||||
rm -f config.cache config.log stamp-h
|
||||
test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||
-rm -f Makefile $(DISTCLEANFILES)
|
||||
-rm -f config.cache config.log stamp-h stamp-h[0-9]*
|
||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||
|
||||
maintainer-clean-generic:
|
||||
test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
|
||||
test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
|
||||
mostlyclean: mostlyclean-vti mostlyclean-info mostlyclean-generic
|
||||
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
|
||||
-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
|
||||
mostlyclean: mostlyclean-vti mostlyclean-aminfo mostlyclean-generic
|
||||
|
||||
clean: clean-vti clean-info clean-generic mostlyclean
|
||||
clean: clean-vti clean-aminfo clean-generic mostlyclean
|
||||
|
||||
distclean: distclean-vti distclean-info distclean-generic clean
|
||||
rm -f config.status
|
||||
distclean: distclean-vti distclean-aminfo distclean-generic clean
|
||||
-rm -f config.status
|
||||
|
||||
maintainer-clean: maintainer-clean-vti maintainer-clean-info \
|
||||
maintainer-clean: maintainer-clean-vti maintainer-clean-aminfo \
|
||||
maintainer-clean-generic distclean
|
||||
@echo "This command is intended for maintainers to use;"
|
||||
@echo "it deletes files that may require special tools to rebuild."
|
||||
|
||||
.PHONY: default mostlyclean-vti distclean-vti clean-vti \
|
||||
maintainer-clean-vti install-info-am uninstall-info mostlyclean-info \
|
||||
distclean-info clean-info maintainer-clean-info tags distdir info dvi \
|
||||
installcheck install-exec install-data install uninstall all \
|
||||
installdirs mostlyclean-generic distclean-generic clean-generic \
|
||||
.PHONY: mostlyclean-vti distclean-vti clean-vti maintainer-clean-vti \
|
||||
install-info-am uninstall-info mostlyclean-aminfo distclean-aminfo \
|
||||
clean-aminfo maintainer-clean-aminfo tags distdir info dvi installcheck \
|
||||
install-exec install-data install uninstall all installdirs \
|
||||
mostlyclean-generic distclean-generic clean-generic \
|
||||
maintainer-clean-generic clean mostlyclean distclean maintainer-clean
|
||||
|
||||
|
||||
|
||||
260
doc/getdate.texi
260
doc/getdate.texi
@@ -4,6 +4,8 @@
|
||||
@cindex date input formats
|
||||
@findex getdate
|
||||
|
||||
First, a quote:
|
||||
|
||||
@quotation
|
||||
Our units of temporal measurement, from seconds on up to months, are so
|
||||
complicated, asymmetrical and disjunctive so as to make coherent mental
|
||||
@@ -44,7 +46,7 @@ midnight, 1 January 1970 UCT.
|
||||
* General date syntax:: Common rules.
|
||||
* Calendar date item:: 19 Dec 1994.
|
||||
* Time of day item:: 9:20pm.
|
||||
* Timezone item:: EST, DST, BST, UCT, AHST, ...
|
||||
* Time zone item:: EST, DST, BST, UTC, ...
|
||||
* Day of week item:: Monday and others.
|
||||
* Relative item in date strings:: next tuesday, 2 years ago.
|
||||
* Pure numbers in date strings:: 19931219, 1440.
|
||||
@@ -203,161 +205,139 @@ indicates the first half of the day, @samp{pm} indicates the second
|
||||
half of the day. In this notation, 12 is the predecessor of 1:
|
||||
midnight is @samp{12am} while noon is @samp{12pm}.
|
||||
|
||||
@cindex timezone correction
|
||||
@cindex minutes, timezone correction by
|
||||
The time may alternatively be followed by a timezone correction,
|
||||
@cindex time zone correction
|
||||
@cindex minutes, time zone correction by
|
||||
The time may alternatively be followed by a time zone correction,
|
||||
expressed as @samp{@var{s}@var{hh}@var{mm}}, where @var{s} is @samp{+}
|
||||
or @samp{-}, @var{hh} is a number of zone hours and @var{mm} is a number
|
||||
of zone minutes. When a timezone correction is given this way, it
|
||||
forces interpretation of the time in UTC, overriding any previous
|
||||
specification for the timezone or the local timezone. The @var{minute}
|
||||
part of the time of the day may not be elided when a timezone correction
|
||||
is used. This is the only way to specify a timezone correction by
|
||||
of zone minutes. When a time zone correction is given this way, it
|
||||
forces interpretation of the time relative to
|
||||
Coordinated Universal Time (UTC), overriding any previous
|
||||
specification for the time zone or the local time zone. The @var{minute}
|
||||
part of the time of the day may not be elided when a time zone correction
|
||||
is used. This is the only way to specify a time zone correction by
|
||||
fractional parts of an hour.
|
||||
|
||||
Either @samp{am}/@samp{pm} or a timezone correction may be specified,
|
||||
Either @samp{am}/@samp{pm} or a time zone correction may be specified,
|
||||
but not both.
|
||||
|
||||
|
||||
@node Timezone item
|
||||
@section Timezone item
|
||||
@node Time zone item
|
||||
@section Time zone item
|
||||
|
||||
@cindex timezone item
|
||||
@cindex time zone item
|
||||
|
||||
A @dfn{timezone item} specifies an international timezone, indicated by
|
||||
a small set of letters. Any included period is ignored. Military
|
||||
timezone designations use a single letter. Currently, only integral
|
||||
zone hours may be represented in a timezone item. See the previous
|
||||
section for a finer control over the timezone correction.
|
||||
A @dfn{time zone item} specifies an international time zone, indicated by
|
||||
a small set of letters. They are supported for backward compatibility reasons,
|
||||
but they are not recommended because they are ambiguous in practice:
|
||||
for example, the abbreviation @samp{EST} has different meanings in
|
||||
Australia and the United States. Any included period is ignored. Military
|
||||
time zone designations use a single letter. Currently, only integral
|
||||
zone hours may be represented in a time zone item. See the previous
|
||||
section for a finer control over the time zone correction.
|
||||
|
||||
Here are many non-daylight-savings-time timezones, indexed by the zone
|
||||
Here are many non-daylight-saving-time time zones, indexed by the zone
|
||||
hour value.
|
||||
|
||||
@table @asis
|
||||
@item +000
|
||||
@cindex Greenwich Mean Time
|
||||
@cindex Universal Coordinated Time
|
||||
@cindex Western European Time
|
||||
@samp{GMT} for Greenwich Mean, @samp{UT} or @samp{UTC} for Universal
|
||||
(Coordinated), @samp{WET} for Western European and @samp{Z} for
|
||||
militaries.
|
||||
@item +100
|
||||
@cindex West African Time
|
||||
@samp{WAT} for West Africa and
|
||||
@samp{A} for militaries.
|
||||
@item +200
|
||||
@cindex Azores Time
|
||||
@samp{AT} for Azores and @samp{B} for militaries.
|
||||
@item +300
|
||||
@samp{C} for militaries.
|
||||
@item +400
|
||||
@cindex Atlantic Standard Time
|
||||
@samp{AST} for Atlantic Standard and @samp{D} for militaries.
|
||||
@item +500
|
||||
@cindex Eastern Standard Time
|
||||
@samp{E} for militaries and @samp{EST} for Eastern Standard.
|
||||
@item +600
|
||||
@cindex Central Standard Time
|
||||
@samp{CST} for Central Standard and @samp{F} for militaries.
|
||||
@item +700
|
||||
@cindex Mountain Standard Time
|
||||
@samp{G} for militaries and @samp{MST} for Mountain Standard.
|
||||
@item +800
|
||||
@cindex Pacific Standard Time
|
||||
@samp{H} for militaries and @samp{PST} for Pacific Standard.
|
||||
@item +900
|
||||
@cindex Yukon Standard Time
|
||||
@samp{I} for militaries and @samp{YST} for Yukon Standard.
|
||||
@item +1000
|
||||
@cindex Alaska-Hawaii Time
|
||||
@cindex Central Alaska Time
|
||||
@cindex Hawaii Standard Time
|
||||
@samp{AHST} for Alaska-Hawaii Standard, @samp{CAT} for Central Alaska,
|
||||
@samp{HST} for Hawaii Standard and @samp{K} for militaries.
|
||||
@item +1100
|
||||
@cindex Nome Standard Time
|
||||
@samp{L} for militaries and @samp{NT} for Nome.
|
||||
@item +1200
|
||||
@cindex International Date Line West
|
||||
@samp{IDLW} for International Date Line West and @samp{M} for
|
||||
militaries.
|
||||
@item -100
|
||||
@cindex Central European Time
|
||||
@cindex Middle European Time
|
||||
@cindex Middle European Winter Time
|
||||
@cindex French Winter Time
|
||||
@cindex Swedish Winter Time
|
||||
@samp{CET} for Central European, @samp{FWT} for French Winter,
|
||||
@samp{MET} for Middle European, @samp{MEWT} for Middle European
|
||||
Winter, @samp{N} for militaries and @samp{SWT} for Swedish Winter.
|
||||
@item -200
|
||||
@cindex Eastern European Time
|
||||
@cindex USSR Zone
|
||||
@samp{EET} for Eastern European, USSR Zone 1 and @samp{O} for militaries.
|
||||
@item -300
|
||||
@cindex Baghdad Time
|
||||
@samp{BT} for Baghdad, USSR Zone 2 and @samp{P} for militaries.
|
||||
@item -400
|
||||
@samp{Q} for militaries and @samp{ZP4} for USSR Zone 3.
|
||||
@item -500
|
||||
@samp{R} for militaries and @samp{ZP5} for USSR Zone 4.
|
||||
@item -600
|
||||
@samp{S} for militaries and @samp{ZP6} for USSR Zone 5.
|
||||
@item -700
|
||||
@cindex West Australian Standard Time
|
||||
@samp{T} for militaries and @samp{WAST} for West Australian Standard.
|
||||
@item -800
|
||||
@cindex China Coast Time
|
||||
@samp{CCT} for China Coast, USSR Zone 7 and @samp{U} for militaries.
|
||||
@item -900
|
||||
@cindex Japan Standard Time
|
||||
@samp{JST} for Japan Standard, USSR Zone 8 and @samp{V} for militaries.
|
||||
@item -1000
|
||||
@cindex East Australian Standard Time
|
||||
@cindex Guam Standard Time
|
||||
@samp{EAST} for East Australian Standard, @samp{GST} for Guam
|
||||
Standard, USSR Zone 9 and @samp{W} for militaries.
|
||||
@item -1200
|
||||
@samp{Y} for militaries.
|
||||
@item -1100
|
||||
@samp{X} for militaries.
|
||||
@item -1200
|
||||
@cindex International Date Line East
|
||||
@cindex New Zealand Standard Time
|
||||
@samp{IDLE} for International Date Line East, @samp{NZST} for
|
||||
New Zealand Standard, @samp{NZT} for New Zealand and @samp{Y} for
|
||||
militaries.
|
||||
@item -1000
|
||||
@samp{W} for militaries.
|
||||
@item -0900
|
||||
@samp{V} for militaries.
|
||||
@item -0800
|
||||
@samp{PST} for Pacific Standard, and
|
||||
@samp{U} for militaries.
|
||||
@item -0700
|
||||
@samp{MST} for Mountain Standard, and
|
||||
@samp{T} for militaries.
|
||||
@item -0600
|
||||
@samp{CST} for Central Standard, and
|
||||
@samp{S} for militaries.
|
||||
@item -0500
|
||||
@samp{EST} for Eastern Standard, and
|
||||
@samp{R} for militaries.
|
||||
@item -0400
|
||||
@samp{AST} for Atlantic Standard, and
|
||||
@samp{Q} for militaries.
|
||||
@item -0300
|
||||
@samp{P} for militaries.
|
||||
@item -0200
|
||||
@samp{O} for militaries.
|
||||
@item -0100
|
||||
@samp{N} for militaries.
|
||||
@item +0000
|
||||
@cindex Greenwich Mean Time
|
||||
@cindex Coordinated Universal Time
|
||||
@cindex Universal Coordinated Time
|
||||
@cindex Universal Time (Coordinated)
|
||||
@samp{GMT} for Greenwich Mean,
|
||||
@samp{UT} for Universal,
|
||||
@samp{UTC} for Coordinated Universal,
|
||||
@samp{WET} for Western European, and
|
||||
@samp{Z} for ISO 8601 and militaries.
|
||||
@item +0100
|
||||
@samp{A} for militaries,
|
||||
@samp{CET} for Central European,
|
||||
@samp{MET} for Midden Europesche Tijd (Dutch), and
|
||||
@samp{MEZ} for Mittel-Europ@"aische Zeit (German).
|
||||
@item +0200
|
||||
@samp{B} for militaries, and
|
||||
@samp{EET} for Eastern European.
|
||||
@item +0300
|
||||
@samp{C} for militaries.
|
||||
@item +0400
|
||||
@samp{D} for militaries.
|
||||
@item +0500
|
||||
@samp{E} for militaries.
|
||||
@item +0600
|
||||
@samp{F} for militaries.
|
||||
@item +0700
|
||||
@samp{G} for militaries.
|
||||
@item +0800
|
||||
@samp{H} for militaries.
|
||||
@item +0900
|
||||
@samp{I} for militaries, and
|
||||
@samp{JST} for Japan Standard.
|
||||
@item +1000
|
||||
@samp{GST} for Guam Standard, and
|
||||
@samp{K} for militaries.
|
||||
@item +1100
|
||||
@samp{L} for militaries.
|
||||
@item +1200
|
||||
@samp{M} for militaries, and
|
||||
@samp{NZST} for New Zealand Standard.
|
||||
@end table
|
||||
|
||||
@cindex daylight savings time
|
||||
Here are many DST timezones, indexed by the zone hour value. Also, by
|
||||
following a non-DST timezone by the string @samp{DST} in a separate word
|
||||
(that is, separated by some whitespace), the corresponding DST timezone
|
||||
@cindex daylight-saving time
|
||||
Here are many daylight-saving time (DST) time zones,
|
||||
indexed by the zone hour value. Also, by
|
||||
following a non-DST time zone by the string @samp{DST} in a separate word
|
||||
(that is, separated by some whitespace), the corresponding DST time zone
|
||||
may be specified.
|
||||
|
||||
@table @asis
|
||||
@item 0
|
||||
@samp{BST} for British Summer.
|
||||
@item +400
|
||||
@samp{ADT} for Atlantic Daylight.
|
||||
@item +500
|
||||
@samp{EDT} for Eastern Daylight.
|
||||
@item +600
|
||||
@samp{CDT} for Central Daylight.
|
||||
@item +700
|
||||
@samp{MDT} for Mountain Daylight.
|
||||
@item +800
|
||||
@item -0700
|
||||
@samp{PDT} for Pacific Daylight.
|
||||
@item +900
|
||||
@samp{YDT} for Yukon Daylight.
|
||||
@item +1000
|
||||
@samp{HDT} for Hawaii Daylight.
|
||||
@item -100
|
||||
@samp{MEST} for Middle European Summer, @samp{MESZ} for Middle European
|
||||
Summer, @samp{SST} for Swedish Summer and @samp{FST} for French Summer.
|
||||
@item -700
|
||||
@samp{WADT} for West Australian Daylight.
|
||||
@item -1000
|
||||
@samp{EADT} for Eastern Australian Daylight.
|
||||
@item -1200
|
||||
@item -0600
|
||||
@samp{MDT} for Mountain Daylight.
|
||||
@item -0500
|
||||
@samp{CDT} for Central Daylight.
|
||||
@item -0400
|
||||
@samp{EDT} for Eastern Daylight.
|
||||
@item -0300
|
||||
@samp{ADT} for Atlantic Daylight.
|
||||
@item +0100
|
||||
@samp{BST} for British Summer, and
|
||||
@samp{WEST} for Western European Summer.
|
||||
@item +0200
|
||||
@samp{CEST} for Central European Summer,
|
||||
@samp{MEST} for Midden Europesche S. Tijd (Dutch), and
|
||||
@samp{MESZ} for Mittel-Europ@"aische Sommerzeit (German).
|
||||
@item +1300
|
||||
@samp{NZDT} for New Zealand Daylight.
|
||||
@end table
|
||||
|
||||
@@ -487,15 +467,15 @@ year.
|
||||
@cindex MacKenzie, David
|
||||
@cindex Meyering, Jim
|
||||
@code{getdate} was originally implemented by Steven M. Bellovin
|
||||
(@samp{smb@@research.att.com}) while at the University of North Carolina
|
||||
(@email{smb@@research.att.com}) while at the University of North Carolina
|
||||
at Chapel Hill. The code was later tweaked by a couple of people on
|
||||
Usenet, then completely overhauled by Rich $alz (@samp{rsalz@@bbn.com})
|
||||
and Jim Berets (@samp{jberets@@bbn.com}) in August, 1990. Various
|
||||
Usenet, then completely overhauled by Rich $alz (@email{rsalz@@bbn.com})
|
||||
and Jim Berets (@email{jberets@@bbn.com}) in August, 1990. Various
|
||||
revisions for the GNU system were made by David MacKenzie, Jim Meyering,
|
||||
and others.
|
||||
|
||||
@cindex Pinard, F.
|
||||
@cindex Berry, K.
|
||||
This chapter was originally produced by Fran@,{c}ois Pinard
|
||||
(@samp{pinard@@iro.umontreal.ca}) from the @file{getdate.y} source code,
|
||||
and then edited by K.@: Berry (@samp{kb@@cs.umb.edu}).
|
||||
(@email{pinard@@iro.umontreal.ca}) from the @file{getdate.y} source code,
|
||||
and then edited by K.@: Berry (@email{kb@@cs.umb.edu}).
|
||||
|
||||
21
doc/mdate-sh
21
doc/mdate-sh
@@ -1,7 +1,7 @@
|
||||
#!/bin/sh
|
||||
# mdate-sh - get modification time of a file and pretty-print it.
|
||||
# Copyright (C) 1995, 1996 Free Software Foundation, Inc.
|
||||
# Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, June 1995
|
||||
# Get modification time of a file or directory and pretty-print it.
|
||||
# Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
|
||||
# written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, June 1995
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
@@ -14,8 +14,8 @@
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
# along with this program; if not, write to the Free Software Foundation,
|
||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
# Prevent date giving response in another language.
|
||||
LANG=C
|
||||
@@ -25,14 +25,15 @@ export LC_ALL
|
||||
LC_TIME=C
|
||||
export LC_TIME
|
||||
|
||||
# Get the extended ls output of the file.
|
||||
# Get the extended ls output of the file or directory.
|
||||
# On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below.
|
||||
if ls -L /dev/null 1>/dev/null 2>&1; then
|
||||
set - `ls -L -l $1`
|
||||
set - x`ls -L -l -d $1`
|
||||
else
|
||||
set - `ls -l $1`
|
||||
set - x`ls -l -d $1`
|
||||
fi
|
||||
# The month is at least the fourth argument.
|
||||
# (3 shifts here, the next inside the loop)
|
||||
# The month is at least the fourth argument
|
||||
# (3 shifts here, the next inside the loop).
|
||||
shift
|
||||
shift
|
||||
shift
|
||||
|
||||
@@ -120,8 +120,7 @@ by the Foundation.
|
||||
@cindex shell utilities
|
||||
@cindex utilities for shell programming
|
||||
|
||||
This manual minimally documents version @value{VERSION} of the GNU shell
|
||||
utilities.
|
||||
This manual documents version @value{VERSION} of the GNU shell utilities.
|
||||
|
||||
@menu
|
||||
* Introduction:: Caveats, overview, and authors.
|
||||
@@ -167,7 +166,7 @@ The GNU shell utilities are mostly compatible with the POSIX.2 standard.
|
||||
@c This paragraph appears in all of fileutils.texi, textutils.texi, and
|
||||
@c sh-utils.texi too -- so be sure to keep them consistent.
|
||||
@cindex bugs, reporting
|
||||
Please report bugs to @samp{sh-utils-bugs@@gnu.ai.mit.edu}. Remember
|
||||
Please report bugs to @samp{sh-utils-bugs@@gnu.org}. Remember
|
||||
to include the version number, machine architecture, input files, and
|
||||
any other information needed to reproduce the bug: your input, what you
|
||||
expected, what you got, and why it is wrong. Diffs are welcome, but
|
||||
@@ -182,8 +181,10 @@ sometimes difficult to infer. @xref{Bugs, , , gcc, GNU CC}.
|
||||
@cindex Pinard, @value{Francois}
|
||||
@cindex Berry, Karl
|
||||
@cindex Stallman, Richard
|
||||
This manual is based on the Unix man pages in the distribution, which
|
||||
were originally written by David MacKenzie and updated by Jim Meyering.
|
||||
This manual was originally derived from the Unix man pages in the
|
||||
distribution, which were written by David MacKenzie and updated by Jim
|
||||
Meyering. What you are reading now is the authoritative documentation
|
||||
for these utilities; the man pages are no longer being maintained.
|
||||
@value{Francois} Pinard did the initial conversion to Texinfo format.
|
||||
Karl Berry did the indexing, some reorganization, and editing of the results.
|
||||
Richard Stallman contributed his usual invaluable insights to the
|
||||
@@ -717,53 +718,92 @@ Exit status:
|
||||
@end display
|
||||
|
||||
@menu
|
||||
* Relations for expr:: | & < <= = == != >= >
|
||||
* String expressions:: <colon> match substr index length quote
|
||||
* Numeric expressions:: + - * / %
|
||||
* String expressions:: <colon> match substr index length
|
||||
* Relations for expr:: | & < <= = == != >= >
|
||||
* Examples of expr:: Examples.
|
||||
@end menu
|
||||
|
||||
|
||||
@node Relations for expr
|
||||
@subsection Relations for @code{expr}
|
||||
@node String expressions
|
||||
@subsection String expressions
|
||||
|
||||
@cindex connectives, logical
|
||||
@cindex logical connectives
|
||||
@cindex relations, numeric or string
|
||||
@cindex string expressions
|
||||
@cindex expressions, string
|
||||
|
||||
The usual logical connectives and relations, in order of precedence.
|
||||
@code{expr} supports pattern matching and other string operators. These
|
||||
have lower precedence than both the numeric and relational operators (in
|
||||
the next sections).
|
||||
|
||||
@table @samp
|
||||
|
||||
@item |
|
||||
@kindex |
|
||||
@cindex logical or operator
|
||||
@cindex or operator
|
||||
Yields its first argument if it is neither null nor 0, otherwise its
|
||||
second argument.
|
||||
@item @var{string} : @var{regex}
|
||||
@cindex pattern matching
|
||||
@cindex regular expression matching
|
||||
@cindex matching patterns
|
||||
Perform pattern matching. The arguments are coerced to strings and the
|
||||
second is considered to be a (basic, a la GNU @code{grep}) regular
|
||||
expression, with a @code{^} implicitly prepended. The first argument is
|
||||
then matched against this regular expression.
|
||||
|
||||
@item &
|
||||
@kindex &
|
||||
@cindex logical and operator
|
||||
@cindex and operator
|
||||
Yields its first argument if neither argument is null or 0, otherwise
|
||||
0.
|
||||
If the match succeeds and @var{regex} uses @samp{\(} and @samp{\)}, the
|
||||
@code{:} expression returns the part of @var{string} that matched the
|
||||
subexpression; otherwise, it returns the number of characters matched.
|
||||
|
||||
@item < <= = == != >= >
|
||||
@kindex <
|
||||
@kindex <=
|
||||
@kindex =
|
||||
@kindex ==
|
||||
@kindex >
|
||||
@kindex >=
|
||||
@cindex comparison operators
|
||||
Compare the arguments and return 1 if the relation is true, 0 otherwise.
|
||||
@code{==} is a synonym for @code{=}. @code{expr} first tries to coerce
|
||||
both arguments to numbers and do a numeric comparison; if either
|
||||
coercion fails, it does a lexicographic comparison.
|
||||
If the match fails, the @code{:} operator returns the null string if
|
||||
@samp{\(} and @samp{\)} are used in @var{regex}, otherwise 0.
|
||||
|
||||
@kindex \( @r{regexp operator}
|
||||
Only the first @samp{\( @dots{} \)} pair is relevant to the return
|
||||
value; additional pairs are meaningful only for grouping the regular
|
||||
expression operators.
|
||||
|
||||
@kindex \+ @r{regexp operator}
|
||||
@kindex \? @r{regexp operator}
|
||||
@kindex \| @r{regexp operator}
|
||||
In the regular expression, @code{\+}, @code{\?}, and @code{\|} are
|
||||
operators which respectively match one or more, zero or one, or separate
|
||||
alternatives. SunOS and other @code{expr}'s treat these as regular
|
||||
characters. (POSIX allows either behavior.)
|
||||
@xref{Top, , Regular Expression Library, regex, Regex}, for details of
|
||||
regular expression syntax. Some examples are in @ref{Examples of expr}.
|
||||
|
||||
@item match @var{string} @var{regex}
|
||||
@findex match
|
||||
An alternative way to do pattern matching. This is the same as
|
||||
@w{@samp{@var{string} : @var{regex}}}.
|
||||
|
||||
@item substr @var{string} @var{position} @var{length}
|
||||
@findex substr
|
||||
Returns the substring of @var{string} beginning at @var{position}
|
||||
with length at most @var{length}. If either @var{position} or
|
||||
@var{length} is negative, zero, or non-numeric, returns the null string.
|
||||
|
||||
@item index @var{string} @var{charset}
|
||||
@findex index
|
||||
Returns the first position in @var{string} where the first character in
|
||||
@var{charset} was found. If no character in @var{charset} is found in
|
||||
@var{string}, return 0.
|
||||
|
||||
@item length @var{string}
|
||||
@findex length
|
||||
Returns the length of @var{string}.
|
||||
|
||||
@item quote @var{token}
|
||||
@findex quote
|
||||
Interpret @var{token} as a string, even if it is a keyword like @var{match}
|
||||
or an operator like @code{/}.
|
||||
This makes it possible to test @code{expr length quote "$x"} or
|
||||
@code{expr quote "$x" : '.*/\(.\)'} and have it do the right thing even if
|
||||
the value of @var{$x} happens to be (for example) @code{/} or @code{index}.
|
||||
This operator is a GNU extension. It is disabled when
|
||||
the environment variable @var{POSIXLY_CORRECT} is set.
|
||||
|
||||
@end table
|
||||
|
||||
To make @code{expr} interpret keywords as strings, you must use the
|
||||
@code{quote} operator.
|
||||
|
||||
|
||||
@node Numeric expressions
|
||||
@subsection Numeric expressions
|
||||
@@ -771,9 +811,9 @@ coercion fails, it does a lexicographic comparison.
|
||||
@cindex numeric expressions
|
||||
@cindex expressions, numeric
|
||||
|
||||
Numeric operators, in order of increasing precedence. The connectives
|
||||
(previous section) have higher precedence, the string operators
|
||||
(following section) have lower.
|
||||
@code{expr} supports the usual numeric operators, in order of increasing
|
||||
precedence. The string operators (previous section) have lower precedence,
|
||||
the connectives (next section) have higher.
|
||||
|
||||
@table @samp
|
||||
|
||||
@@ -798,67 +838,51 @@ numbers; an error occurs if this cannot be done.
|
||||
@end table
|
||||
|
||||
|
||||
@node String expressions
|
||||
@subsection String expressions
|
||||
@node Relations for expr
|
||||
@subsection Relations for @code{expr}
|
||||
|
||||
@cindex string expressions
|
||||
@cindex expressions, string
|
||||
@cindex connectives, logical
|
||||
@cindex logical connectives
|
||||
@cindex relations, numeric or string
|
||||
|
||||
String operators. These have lowest precedence.
|
||||
@code{expr} supports the usual logical connectives and relations. These
|
||||
are higher precedence than either the string or numeric operators
|
||||
(previous sections). Here is the list, lowest-precedence operator first.
|
||||
|
||||
@table @samp
|
||||
|
||||
@item @var{string} : @var{regex}
|
||||
@cindex pattern matching
|
||||
@cindex regular expression matching
|
||||
@cindex matching patterns
|
||||
Perform pattern matching. The arguments are coerced to strings and the
|
||||
second is considered to be a (basic, a la @code{grep}) regular
|
||||
expression, with a @code{^} implicitly prepended. The first argument is
|
||||
then matched against this regular expression.
|
||||
@item |
|
||||
@kindex |
|
||||
@cindex logical or operator
|
||||
@cindex or operator
|
||||
Returns its first argument if that is neither null nor 0, otherwise its
|
||||
second argument.
|
||||
|
||||
If the match succeeds and @var{regex} uses @samp{\(} and @samp{\)}, the
|
||||
@code{:} expression returns the part of @var{string} that matched the
|
||||
subexpression; otherwise, it returns the number of characters matched.
|
||||
@item &
|
||||
@kindex &
|
||||
@cindex logical and operator
|
||||
@cindex and operator
|
||||
Return its first argument if neither argument is null or 0, otherwise
|
||||
0.
|
||||
|
||||
If the match fails, the @code{:} operator returns the null string if
|
||||
@samp{\(} and @samp{\)} are used in @var{regex}, otherwise 0.
|
||||
|
||||
Only the first @samp{\( @dots{} \)} pair is relevant to the return
|
||||
value; additional pairs are meaningful only for grouping the regular
|
||||
expression operators.
|
||||
|
||||
@xref{Top, , Regular Expression Library, regex, Regex}, for details of
|
||||
regular expression syntax.
|
||||
|
||||
@item match @var{string} @var{regex}
|
||||
@findex match
|
||||
An alternative way to do pattern matching. This is the same as
|
||||
@w{@samp{@var{string} : @var{regex}}}.
|
||||
|
||||
@item substr @var{string} @var{position} @var{length}
|
||||
@findex substr
|
||||
Returns the substring of @var{string} beginning at @var{position}
|
||||
with length at most @var{length}. If either @var{position} or
|
||||
@var{length} is negative or non-numeric, returns the null string.
|
||||
|
||||
@item index @var{string} @var{character-class}
|
||||
@findex index
|
||||
Returns the first position in @var{string} where the first character in
|
||||
@var{charset} was found. If no character in @var{charset} is found in
|
||||
@var{string}, return 0.
|
||||
|
||||
@item length @var{string}
|
||||
@findex length
|
||||
Returns the length of @var{string}.
|
||||
@item < <= = == != >= >
|
||||
@kindex <
|
||||
@kindex <=
|
||||
@kindex =
|
||||
@kindex ==
|
||||
@kindex >
|
||||
@kindex >=
|
||||
@cindex comparison operators
|
||||
Compare the arguments and return 1 if the relation is true, 0 otherwise.
|
||||
@code{==} is a synonym for @code{=}. @code{expr} first tries to coerce
|
||||
both arguments to numbers and do a numeric comparison; if either
|
||||
coercion fails, it does a lexicographic comparison.
|
||||
|
||||
@end table
|
||||
|
||||
The keywords cannot be used as strings.
|
||||
|
||||
|
||||
@node Examples of expr
|
||||
@subsection Examples of @code{expr}
|
||||
@subsection Examples of using @code{expr}
|
||||
|
||||
@cindex examples of @code{expr}
|
||||
Here are a few examples, including quoting for shell metacharacters.
|
||||
@@ -874,6 +898,12 @@ To print the non-directory part of the file name stored in
|
||||
expr $fname : '.*/\(^.*\)' '^|' $fname
|
||||
@end example
|
||||
|
||||
An example showing that @code{\+} is an operator:
|
||||
@example
|
||||
expr aaa : 'a\+'
|
||||
@result{} 3
|
||||
@end example
|
||||
|
||||
@example
|
||||
expr abc : 'a\(.\)c'
|
||||
@result{} b
|
||||
@@ -881,7 +911,8 @@ expr index abcdef cz
|
||||
@result{} 3
|
||||
expr index index a
|
||||
@error{} expr: syntax error
|
||||
|
||||
expr index quote index a
|
||||
@result{} 0
|
||||
@end example
|
||||
|
||||
|
||||
@@ -1109,15 +1140,16 @@ The only options are a lone @samp{--help} or
|
||||
Synopses:
|
||||
|
||||
@example
|
||||
stty [@var{setting}]@dots{}
|
||||
stty [@var{option}] [@var{setting}]@dots{}
|
||||
stty [@var{option}]
|
||||
@end example
|
||||
|
||||
If given no arguments, @code{stty} prints the baud rate, line
|
||||
If given no line settings, @code{stty} prints the baud rate, line
|
||||
discipline number (on systems that support it), and line settings
|
||||
that have been changed from the values set by @samp{stty sane}.
|
||||
Mode reading and setting are performed on the tty line connected to
|
||||
standard input.
|
||||
By default, mode reading and setting are performed on the tty line
|
||||
connected to standard input, although this can be modified by the
|
||||
@samp{--file} option.
|
||||
|
||||
@code{stty} accepts many non-option arguments that change aspects of
|
||||
the terminal line operation, as described below.
|
||||
@@ -1129,7 +1161,19 @@ The program accepts the following options. Also see @ref{Common options}.
|
||||
@itemx --all
|
||||
@opindex -a
|
||||
@opindex --all
|
||||
Print all current settings in human-readable form.
|
||||
Print all current settings in human-readable form. This option may not
|
||||
be used in combination with any line settings.
|
||||
|
||||
@item -F @var{device}
|
||||
@itemx --file @var{device}
|
||||
@opindex -F
|
||||
@opindex --file
|
||||
Set the line opened by the filename specified in @var{device} instead of
|
||||
the tty line connected to standard input. This option is necessary
|
||||
because opening a POSIX tty requires use of the @code{O_NONDELAY} flag to
|
||||
prevent a POSIX tty from blocking until the carrier detect line is high if
|
||||
the @code{clocal} flag is not set. Hence, it is not always possible
|
||||
to allow the shell to open the device in the traditional manner.
|
||||
|
||||
@item -g
|
||||
@itemx --save
|
||||
@@ -1137,7 +1181,8 @@ Print all current settings in human-readable form.
|
||||
@opindex --save
|
||||
@cindex machine-readable @code{stty} output
|
||||
Print all current settings in a form that can be used as an argument to
|
||||
another @code{stty} command to restore the current settings.
|
||||
another @code{stty} command to restore the current settings. This option
|
||||
may not be used in combination with any line settings.
|
||||
|
||||
@end table
|
||||
|
||||
@@ -2024,6 +2069,14 @@ After the login time, print the number of hours and minutes that the
|
||||
user has been idle. @samp{.} means the user was active in last minute.
|
||||
@samp{old} means the user was idle for more than 24 hours.
|
||||
|
||||
@item -l
|
||||
@itemx --lookup
|
||||
@opindex -l
|
||||
@opindex --lookup
|
||||
Attempt to canonicalize hostnames found in utmp through a DNS lookup. This
|
||||
is not the default because it can cause significant delays on systems with
|
||||
automatic dial-up internet access.
|
||||
|
||||
@item -H
|
||||
@itemx --heading
|
||||
@opindex -H
|
||||
@@ -2439,6 +2492,50 @@ use @samp{date --rfc}. I just did and saw this:
|
||||
Mon, 25 Mar 1996 23:34:17 -0600
|
||||
@end example
|
||||
|
||||
@item
|
||||
To convert a date string to the number of seconds since the epoch
|
||||
(which is 1970-01-01 00:00:00 UTC), use the @samp{--date} option with
|
||||
the @samp{%s} format. That can be useful in sorting and/or graphing
|
||||
and/or comparing data by date. The following command outputs the
|
||||
number of the seconds since the epoch for the time one second later
|
||||
than the epoch, but in time zone five hours later (Cambridge, Massachusetts),
|
||||
thus a total of five hours and one second after the epoch:
|
||||
|
||||
@example
|
||||
date --date='1970-01-01 00:00:01 UTC +5 hours' +%s
|
||||
18001
|
||||
@end example
|
||||
|
||||
Suppose you had @emph{not} specified time zone information in the example above.
|
||||
Then, date would have used your computer's idea of the time zone when
|
||||
interpreting the string. Here's what you would get if you were in
|
||||
Greenwich, England:
|
||||
|
||||
@example
|
||||
# local time zone used
|
||||
date --date='1970-01-01 00:00:01' +%s
|
||||
1
|
||||
@end example
|
||||
|
||||
@item
|
||||
If you're sorting or graphing dated data, your raw date values may be
|
||||
represented as seconds since the epoch. But few people can look at
|
||||
the date @samp{946684800} and casually note ``Oh, that's the first second
|
||||
of the year 2000.''
|
||||
|
||||
@example
|
||||
date --date='2000-01-01 UTC' +%s
|
||||
946684800
|
||||
@end example
|
||||
|
||||
To convert such an unwieldy number of seconds back to
|
||||
a more readable form, use a command like this:
|
||||
|
||||
@smallexample
|
||||
date -d '1970-01-01 946684800 sec' +"%Y-%m-%d %T %z"
|
||||
2000-01-01 00:00:00 +0000
|
||||
@end smallexample
|
||||
|
||||
@end itemize
|
||||
|
||||
|
||||
|
||||
1289
doc/texinfo.tex
1289
doc/texinfo.tex
File diff suppressed because it is too large
Load Diff
@@ -108,8 +108,7 @@ by the Foundation.
|
||||
@cindex text utilities
|
||||
@cindex utilities for text handling
|
||||
|
||||
This manual minimally documents version @value{VERSION} of the GNU text
|
||||
utilities.
|
||||
This manual documents version @value{VERSION} of the GNU text utilities.
|
||||
|
||||
@menu
|
||||
* Introduction:: Caveats, overview, and authors.
|
||||
@@ -143,15 +142,17 @@ The GNU text utilities are mostly compatible with the @sc{POSIX.2} standard.
|
||||
@c This paragraph appears in all of fileutils.texi, textutils.texi, and
|
||||
@c sh-utils.texi too -- so be sure to keep them consistent.
|
||||
@cindex bugs, reporting
|
||||
Please report bugs to @samp{textutils-bugs@@gnu.ai.mit.edu}. Remember
|
||||
Please report bugs to @email{textutils-bugs@@gnu.org}. Remember
|
||||
to include the version number, machine architecture, input files, and
|
||||
any other information needed to reproduce the bug: your input, what you
|
||||
expected, what you got, and why it is wrong. Diffs are welcome, but
|
||||
please include a description of the problem as well, since this is
|
||||
sometimes difficult to infer. @xref{Bugs, , , gcc, GNU CC}.
|
||||
|
||||
This manual is based on the Unix man pages in the distribution, which
|
||||
were originally written by David MacKenzie and updated by Jim Meyering.
|
||||
This manual was originally derived from the Unix man pages in the
|
||||
distribution, which were written by David MacKenzie and updated by Jim
|
||||
Meyering. What you are reading now is the authoritative documentation
|
||||
for these utilities; the man pages are no longer being maintained.
|
||||
The original @code{fmt} man page was written by Ross Paterson.
|
||||
Fran@,{c}ois Pinard did the initial conversion to Texinfo format.
|
||||
Karl Berry did the indexing, some reorganization, and editing of the results.
|
||||
@@ -571,6 +572,10 @@ string, or use this option more than once, @code{od} writes one copy
|
||||
of each output line using each of the data types that you specified,
|
||||
in the order that you specified.
|
||||
|
||||
Adding a trailing ``z'' to any type specification appends a display
|
||||
of the ASCII character representation of the printable characters
|
||||
to the output line generated by the type specification.
|
||||
|
||||
@table @samp
|
||||
@item a
|
||||
named character,
|
||||
@@ -996,10 +1001,10 @@ opened. (The exit status will still be nonzero, however.)
|
||||
@opindex -s
|
||||
Separate columns by a string @var{separator}. Don't use
|
||||
@samp{-s @var{separator}}, no space between flag and argument. If this
|
||||
option is omitted altogether, the default is a space, same as
|
||||
@samp{-s" "}. With @samp{-s} only, no separator is used, same as
|
||||
@samp{-s""}. @samp{-s} does not affect line truncation or column
|
||||
alignment.
|
||||
option is omitted altogether, the default is @key{TAB} together with
|
||||
@samp{-j} option and space otherwise (same as @samp{-s" "}). With
|
||||
@samp{-s} only, no separator is used (same as @samp{-s""}). @samp{-s}
|
||||
does not affect line truncation or column alignment.
|
||||
|
||||
@item -t
|
||||
@opindex -t
|
||||
@@ -1508,6 +1513,10 @@ wc --bytes --words
|
||||
@noindent
|
||||
prints both the byte counts and the word counts.
|
||||
|
||||
With the @code{--max-line-length} option, @code{wc} prints the length
|
||||
of the longest line per file, and if there is more than one file it
|
||||
prints the maximum (not the sum) of those lengths.
|
||||
|
||||
The program accepts the following options. Also see @ref{Common options}.
|
||||
|
||||
@table @samp
|
||||
@@ -1532,6 +1541,12 @@ Print only the word counts.
|
||||
@opindex --lines
|
||||
Print only the newline counts.
|
||||
|
||||
@item -L
|
||||
@itemx --max-line-length
|
||||
@opindex -L
|
||||
@opindex --max-line-length
|
||||
Print only the maximum line lengths.
|
||||
|
||||
@end table
|
||||
|
||||
|
||||
@@ -1630,7 +1645,7 @@ options}.
|
||||
If a @var{file} is specified as @samp{-} or if no files are given
|
||||
@code{md5sum} computes the checksum for the standard input.
|
||||
@code{md5sum} can also determine whether a file and checksum are
|
||||
consistent. Synopsis:
|
||||
consistent. Synopses:
|
||||
|
||||
@example
|
||||
md5sum [@var{option}]@dots{} [@var{file}]@dots{}
|
||||
@@ -1704,7 +1719,7 @@ Treat all input files as text files. This is the reverse of
|
||||
@opindex -w
|
||||
@opindex --warn
|
||||
@cindex verifying MD5 checksums
|
||||
When verifying checksums, warn about improperly formated MD5 checksum lines.
|
||||
When verifying checksums, warn about improperly formatted MD5 checksum lines.
|
||||
This option is useful only if all but a few lines in the checked input
|
||||
are valid.
|
||||
|
||||
@@ -2167,6 +2182,11 @@ Columns are separated by @key{TAB}.
|
||||
The options @samp{-1}, @samp{-2}, and @samp{-3} suppress printing of
|
||||
the corresponding columns. Also see @ref{Common options}.
|
||||
|
||||
Unlike some other comparison utilities, @code{comm} has an exit
|
||||
status that does not depend on the result of the comparison.
|
||||
Upon normal completion @code{comm} produces an exit code of zero.
|
||||
If there is an error it exits with nonzero status.
|
||||
|
||||
|
||||
@node Operating on fields within a line
|
||||
@chapter Operating on fields within a line
|
||||
@@ -2453,7 +2473,7 @@ used only in @var{set1} or @var{set2}, as noted below.
|
||||
|
||||
@table @asis
|
||||
|
||||
@item Backslash escapes.
|
||||
@item Backslash escapes
|
||||
@cindex backslash escapes
|
||||
|
||||
A backslash followed by a character not listed below causes an error
|
||||
@@ -2461,19 +2481,19 @@ message.
|
||||
|
||||
@table @samp
|
||||
@item \a
|
||||
Control-G,
|
||||
Control-G.
|
||||
@item \b
|
||||
Control-H,
|
||||
Control-H.
|
||||
@item \f
|
||||
Control-L,
|
||||
Control-L.
|
||||
@item \n
|
||||
Control-J,
|
||||
Control-J.
|
||||
@item \r
|
||||
Control-M,
|
||||
Control-M.
|
||||
@item \t
|
||||
Control-I,
|
||||
Control-I.
|
||||
@item \v
|
||||
Control-K,
|
||||
Control-K.
|
||||
@item \@var{ooo}
|
||||
The character with the value given by @var{ooo}, which is 1 to 3
|
||||
octal digits,
|
||||
@@ -2481,7 +2501,7 @@ octal digits,
|
||||
A backslash.
|
||||
@end table
|
||||
|
||||
@item Ranges.
|
||||
@item Ranges
|
||||
@cindex ranges
|
||||
|
||||
The notation @samp{@var{m}-@var{n}} expands to all of the characters
|
||||
@@ -2493,7 +2513,7 @@ enclose ranges, translations specified in that format will still work as
|
||||
long as the brackets in @var{string1} correspond to identical brackets
|
||||
in @var{string2}.
|
||||
|
||||
@item Repeated characters.
|
||||
@item Repeated characters
|
||||
@cindex repeated characters
|
||||
|
||||
The notation @samp{[@var{c}*@var{n}]} in @var{set2} expands to @var{n}
|
||||
@@ -2503,7 +2523,7 @@ to as many copies of @var{c} as are needed to make @var{set2} as long as
|
||||
@var{set1}. If @var{n} begins with @samp{0}, it is interpreted in
|
||||
octal, otherwise in decimal.
|
||||
|
||||
@item Character classes.
|
||||
@item Character classes
|
||||
@cindex characters classes
|
||||
|
||||
The notation @samp{[:@var{class}:]} expands to all of the characters in
|
||||
@@ -2558,7 +2578,7 @@ Uppercase letters.
|
||||
Hexadecimal digits.
|
||||
@end table
|
||||
|
||||
@item Equivalence classes.
|
||||
@item Equivalence classes
|
||||
@cindex equivalence classes
|
||||
|
||||
The syntax @samp{[=@var{c}=]} expands to all of the characters that are
|
||||
@@ -2676,6 +2696,24 @@ Convert each sequence of repeated newlines to a single newline:
|
||||
tr -s '\n'
|
||||
@end example
|
||||
|
||||
@item
|
||||
Find doubled occurrences of words in a document.
|
||||
For example, people often write ``the the'' with the duplicated words
|
||||
separated by a newline. The bourne shell script below works first
|
||||
by converting each sequence of punctuation and blank characters to a
|
||||
single newline. That puts each ``word'' on a line by itself.
|
||||
Next it maps all uppercase characters to lower case, and finally it
|
||||
runs @code{uniq} with the @samp{-d} option to print out only the words
|
||||
that were adjacent duplicates.
|
||||
|
||||
@example
|
||||
#!/bin/sh
|
||||
cat "$@@" \
|
||||
| tr -s '[:punct:][:blank:]' '\n' \
|
||||
| tr '[:upper:]' '[:lower:]' \
|
||||
| uniq -d
|
||||
@end example
|
||||
|
||||
@end itemize
|
||||
|
||||
|
||||
@@ -2820,10 +2858,10 @@ Robbins.
|
||||
@menu
|
||||
* Toolbox introduction::
|
||||
* I/O redirection::
|
||||
* The @code{who} command::
|
||||
* The @code{cut} command::
|
||||
* The @code{sort} command::
|
||||
* The @code{uniq} command::
|
||||
* The who command::
|
||||
* The cut command::
|
||||
* The sort command::
|
||||
* The uniq command::
|
||||
* Putting the tools together::
|
||||
@end menu
|
||||
|
||||
@@ -2938,7 +2976,7 @@ discussion, we will only present those command line options that interest
|
||||
us. As you should always do, double check your system documentation
|
||||
for the full story.
|
||||
|
||||
@node The @code{who} command
|
||||
@node The who command
|
||||
@unnumberedsec The @code{who} command
|
||||
|
||||
The first program is the @code{who} command. By itself, it generates a
|
||||
@@ -2960,7 +2998,7 @@ Unix systems, user names are never more than eight characters long. This
|
||||
little bit of trivia will be useful later. The output of @code{who} is nice,
|
||||
but the data is not all that exciting.
|
||||
|
||||
@node The @code{cut} command
|
||||
@node The cut command
|
||||
@unnumberedsec The @code{cut} command
|
||||
|
||||
The next program we'll look at is the @code{cut} command. This program
|
||||
@@ -2989,7 +3027,7 @@ With the @samp{-c} option, @code{cut} will cut out specific characters
|
||||
useful for data filtering.
|
||||
|
||||
|
||||
@node The @code{sort} command
|
||||
@node The sort command
|
||||
@unnumberedsec The @code{sort} command
|
||||
|
||||
Next we'll look at the @code{sort} command. This is one of the most
|
||||
@@ -3002,7 +3040,7 @@ making it into a filter). The sort is based on the machine collating
|
||||
sequence (@sc{ASCII}) or based on user-supplied ordering criteria.
|
||||
|
||||
|
||||
@node The @code{uniq} command
|
||||
@node The uniq command
|
||||
@unnumberedsec The @code{uniq} command
|
||||
|
||||
Finally (at least for now), we'll look at the @code{uniq} program. When
|
||||
|
||||
@@ -1,25 +1,27 @@
|
||||
## Process this file with automake to produce Makefile.in
|
||||
noinst_LIBRARIES = libfu.a
|
||||
## Process this file with automake to produce Makefile.in -*-Makefile-*-
|
||||
|
||||
## FIXME: Remove mvdir.c, and rmdir.c when
|
||||
## automake is fixed -- probably for 1.1g
|
||||
EXTRA_DIST = mkdir.c rmdir.c getline.c mktime.c strftime.c getgroups.c
|
||||
AUTOMAKE_OPTIONS = ../src/ansi2knr
|
||||
|
||||
noinst_LIBRARIES = libfu.a
|
||||
|
||||
INCLUDES = -I.. -I$(srcdir) -I../intl
|
||||
|
||||
libfu_a_SOURCES = getdate.y posixtm.y getopt.c getopt1.c \
|
||||
argmatch.c backupfile.c dirname.c filemode.c \
|
||||
full-write.c getversion.c idcache.c \
|
||||
isdir.c long-options.c makepath.c modechange.c path-concat.c \
|
||||
safe-read.c save-cwd.c savedir.c stripslash.c userspec.c xgetcwd.c \
|
||||
addext.c argmatch.c backupfile.c basename.c \
|
||||
closeout.c dirname.c exclude.c filemode.c \
|
||||
full-write.c human.c idcache.c \
|
||||
isdir.c long-options.c makepath.c modechange.c hash.c path-concat.c \
|
||||
quotearg.c safe-read.c save-cwd.c savedir.c stripslash.c userspec.c xgetcwd.c \
|
||||
xmalloc.c xstrdup.c xstrtol.c xstrtoul.c yesno.c
|
||||
|
||||
libfu_a_LIBADD = @LIBOBJS@ @ALLOCA@
|
||||
libfu_a_DEPENDENCIES = $(libfu_a_LIBADD)
|
||||
|
||||
noinst_HEADERS = argmatch.h backupfile.h error.h fnmatch.h fsusage.h \
|
||||
getline.h getopt.h group-member.h long-options.h makepath.h modechange.h \
|
||||
mountlist.h path-concat.h pathmax.h \
|
||||
save-cwd.h xstrtol.h xstrtoul.h
|
||||
noinst_HEADERS = argmatch.h backupfile.h closeout.h \
|
||||
error.h exclude.h fnmatch.h fsusage.h \
|
||||
getdate.h getline.h getopt.h group-member.h human.h long-options.h \
|
||||
makepath.h modechange.h mountlist.h hash.h path-concat.h pathmax.h \
|
||||
quotearg.h safe-read.h save-cwd.h savedir.h strverscmp.h \
|
||||
xalloc.h xstrtol.h xstrtoul.h
|
||||
|
||||
BUILT_SOURCES = getdate.c posixtm.c
|
||||
|
||||
455
lib/Makefile.in
455
lib/Makefile.in
@@ -1,8 +1,14 @@
|
||||
# Makefile.in generated automatically by automake 1.1l from Makefile.am
|
||||
# Makefile.in generated automatically by automake 1.3 from Makefile.am
|
||||
|
||||
# Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc.
|
||||
# Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy, distribute and modify it.
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE.
|
||||
|
||||
|
||||
SHELL = /bin/sh
|
||||
@@ -26,47 +32,87 @@ mandir = @mandir@
|
||||
includedir = @includedir@
|
||||
oldincludedir = /usr/include
|
||||
|
||||
DISTDIR =
|
||||
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
|
||||
top_builddir = ..
|
||||
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
AUTOMAKE = @AUTOMAKE@
|
||||
AUTOHEADER = @AUTOHEADER@
|
||||
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||
transform = @program_transform_name@
|
||||
YACC = @YACC@
|
||||
GENCAT = @GENCAT@
|
||||
PERL = @PERL@
|
||||
MV = @MV@
|
||||
GMSGFMT = @GMSGFMT@
|
||||
|
||||
NORMAL_INSTALL = :
|
||||
PRE_INSTALL = :
|
||||
POST_INSTALL = :
|
||||
NORMAL_UNINSTALL = :
|
||||
PRE_UNINSTALL = :
|
||||
POST_UNINSTALL = :
|
||||
CATALOGS = @CATALOGS@
|
||||
CATOBJEXT = @CATOBJEXT@
|
||||
CC = @CC@
|
||||
CPP = @CPP@
|
||||
DATADIRNAME = @DATADIRNAME@
|
||||
DF_PROG = @DF_PROG@
|
||||
GENCAT = @GENCAT@
|
||||
GMOFILES = @GMOFILES@
|
||||
GMSGFMT = @GMSGFMT@
|
||||
GT_NO = @GT_NO@
|
||||
GT_YES = @GT_YES@
|
||||
INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@
|
||||
INSTOBJEXT = @INSTOBJEXT@
|
||||
INTLDEPS = @INTLDEPS@
|
||||
INTLLIBS = @INTLLIBS@
|
||||
INTLOBJS = @INTLOBJS@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MKINSTALLDIRS = @MKINSTALLDIRS@
|
||||
MSGFMT = @MSGFMT@
|
||||
MVDIR_PROG = @MVDIR_PROG@
|
||||
PACKAGE = @PACKAGE@
|
||||
PERL = @PERL@
|
||||
POFILES = @POFILES@
|
||||
POSUB = @POSUB@
|
||||
RANLIB = @RANLIB@
|
||||
LN = @LN@
|
||||
RM = @RM@
|
||||
U = @U@
|
||||
USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
|
||||
USE_NLS = @USE_NLS@
|
||||
VERSION = @VERSION@
|
||||
YACC = @YACC@
|
||||
l = @l@
|
||||
|
||||
AUTOMAKE_OPTIONS = ../src/ansi2knr
|
||||
|
||||
noinst_LIBRARIES = libfu.a
|
||||
|
||||
EXTRA_DIST = mkdir.c rmdir.c getline.c mktime.c strftime.c getgroups.c
|
||||
|
||||
INCLUDES = -I.. -I$(srcdir) -I../intl
|
||||
|
||||
libfu_a_SOURCES = getdate.y posixtm.y getopt.c getopt1.c \
|
||||
argmatch.c backupfile.c dirname.c filemode.c \
|
||||
full-write.c getversion.c idcache.c \
|
||||
isdir.c long-options.c makepath.c modechange.c path-concat.c \
|
||||
safe-read.c save-cwd.c savedir.c stripslash.c userspec.c xgetcwd.c \
|
||||
addext.c argmatch.c backupfile.c basename.c \
|
||||
closeout.c dirname.c exclude.c filemode.c \
|
||||
full-write.c human.c idcache.c \
|
||||
isdir.c long-options.c makepath.c modechange.c hash.c path-concat.c \
|
||||
quotearg.c safe-read.c save-cwd.c savedir.c stripslash.c userspec.c xgetcwd.c \
|
||||
xmalloc.c xstrdup.c xstrtol.c xstrtoul.c yesno.c
|
||||
|
||||
libfu_a_LIBADD = @LIBOBJS@ @ALLOCA@
|
||||
libfu_a_DEPENDENCIES = $(libfu_a_LIBADD)
|
||||
|
||||
noinst_HEADERS = argmatch.h backupfile.h error.h fnmatch.h fsusage.h \
|
||||
getline.h getopt.h group-member.h long-options.h makepath.h modechange.h \
|
||||
mountlist.h path-concat.h pathmax.h \
|
||||
save-cwd.h xstrtol.h xstrtoul.h
|
||||
noinst_HEADERS = argmatch.h backupfile.h closeout.h \
|
||||
error.h exclude.h fnmatch.h fsusage.h \
|
||||
getdate.h getline.h getopt.h group-member.h human.h long-options.h \
|
||||
makepath.h modechange.h mountlist.h hash.h path-concat.h pathmax.h \
|
||||
quotearg.h safe-read.h save-cwd.h savedir.h strverscmp.h \
|
||||
xalloc.h xstrtol.h xstrtoul.h
|
||||
|
||||
BUILT_SOURCES = getdate.c posixtm.c
|
||||
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
|
||||
@@ -79,60 +125,64 @@ DEFS = @DEFS@ -I. -I$(srcdir) -I..
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBS = @LIBS@
|
||||
libfu_a_OBJECTS = getdate.o posixtm.o getopt.o getopt1.o argmatch.o \
|
||||
backupfile.o dirname.o filemode.o full-write.o getversion.o idcache.o \
|
||||
isdir.o long-options.o makepath.o modechange.o path-concat.o \
|
||||
safe-read.o save-cwd.o savedir.o stripslash.o userspec.o xgetcwd.o \
|
||||
xmalloc.o xstrdup.o xstrtol.o xstrtoul.o yesno.o
|
||||
ANSI2KNR = ../src/ansi2knr
|
||||
libfu_a_OBJECTS = getdate$U.o posixtm$U.o getopt$U.o getopt1$U.o \
|
||||
addext$U.o argmatch$U.o backupfile$U.o basename$U.o closeout$U.o \
|
||||
dirname$U.o exclude$U.o filemode$U.o full-write$U.o human$U.o \
|
||||
idcache$U.o isdir$U.o long-options$U.o makepath$U.o modechange$U.o \
|
||||
hash$U.o path-concat$U.o quotearg$U.o safe-read$U.o save-cwd$U.o \
|
||||
savedir$U.o stripslash$U.o userspec$U.o xgetcwd$U.o xmalloc$U.o \
|
||||
xstrdup$U.o xstrtol$U.o xstrtoul$U.o yesno$U.o
|
||||
AR = ar
|
||||
INTERLOCK = ./interlock
|
||||
YLWRAP = ./ylwrap
|
||||
YLWRAP = $(srcdir)/ylwrap
|
||||
CFLAGS = @CFLAGS@
|
||||
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
|
||||
LINK = $(CC) $(LDFLAGS) -o $@
|
||||
LINK = $(CC) $(CFLAGS) $(LDFLAGS) -o $@
|
||||
HEADERS = $(noinst_HEADERS)
|
||||
|
||||
DIST_COMMON = Makefile.am Makefile.in alloca.c basename.c error.c \
|
||||
DIST_COMMON = Makefile.am Makefile.in TODO alloca.c chown.c error.c \
|
||||
error.h euidaccess.c fileblocks.c fnmatch.c fsusage.c ftruncate.c \
|
||||
getdate.c getgroups.c getline.c group-member.c interlock memcmp.c \
|
||||
memcpy.c memset.c mkdir.c mktime.c mountlist.c obstack.c obstack.h \
|
||||
posixtm.c regex.c regex.h rename.c rmdir.c rpmatch.c rx.c rx.h stpcpy.c \
|
||||
strcasecmp.c strdup.c strndup.c strstr.c strtol.c strtoul.c ylwrap
|
||||
getdate.c getgroups.c getline.c group-member.c lchown.c lstat.c \
|
||||
malloc.c memcmp.c memcpy.c memset.c mkdir.c mktime.c mountlist.c \
|
||||
obstack.c obstack.h posixtm.c realloc.c regex.c regex.h rename.c \
|
||||
rmdir.c rpmatch.c rx.c rx.h stat.c stpcpy.c strcasecmp.c strdup.c \
|
||||
strftime.c strndup.c strstr.c strtol.c strtoul.c strverscmp.c ylwrap
|
||||
|
||||
|
||||
PACKAGE = @PACKAGE@
|
||||
VERSION = @VERSION@
|
||||
|
||||
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) \
|
||||
$(TEXINFOS) $(MANS) $(EXTRA_DIST)
|
||||
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
|
||||
|
||||
TAR = tar
|
||||
DEP_FILES = .deps/alloca.P .deps/argmatch.P .deps/backupfile.P \
|
||||
.deps/basename.P .deps/dirname.P .deps/error.P .deps/euidaccess.P \
|
||||
GZIP = --best
|
||||
DEP_FILES = .deps/addext.P .deps/alloca.P .deps/argmatch.P \
|
||||
.deps/backupfile.P .deps/basename.P .deps/chown.P .deps/closeout.P \
|
||||
.deps/dirname.P .deps/error.P .deps/euidaccess.P .deps/exclude.P \
|
||||
.deps/fileblocks.P .deps/filemode.P .deps/fnmatch.P .deps/fsusage.P \
|
||||
.deps/ftruncate.P .deps/full-write.P .deps/getdate.P .deps/getgroups.P \
|
||||
.deps/getline.P .deps/getopt.P .deps/getopt1.P .deps/getversion.P \
|
||||
.deps/group-member.P .deps/idcache.P .deps/isdir.P .deps/long-options.P \
|
||||
.deps/makepath.P .deps/memcmp.P .deps/memcpy.P .deps/memset.P \
|
||||
.deps/mkdir.P .deps/mktime.P .deps/modechange.P .deps/mountlist.P \
|
||||
.deps/obstack.P .deps/path-concat.P .deps/posixtm.P .deps/regex.P \
|
||||
.deps/ftruncate.P .deps/full-write.P .deps/getdate .deps/getdate.P \
|
||||
.deps/getgroups.P .deps/getline.P .deps/getopt.P .deps/getopt1.P \
|
||||
.deps/group-member.P .deps/hash.P .deps/human.P .deps/idcache.P \
|
||||
.deps/isdir.P .deps/lchown.P .deps/long-options.P .deps/lstat.P \
|
||||
.deps/makepath.P .deps/malloc.P .deps/memcmp.P .deps/memcpy.P \
|
||||
.deps/memset.P .deps/mkdir.P .deps/mktime.P .deps/modechange.P \
|
||||
.deps/mountlist.P .deps/obstack.P .deps/path-concat.P .deps/posixtm \
|
||||
.deps/posixtm.P .deps/quotearg.P .deps/realloc.P .deps/regex.P \
|
||||
.deps/rename.P .deps/rmdir.P .deps/rpmatch.P .deps/rx.P \
|
||||
.deps/safe-read.P .deps/save-cwd.P .deps/savedir.P .deps/stpcpy.P \
|
||||
.deps/strcasecmp.P .deps/strdup.P .deps/stripslash.P .deps/strndup.P \
|
||||
.deps/strstr.P .deps/strtol.P .deps/strtoul.P .deps/userspec.P \
|
||||
.deps/xgetcwd.P .deps/xmalloc.P .deps/xstrdup.P .deps/xstrtol.P \
|
||||
.deps/xstrtoul.P .deps/yesno.P
|
||||
.deps/safe-read.P .deps/save-cwd.P .deps/savedir.P .deps/stat.P \
|
||||
.deps/stpcpy.P .deps/strcasecmp.P .deps/strdup.P .deps/strftime.P \
|
||||
.deps/stripslash.P .deps/strndup.P .deps/strstr.P .deps/strtol.P \
|
||||
.deps/strtoul.P .deps/strverscmp.P .deps/userspec.P .deps/xgetcwd.P \
|
||||
.deps/xmalloc.P .deps/xstrdup.P .deps/xstrtol.P .deps/xstrtoul.P \
|
||||
.deps/yesno.P
|
||||
SOURCES = $(libfu_a_SOURCES)
|
||||
OBJECTS = $(libfu_a_OBJECTS)
|
||||
|
||||
default: all
|
||||
all: Makefile $(LIBRARIES) $(HEADERS)
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .c .o .y
|
||||
$(srcdir)/Makefile.in: @MAINT@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL)
|
||||
cd $(top_srcdir) && automake --gnu lib/Makefile
|
||||
.SUFFIXES: .S .c .o .s .y
|
||||
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
|
||||
cd $(top_srcdir) && $(AUTOMAKE) --gnits lib/Makefile
|
||||
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
|
||||
cd $(top_builddir) \
|
||||
&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
|
||||
|
||||
@@ -140,60 +190,240 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
|
||||
mostlyclean-noinstLIBRARIES:
|
||||
|
||||
clean-noinstLIBRARIES:
|
||||
test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
|
||||
-test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
|
||||
|
||||
distclean-noinstLIBRARIES:
|
||||
|
||||
maintainer-clean-noinstLIBRARIES:
|
||||
|
||||
.c.o:
|
||||
.s.o:
|
||||
$(COMPILE) -c $<
|
||||
|
||||
.S.o:
|
||||
$(COMPILE) -c $<
|
||||
|
||||
mostlyclean-compile:
|
||||
rm -f *.o core
|
||||
-rm -f *.o core *.core
|
||||
|
||||
clean-compile:
|
||||
|
||||
distclean-compile:
|
||||
rm -f *.tab.c
|
||||
-rm -f *.tab.c
|
||||
|
||||
maintainer-clean-compile:
|
||||
$(libfu_a_OBJECTS): ../config.h
|
||||
../src/ansi2knr: ../src/ansi2knr.o
|
||||
cd ../src && $(MAKE) ansi2knr
|
||||
|
||||
../src/ansi2knr.o:
|
||||
cd ../src && $(MAKE) ansi2knr.o
|
||||
|
||||
|
||||
mostlyclean-kr:
|
||||
-rm -f *_.c
|
||||
|
||||
clean-kr:
|
||||
|
||||
distclean-kr:
|
||||
|
||||
maintainer-clean-kr:
|
||||
|
||||
libfu.a: $(libfu_a_OBJECTS) $(libfu_a_DEPENDENCIES)
|
||||
rm -f libfu.a
|
||||
-rm -f libfu.a
|
||||
$(AR) cru libfu.a $(libfu_a_OBJECTS) $(libfu_a_LIBADD)
|
||||
$(RANLIB) libfu.a
|
||||
.y.c:
|
||||
$(SHELL) $(INTERLOCK) =yacclockdir $(YLWRAP) "$(YACC)" y.tab.c $*.c y.tab.h $*.h -- $(YFLAGS) $<
|
||||
$(SHELL) $(YLWRAP) "$(YACC)" $< y.tab.c $*.c y.tab.h $*.h -- $(YFLAGS)
|
||||
posixtm.h: posixtm.c
|
||||
getdate.h: getdate.c
|
||||
|
||||
addext_.c: addext.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/addext.c; then echo $(srcdir)/addext.c; else echo addext.c; fi` | $(ANSI2KNR) > addext_.c
|
||||
alloca_.c: alloca.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/alloca.c; then echo $(srcdir)/alloca.c; else echo alloca.c; fi` | $(ANSI2KNR) > alloca_.c
|
||||
argmatch_.c: argmatch.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/argmatch.c; then echo $(srcdir)/argmatch.c; else echo argmatch.c; fi` | $(ANSI2KNR) > argmatch_.c
|
||||
backupfile_.c: backupfile.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/backupfile.c; then echo $(srcdir)/backupfile.c; else echo backupfile.c; fi` | $(ANSI2KNR) > backupfile_.c
|
||||
basename_.c: basename.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/basename.c; then echo $(srcdir)/basename.c; else echo basename.c; fi` | $(ANSI2KNR) > basename_.c
|
||||
chown_.c: chown.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/chown.c; then echo $(srcdir)/chown.c; else echo chown.c; fi` | $(ANSI2KNR) > chown_.c
|
||||
closeout_.c: closeout.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/closeout.c; then echo $(srcdir)/closeout.c; else echo closeout.c; fi` | $(ANSI2KNR) > closeout_.c
|
||||
dirname_.c: dirname.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/dirname.c; then echo $(srcdir)/dirname.c; else echo dirname.c; fi` | $(ANSI2KNR) > dirname_.c
|
||||
error_.c: error.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/error.c; then echo $(srcdir)/error.c; else echo error.c; fi` | $(ANSI2KNR) > error_.c
|
||||
euidaccess_.c: euidaccess.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/euidaccess.c; then echo $(srcdir)/euidaccess.c; else echo euidaccess.c; fi` | $(ANSI2KNR) > euidaccess_.c
|
||||
exclude_.c: exclude.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/exclude.c; then echo $(srcdir)/exclude.c; else echo exclude.c; fi` | $(ANSI2KNR) > exclude_.c
|
||||
fileblocks_.c: fileblocks.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/fileblocks.c; then echo $(srcdir)/fileblocks.c; else echo fileblocks.c; fi` | $(ANSI2KNR) > fileblocks_.c
|
||||
filemode_.c: filemode.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/filemode.c; then echo $(srcdir)/filemode.c; else echo filemode.c; fi` | $(ANSI2KNR) > filemode_.c
|
||||
fnmatch_.c: fnmatch.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/fnmatch.c; then echo $(srcdir)/fnmatch.c; else echo fnmatch.c; fi` | $(ANSI2KNR) > fnmatch_.c
|
||||
fsusage_.c: fsusage.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/fsusage.c; then echo $(srcdir)/fsusage.c; else echo fsusage.c; fi` | $(ANSI2KNR) > fsusage_.c
|
||||
ftruncate_.c: ftruncate.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/ftruncate.c; then echo $(srcdir)/ftruncate.c; else echo ftruncate.c; fi` | $(ANSI2KNR) > ftruncate_.c
|
||||
full-write_.c: full-write.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/full-write.c; then echo $(srcdir)/full-write.c; else echo full-write.c; fi` | $(ANSI2KNR) > full-write_.c
|
||||
getdate_.c: getdate.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/getdate.c; then echo $(srcdir)/getdate.c; else echo getdate.c; fi` | $(ANSI2KNR) > getdate_.c
|
||||
getgroups_.c: getgroups.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/getgroups.c; then echo $(srcdir)/getgroups.c; else echo getgroups.c; fi` | $(ANSI2KNR) > getgroups_.c
|
||||
getline_.c: getline.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/getline.c; then echo $(srcdir)/getline.c; else echo getline.c; fi` | $(ANSI2KNR) > getline_.c
|
||||
getopt_.c: getopt.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/getopt.c; then echo $(srcdir)/getopt.c; else echo getopt.c; fi` | $(ANSI2KNR) > getopt_.c
|
||||
getopt1_.c: getopt1.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/getopt1.c; then echo $(srcdir)/getopt1.c; else echo getopt1.c; fi` | $(ANSI2KNR) > getopt1_.c
|
||||
group-member_.c: group-member.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/group-member.c; then echo $(srcdir)/group-member.c; else echo group-member.c; fi` | $(ANSI2KNR) > group-member_.c
|
||||
hash_.c: hash.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/hash.c; then echo $(srcdir)/hash.c; else echo hash.c; fi` | $(ANSI2KNR) > hash_.c
|
||||
human_.c: human.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/human.c; then echo $(srcdir)/human.c; else echo human.c; fi` | $(ANSI2KNR) > human_.c
|
||||
idcache_.c: idcache.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/idcache.c; then echo $(srcdir)/idcache.c; else echo idcache.c; fi` | $(ANSI2KNR) > idcache_.c
|
||||
isdir_.c: isdir.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/isdir.c; then echo $(srcdir)/isdir.c; else echo isdir.c; fi` | $(ANSI2KNR) > isdir_.c
|
||||
lchown_.c: lchown.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/lchown.c; then echo $(srcdir)/lchown.c; else echo lchown.c; fi` | $(ANSI2KNR) > lchown_.c
|
||||
long-options_.c: long-options.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/long-options.c; then echo $(srcdir)/long-options.c; else echo long-options.c; fi` | $(ANSI2KNR) > long-options_.c
|
||||
lstat_.c: lstat.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/lstat.c; then echo $(srcdir)/lstat.c; else echo lstat.c; fi` | $(ANSI2KNR) > lstat_.c
|
||||
makepath_.c: makepath.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/makepath.c; then echo $(srcdir)/makepath.c; else echo makepath.c; fi` | $(ANSI2KNR) > makepath_.c
|
||||
malloc_.c: malloc.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/malloc.c; then echo $(srcdir)/malloc.c; else echo malloc.c; fi` | $(ANSI2KNR) > malloc_.c
|
||||
memcmp_.c: memcmp.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/memcmp.c; then echo $(srcdir)/memcmp.c; else echo memcmp.c; fi` | $(ANSI2KNR) > memcmp_.c
|
||||
memcpy_.c: memcpy.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/memcpy.c; then echo $(srcdir)/memcpy.c; else echo memcpy.c; fi` | $(ANSI2KNR) > memcpy_.c
|
||||
memset_.c: memset.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/memset.c; then echo $(srcdir)/memset.c; else echo memset.c; fi` | $(ANSI2KNR) > memset_.c
|
||||
mkdir_.c: mkdir.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/mkdir.c; then echo $(srcdir)/mkdir.c; else echo mkdir.c; fi` | $(ANSI2KNR) > mkdir_.c
|
||||
mktime_.c: mktime.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/mktime.c; then echo $(srcdir)/mktime.c; else echo mktime.c; fi` | $(ANSI2KNR) > mktime_.c
|
||||
modechange_.c: modechange.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/modechange.c; then echo $(srcdir)/modechange.c; else echo modechange.c; fi` | $(ANSI2KNR) > modechange_.c
|
||||
mountlist_.c: mountlist.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/mountlist.c; then echo $(srcdir)/mountlist.c; else echo mountlist.c; fi` | $(ANSI2KNR) > mountlist_.c
|
||||
obstack_.c: obstack.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/obstack.c; then echo $(srcdir)/obstack.c; else echo obstack.c; fi` | $(ANSI2KNR) > obstack_.c
|
||||
path-concat_.c: path-concat.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/path-concat.c; then echo $(srcdir)/path-concat.c; else echo path-concat.c; fi` | $(ANSI2KNR) > path-concat_.c
|
||||
posixtm_.c: posixtm.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/posixtm.c; then echo $(srcdir)/posixtm.c; else echo posixtm.c; fi` | $(ANSI2KNR) > posixtm_.c
|
||||
quotearg_.c: quotearg.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/quotearg.c; then echo $(srcdir)/quotearg.c; else echo quotearg.c; fi` | $(ANSI2KNR) > quotearg_.c
|
||||
realloc_.c: realloc.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/realloc.c; then echo $(srcdir)/realloc.c; else echo realloc.c; fi` | $(ANSI2KNR) > realloc_.c
|
||||
regex_.c: regex.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/regex.c; then echo $(srcdir)/regex.c; else echo regex.c; fi` | $(ANSI2KNR) > regex_.c
|
||||
rename_.c: rename.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/rename.c; then echo $(srcdir)/rename.c; else echo rename.c; fi` | $(ANSI2KNR) > rename_.c
|
||||
rmdir_.c: rmdir.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/rmdir.c; then echo $(srcdir)/rmdir.c; else echo rmdir.c; fi` | $(ANSI2KNR) > rmdir_.c
|
||||
rpmatch_.c: rpmatch.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/rpmatch.c; then echo $(srcdir)/rpmatch.c; else echo rpmatch.c; fi` | $(ANSI2KNR) > rpmatch_.c
|
||||
rx_.c: rx.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/rx.c; then echo $(srcdir)/rx.c; else echo rx.c; fi` | $(ANSI2KNR) > rx_.c
|
||||
safe-read_.c: safe-read.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/safe-read.c; then echo $(srcdir)/safe-read.c; else echo safe-read.c; fi` | $(ANSI2KNR) > safe-read_.c
|
||||
save-cwd_.c: save-cwd.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/save-cwd.c; then echo $(srcdir)/save-cwd.c; else echo save-cwd.c; fi` | $(ANSI2KNR) > save-cwd_.c
|
||||
savedir_.c: savedir.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/savedir.c; then echo $(srcdir)/savedir.c; else echo savedir.c; fi` | $(ANSI2KNR) > savedir_.c
|
||||
stat_.c: stat.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/stat.c; then echo $(srcdir)/stat.c; else echo stat.c; fi` | $(ANSI2KNR) > stat_.c
|
||||
stpcpy_.c: stpcpy.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/stpcpy.c; then echo $(srcdir)/stpcpy.c; else echo stpcpy.c; fi` | $(ANSI2KNR) > stpcpy_.c
|
||||
strcasecmp_.c: strcasecmp.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/strcasecmp.c; then echo $(srcdir)/strcasecmp.c; else echo strcasecmp.c; fi` | $(ANSI2KNR) > strcasecmp_.c
|
||||
strdup_.c: strdup.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/strdup.c; then echo $(srcdir)/strdup.c; else echo strdup.c; fi` | $(ANSI2KNR) > strdup_.c
|
||||
strftime_.c: strftime.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/strftime.c; then echo $(srcdir)/strftime.c; else echo strftime.c; fi` | $(ANSI2KNR) > strftime_.c
|
||||
stripslash_.c: stripslash.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/stripslash.c; then echo $(srcdir)/stripslash.c; else echo stripslash.c; fi` | $(ANSI2KNR) > stripslash_.c
|
||||
strndup_.c: strndup.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/strndup.c; then echo $(srcdir)/strndup.c; else echo strndup.c; fi` | $(ANSI2KNR) > strndup_.c
|
||||
strstr_.c: strstr.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/strstr.c; then echo $(srcdir)/strstr.c; else echo strstr.c; fi` | $(ANSI2KNR) > strstr_.c
|
||||
strtol_.c: strtol.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/strtol.c; then echo $(srcdir)/strtol.c; else echo strtol.c; fi` | $(ANSI2KNR) > strtol_.c
|
||||
strtoul_.c: strtoul.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/strtoul.c; then echo $(srcdir)/strtoul.c; else echo strtoul.c; fi` | $(ANSI2KNR) > strtoul_.c
|
||||
strverscmp_.c: strverscmp.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/strverscmp.c; then echo $(srcdir)/strverscmp.c; else echo strverscmp.c; fi` | $(ANSI2KNR) > strverscmp_.c
|
||||
userspec_.c: userspec.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/userspec.c; then echo $(srcdir)/userspec.c; else echo userspec.c; fi` | $(ANSI2KNR) > userspec_.c
|
||||
xgetcwd_.c: xgetcwd.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/xgetcwd.c; then echo $(srcdir)/xgetcwd.c; else echo xgetcwd.c; fi` | $(ANSI2KNR) > xgetcwd_.c
|
||||
xmalloc_.c: xmalloc.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/xmalloc.c; then echo $(srcdir)/xmalloc.c; else echo xmalloc.c; fi` | $(ANSI2KNR) > xmalloc_.c
|
||||
xstrdup_.c: xstrdup.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/xstrdup.c; then echo $(srcdir)/xstrdup.c; else echo xstrdup.c; fi` | $(ANSI2KNR) > xstrdup_.c
|
||||
xstrtol_.c: xstrtol.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/xstrtol.c; then echo $(srcdir)/xstrtol.c; else echo xstrtol.c; fi` | $(ANSI2KNR) > xstrtol_.c
|
||||
xstrtoul_.c: xstrtoul.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/xstrtoul.c; then echo $(srcdir)/xstrtoul.c; else echo xstrtoul.c; fi` | $(ANSI2KNR) > xstrtoul_.c
|
||||
yesno_.c: yesno.c $(ANSI2KNR)
|
||||
$(CPP) $(DEFS) $(INCLUDES) $(CPPFLAGS) `if test -f $(srcdir)/yesno.c; then echo $(srcdir)/yesno.c; else echo yesno.c; fi` | $(ANSI2KNR) > yesno_.c
|
||||
addext_.o alloca_.o argmatch_.o backupfile_.o basename_.o chown_.o \
|
||||
closeout_.o dirname_.o error_.o euidaccess_.o exclude_.o fileblocks_.o \
|
||||
filemode_.o fnmatch_.o fsusage_.o ftruncate_.o full-write_.o getdate_.o \
|
||||
getgroups_.o getline_.o getopt_.o getopt1_.o group-member_.o hash_.o \
|
||||
human_.o idcache_.o isdir_.o lchown_.o long-options_.o lstat_.o \
|
||||
makepath_.o malloc_.o memcmp_.o memcpy_.o memset_.o mkdir_.o mktime_.o \
|
||||
modechange_.o mountlist_.o obstack_.o path-concat_.o posixtm_.o \
|
||||
quotearg_.o realloc_.o regex_.o rename_.o rmdir_.o rpmatch_.o rx_.o \
|
||||
safe-read_.o save-cwd_.o savedir_.o stat_.o stpcpy_.o strcasecmp_.o \
|
||||
strdup_.o strftime_.o stripslash_.o strndup_.o strstr_.o strtol_.o \
|
||||
strtoul_.o strverscmp_.o userspec_.o xgetcwd_.o xmalloc_.o xstrdup_.o \
|
||||
xstrtol_.o xstrtoul_.o yesno_.o : $(ANSI2KNR)
|
||||
|
||||
tags: TAGS
|
||||
|
||||
ID: $(HEADERS) $(SOURCES)
|
||||
here=`pwd` && cd $(srcdir) && mkid -f$$here/ID $(SOURCES) $(HEADERS)
|
||||
ID: $(HEADERS) $(SOURCES) $(LISP)
|
||||
here=`pwd` && cd $(srcdir) \
|
||||
&& mkid -f$$here/ID $(SOURCES) $(HEADERS) $(LISP)
|
||||
|
||||
TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES)
|
||||
TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
|
||||
tags=; \
|
||||
here=`pwd`; \
|
||||
list="$(SUBDIRS)"; for subdir in $$list; do \
|
||||
test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
|
||||
done; \
|
||||
test -z "$(ETAGS_ARGS)$(SOURCES)$(HEADERS)$$tags" \
|
||||
|| cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $(SOURCES) $(HEADERS) -o $$here/TAGS
|
||||
list='$(SOURCES) $(HEADERS)'; \
|
||||
unique=`for i in $$list; do echo $$i; done | \
|
||||
awk ' { files[$$0] = 1; } \
|
||||
END { for (i in files) print i; }'`; \
|
||||
test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
|
||||
|| (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
|
||||
|
||||
mostlyclean-tags:
|
||||
|
||||
clean-tags:
|
||||
|
||||
distclean-tags:
|
||||
rm -f TAGS ID
|
||||
-rm -f TAGS ID
|
||||
|
||||
maintainer-clean-tags:
|
||||
|
||||
distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
|
||||
|
||||
subdir = lib
|
||||
|
||||
distdir: $(DISTFILES)
|
||||
here=`cd $(top_builddir) && pwd`; \
|
||||
top_distdir=`cd $(top_distdir) && pwd`; \
|
||||
distdir=`cd $(distdir) && pwd`; \
|
||||
cd $(top_srcdir) \
|
||||
&& $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnits lib/Makefile
|
||||
@for file in $(DISTFILES); do \
|
||||
d=$(srcdir); \
|
||||
test -f $(distdir)/$$file \
|
||||
@@ -201,15 +431,9 @@ distdir: $(DISTFILES)
|
||||
|| cp -p $$d/$$file $(distdir)/$$file; \
|
||||
done
|
||||
|
||||
MKDEP = gcc -M $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
|
||||
|
||||
-include .deps/.P
|
||||
.deps/.P:
|
||||
test -d .deps || mkdir .deps
|
||||
echo > $@
|
||||
DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
|
||||
|
||||
-include $(DEP_FILES)
|
||||
$(DEP_FILES): .deps/.P
|
||||
|
||||
mostlyclean-depend:
|
||||
|
||||
@@ -218,76 +442,81 @@ clean-depend:
|
||||
distclean-depend:
|
||||
|
||||
maintainer-clean-depend:
|
||||
rm -rf .deps
|
||||
-rm -rf .deps
|
||||
|
||||
.deps/%.P: $(srcdir)/%.c
|
||||
@echo "Computing dependencies for $<..."
|
||||
@o='o'; \
|
||||
test -n "$o" && o='$$o'; \
|
||||
$(MKDEP) $< | sed "s/^\(.*\)\.o:/\1.$$o \1.l$$o:/" > $@
|
||||
%.o: %.c
|
||||
@echo '$(COMPILE) -c $<'; \
|
||||
$(COMPILE) -Wp,-MD,.deps/$(*F).P -c $<
|
||||
|
||||
%.lo: %.c
|
||||
@echo '$(LTCOMPILE) -c $<'; \
|
||||
$(LTCOMPILE) -Wp,-MD,.deps/$(*F).p -c $<
|
||||
@-sed -e 's/^\([^:]*\)\.o:/\1.lo \1.o:/' \
|
||||
< .deps/$(*F).p > .deps/$(*F).P
|
||||
@-rm -f .deps/$(*F).p
|
||||
info:
|
||||
dvi:
|
||||
check: all
|
||||
$(MAKE)
|
||||
installcheck:
|
||||
install-exec:
|
||||
$(NORMAL_INSTALL)
|
||||
@$(NORMAL_INSTALL)
|
||||
|
||||
install-data:
|
||||
$(NORMAL_INSTALL)
|
||||
@$(NORMAL_INSTALL)
|
||||
|
||||
install: install-exec install-data all
|
||||
@:
|
||||
|
||||
uninstall:
|
||||
|
||||
all: $(LIBRARIES) $(BUILT_SOURCES) $(HEADERS) Makefile
|
||||
|
||||
install-strip:
|
||||
$(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install
|
||||
$(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' INSTALL_SCRIPT='$(INSTALL_PROGRAM)' install
|
||||
installdirs:
|
||||
|
||||
|
||||
mostlyclean-generic:
|
||||
test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
|
||||
-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
|
||||
|
||||
clean-generic:
|
||||
test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||
|
||||
distclean-generic:
|
||||
rm -f Makefile $(DISTCLEANFILES)
|
||||
rm -f config.cache config.log stamp-h
|
||||
test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||
-rm -f Makefile $(DISTCLEANFILES)
|
||||
-rm -f config.cache config.log stamp-h stamp-h[0-9]*
|
||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||
|
||||
maintainer-clean-generic:
|
||||
test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
|
||||
test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
|
||||
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
|
||||
-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
|
||||
mostlyclean: mostlyclean-noinstLIBRARIES mostlyclean-compile \
|
||||
mostlyclean-tags mostlyclean-depend mostlyclean-generic
|
||||
mostlyclean-kr mostlyclean-tags mostlyclean-depend \
|
||||
mostlyclean-generic
|
||||
|
||||
clean: clean-noinstLIBRARIES clean-compile clean-tags clean-depend \
|
||||
clean-generic mostlyclean
|
||||
clean: clean-noinstLIBRARIES clean-compile clean-kr clean-tags \
|
||||
clean-depend clean-generic mostlyclean
|
||||
|
||||
distclean: distclean-noinstLIBRARIES distclean-compile distclean-tags \
|
||||
distclean-depend distclean-generic clean
|
||||
rm -f config.status
|
||||
distclean: distclean-noinstLIBRARIES distclean-compile distclean-kr \
|
||||
distclean-tags distclean-depend distclean-generic clean
|
||||
-rm -f config.status
|
||||
|
||||
maintainer-clean: maintainer-clean-noinstLIBRARIES \
|
||||
maintainer-clean-compile maintainer-clean-tags \
|
||||
maintainer-clean-depend maintainer-clean-generic \
|
||||
distclean
|
||||
maintainer-clean-compile maintainer-clean-kr \
|
||||
maintainer-clean-tags maintainer-clean-depend \
|
||||
maintainer-clean-generic distclean
|
||||
@echo "This command is intended for maintainers to use;"
|
||||
@echo "it deletes files that may require special tools to rebuild."
|
||||
|
||||
.PHONY: default mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \
|
||||
.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \
|
||||
clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \
|
||||
mostlyclean-compile distclean-compile clean-compile \
|
||||
maintainer-clean-compile tags mostlyclean-tags distclean-tags \
|
||||
clean-tags maintainer-clean-tags distdir mostlyclean-depend \
|
||||
distclean-depend clean-depend maintainer-clean-depend info dvi \
|
||||
installcheck install-exec install-data install uninstall all \
|
||||
installdirs mostlyclean-generic distclean-generic clean-generic \
|
||||
maintainer-clean-generic clean mostlyclean distclean maintainer-clean
|
||||
maintainer-clean-compile mostlyclean-kr distclean-kr clean-kr \
|
||||
maintainer-clean-kr tags mostlyclean-tags distclean-tags clean-tags \
|
||||
maintainer-clean-tags distdir mostlyclean-depend distclean-depend \
|
||||
clean-depend maintainer-clean-depend info dvi installcheck install-exec \
|
||||
install-data install uninstall all installdirs mostlyclean-generic \
|
||||
distclean-generic clean-generic maintainer-clean-generic clean \
|
||||
mostlyclean distclean maintainer-clean
|
||||
|
||||
|
||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||
|
||||
32
lib/TODO
Normal file
32
lib/TODO
Normal file
@@ -0,0 +1,32 @@
|
||||
Things to do to hash.c:
|
||||
|
||||
Always use curly braces around statements in if/else/while/do/etc.
|
||||
that span more than a line -- even around multiline simple statements
|
||||
or single-line simple statements preceded by a comment line.
|
||||
|
||||
Never have lines longer than 80 chars.
|
||||
|
||||
Remove ^L characters. We don't want/need such crutches.
|
||||
Get a good (smart) pagination filter. I have one (a perl script)
|
||||
that usually does a decent job for me -- I called it something
|
||||
like stdc-print and think I sent you an early verison.
|
||||
|
||||
I don't like the name `cursor'. I much prefer short names
|
||||
like `p' for index variables. I doubt I'll change all of them,
|
||||
but thought you should know why some will probably end up changing.
|
||||
|
||||
#define USE_OBSTACK somewhere
|
||||
|
||||
Fix this comment. Depending on system and application...
|
||||
Mention fragmentation.
|
||||
+#if USE_OBSTACK
|
||||
+ /* Whenever obstacks are used, it is possible to allocate all overflowed
|
||||
+ entries into a single stack, so they all can be freed in a single
|
||||
+ operation. It is not clear if the speedup is worth the trouble. */
|
||||
+ struct obstack entry_stack;
|
||||
+#endif
|
||||
|
||||
|
||||
assert (bucket_limit - bucket == n_buckets) ?
|
||||
|
||||
remove.c: s/done/successful or ok
|
||||
106
lib/addext.c
Normal file
106
lib/addext.c
Normal file
@@ -0,0 +1,106 @@
|
||||
/* addext.c -- add an extension to a file name
|
||||
Copyright (C) 1990, 1997 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; see the file COPYING.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* Written by David MacKenzie <djm@gnu.ai.mit.edu> and Paul Eggert */
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_DOS_FILE_NAMES
|
||||
#define HAVE_DOS_FILE_NAMES 0
|
||||
#endif
|
||||
#ifndef HAVE_LONG_FILE_NAMES
|
||||
#define HAVE_LONG_FILE_NAMES 0
|
||||
#endif
|
||||
|
||||
#include <backupfile.h>
|
||||
|
||||
#if HAVE_LIMITS_H
|
||||
# include <limits.h>
|
||||
#endif
|
||||
#ifndef _POSIX_NAME_MAX
|
||||
#define _POSIX_NAME_MAX 14
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
#if HAVE_STRING_H
|
||||
# include <string.h>
|
||||
#else
|
||||
# include <strings.h>
|
||||
#endif
|
||||
|
||||
#if HAVE_UNISTD_H
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
/* Append to FILENAME the extension EXT, unless the result would be too long,
|
||||
in which case just append the character E. */
|
||||
|
||||
void
|
||||
addext (filename, ext, e)
|
||||
char *filename;
|
||||
char const *ext;
|
||||
int e;
|
||||
{
|
||||
char *s = base_name (filename);
|
||||
size_t slen = strlen (s), extlen = strlen (ext);
|
||||
long slen_max = -1;
|
||||
|
||||
#if HAVE_PATHCONF && defined _PC_NAME_MAX
|
||||
if (slen + extlen <= _POSIX_NAME_MAX && ! HAVE_DOS_FILE_NAMES)
|
||||
/* The file name is so short there's no need to call pathconf. */
|
||||
slen_max = _POSIX_NAME_MAX;
|
||||
else if (s == filename)
|
||||
slen_max = pathconf (".", _PC_NAME_MAX);
|
||||
else
|
||||
{
|
||||
char c = *s;
|
||||
*s = 0;
|
||||
slen_max = pathconf (filename, _PC_NAME_MAX);
|
||||
*s = c;
|
||||
}
|
||||
#endif
|
||||
if (slen_max < 0)
|
||||
slen_max = HAVE_LONG_FILE_NAMES ? 255 : 14;
|
||||
|
||||
if (HAVE_DOS_FILE_NAMES && slen_max <= 12)
|
||||
{
|
||||
/* Live within DOS's 8.3 limit. */
|
||||
char *dot = strchr (s, '.');
|
||||
if (dot)
|
||||
{
|
||||
slen -= dot + 1 - s;
|
||||
s = dot + 1;
|
||||
slen_max = 3;
|
||||
}
|
||||
else
|
||||
slen_max = 8;
|
||||
extlen = 9; /* Don't use EXT. */
|
||||
}
|
||||
|
||||
if (slen + extlen <= slen_max)
|
||||
strcpy (s + slen, ext);
|
||||
else
|
||||
{
|
||||
if (slen_max <= slen)
|
||||
slen = slen_max - 1;
|
||||
s[slen] = e;
|
||||
s[slen + 1] = 0;
|
||||
}
|
||||
}
|
||||
120
lib/alloca.c
120
lib/alloca.c
@@ -22,11 +22,11 @@
|
||||
your main control loop, etc. to force garbage collection. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#ifdef emacs
|
||||
#include "blockinput.h"
|
||||
# include "blockinput.h"
|
||||
#endif
|
||||
|
||||
/* If compiling with GCC 2, this file's not needed. */
|
||||
@@ -34,39 +34,41 @@
|
||||
|
||||
/* If someone has defined alloca as a macro,
|
||||
there must be some other way alloca is supposed to work. */
|
||||
#ifndef alloca
|
||||
# ifndef alloca
|
||||
|
||||
#ifdef emacs
|
||||
#ifdef static
|
||||
# ifdef emacs
|
||||
# ifdef static
|
||||
/* actually, only want this if static is defined as ""
|
||||
-- this is for usg, in which emacs must undefine static
|
||||
in order to make unexec workable
|
||||
*/
|
||||
#ifndef STACK_DIRECTION
|
||||
# ifndef STACK_DIRECTION
|
||||
you
|
||||
lose
|
||||
-- must know STACK_DIRECTION at compile-time
|
||||
#endif /* STACK_DIRECTION undefined */
|
||||
#endif /* static */
|
||||
#endif /* emacs */
|
||||
# endif /* STACK_DIRECTION undefined */
|
||||
# endif /* static */
|
||||
# endif /* emacs */
|
||||
|
||||
/* If your stack is a linked list of frames, you have to
|
||||
provide an "address metric" ADDRESS_FUNCTION macro. */
|
||||
|
||||
#if defined (CRAY) && defined (CRAY_STACKSEG_END)
|
||||
# if defined (CRAY) && defined (CRAY_STACKSEG_END)
|
||||
long i00afunc ();
|
||||
#define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg))
|
||||
#else
|
||||
#define ADDRESS_FUNCTION(arg) &(arg)
|
||||
#endif
|
||||
# define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg))
|
||||
# else
|
||||
# define ADDRESS_FUNCTION(arg) &(arg)
|
||||
# endif
|
||||
|
||||
#if __STDC__
|
||||
# if __STDC__
|
||||
typedef void *pointer;
|
||||
#else
|
||||
# else
|
||||
typedef char *pointer;
|
||||
#endif
|
||||
# endif
|
||||
|
||||
#define NULL 0
|
||||
# ifndef NULL
|
||||
# define NULL 0
|
||||
# endif
|
||||
|
||||
/* Different portions of Emacs need to call different versions of
|
||||
malloc. The Emacs executable needs alloca to call xmalloc, because
|
||||
@@ -78,9 +80,9 @@ typedef char *pointer;
|
||||
|
||||
Callers below should use malloc. */
|
||||
|
||||
#ifndef emacs
|
||||
#define malloc xmalloc
|
||||
#endif
|
||||
# ifndef emacs
|
||||
# define malloc xmalloc
|
||||
# endif
|
||||
extern pointer malloc ();
|
||||
|
||||
/* Define STACK_DIRECTION if you know the direction of stack
|
||||
@@ -91,18 +93,18 @@ extern pointer malloc ();
|
||||
STACK_DIRECTION < 0 => grows toward lower addresses
|
||||
STACK_DIRECTION = 0 => direction of growth unknown */
|
||||
|
||||
#ifndef STACK_DIRECTION
|
||||
#define STACK_DIRECTION 0 /* Direction unknown. */
|
||||
#endif
|
||||
# ifndef STACK_DIRECTION
|
||||
# define STACK_DIRECTION 0 /* Direction unknown. */
|
||||
# endif
|
||||
|
||||
#if STACK_DIRECTION != 0
|
||||
# if STACK_DIRECTION != 0
|
||||
|
||||
#define STACK_DIR STACK_DIRECTION /* Known at compile-time. */
|
||||
# define STACK_DIR STACK_DIRECTION /* Known at compile-time. */
|
||||
|
||||
#else /* STACK_DIRECTION == 0; need run-time code. */
|
||||
# else /* STACK_DIRECTION == 0; need run-time code. */
|
||||
|
||||
static int stack_dir; /* 1 or -1 once known. */
|
||||
#define STACK_DIR stack_dir
|
||||
# define STACK_DIR stack_dir
|
||||
|
||||
static void
|
||||
find_stack_direction ()
|
||||
@@ -126,7 +128,7 @@ find_stack_direction ()
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* STACK_DIRECTION == 0 */
|
||||
# endif /* STACK_DIRECTION == 0 */
|
||||
|
||||
/* An "alloca header" is used to:
|
||||
(a) chain together all alloca'ed blocks;
|
||||
@@ -135,9 +137,9 @@ find_stack_direction ()
|
||||
It is very important that sizeof(header) agree with malloc
|
||||
alignment chunk size. The following default should work okay. */
|
||||
|
||||
#ifndef ALIGN_SIZE
|
||||
#define ALIGN_SIZE sizeof(double)
|
||||
#endif
|
||||
# ifndef ALIGN_SIZE
|
||||
# define ALIGN_SIZE sizeof(double)
|
||||
# endif
|
||||
|
||||
typedef union hdr
|
||||
{
|
||||
@@ -165,20 +167,20 @@ alloca (size)
|
||||
auto char probe; /* Probes stack depth: */
|
||||
register char *depth = ADDRESS_FUNCTION (probe);
|
||||
|
||||
#if STACK_DIRECTION == 0
|
||||
# if STACK_DIRECTION == 0
|
||||
if (STACK_DIR == 0) /* Unknown growth direction. */
|
||||
find_stack_direction ();
|
||||
#endif
|
||||
# endif
|
||||
|
||||
/* Reclaim garbage, defined as all alloca'd storage that
|
||||
was allocated from deeper in the stack than currently. */
|
||||
was allocated from deeper in the stack than currently. */
|
||||
|
||||
{
|
||||
register header *hp; /* Traverses linked list. */
|
||||
|
||||
#ifdef emacs
|
||||
# ifdef emacs
|
||||
BLOCK_INPUT;
|
||||
#endif
|
||||
# endif
|
||||
|
||||
for (hp = last_alloca_header; hp != NULL;)
|
||||
if ((STACK_DIR > 0 && hp->h.deep > depth)
|
||||
@@ -195,9 +197,9 @@ alloca (size)
|
||||
|
||||
last_alloca_header = hp; /* -> last valid storage. */
|
||||
|
||||
#ifdef emacs
|
||||
# ifdef emacs
|
||||
UNBLOCK_INPUT;
|
||||
#endif
|
||||
# endif
|
||||
}
|
||||
|
||||
if (size == 0)
|
||||
@@ -220,15 +222,15 @@ alloca (size)
|
||||
}
|
||||
}
|
||||
|
||||
#if defined (CRAY) && defined (CRAY_STACKSEG_END)
|
||||
# if defined (CRAY) && defined (CRAY_STACKSEG_END)
|
||||
|
||||
#ifdef DEBUG_I00AFUNC
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
# ifdef DEBUG_I00AFUNC
|
||||
# include <stdio.h>
|
||||
# endif
|
||||
|
||||
#ifndef CRAY_STACK
|
||||
#define CRAY_STACK
|
||||
#ifndef CRAY2
|
||||
# ifndef CRAY_STACK
|
||||
# define CRAY_STACK
|
||||
# ifndef CRAY2
|
||||
/* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */
|
||||
struct stack_control_header
|
||||
{
|
||||
@@ -280,7 +282,7 @@ struct stack_segment_linkage
|
||||
long sss7;
|
||||
};
|
||||
|
||||
#else /* CRAY2 */
|
||||
# else /* CRAY2 */
|
||||
/* The following structure defines the vector of words
|
||||
returned by the STKSTAT library routine. */
|
||||
struct stk_stat
|
||||
@@ -333,12 +335,12 @@ struct stk_trailer
|
||||
long unknown14;
|
||||
};
|
||||
|
||||
#endif /* CRAY2 */
|
||||
#endif /* not CRAY_STACK */
|
||||
# endif /* CRAY2 */
|
||||
# endif /* not CRAY_STACK */
|
||||
|
||||
#ifdef CRAY2
|
||||
# ifdef CRAY2
|
||||
/* Determine a "stack measure" for an arbitrary ADDRESS.
|
||||
I doubt that "lint" will like this much. */
|
||||
I doubt that "lint" will like this much. */
|
||||
|
||||
static long
|
||||
i00afunc (long *address)
|
||||
@@ -407,7 +409,7 @@ i00afunc (long *address)
|
||||
return (result);
|
||||
}
|
||||
|
||||
#else /* not CRAY2 */
|
||||
# else /* not CRAY2 */
|
||||
/* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP.
|
||||
Determine the number of the cell within the stack,
|
||||
given the address of the cell. The purpose of this
|
||||
@@ -452,9 +454,9 @@ i00afunc (long address)
|
||||
|
||||
while (!(this_segment <= address && address <= stkl))
|
||||
{
|
||||
#ifdef DEBUG_I00AFUNC
|
||||
# ifdef DEBUG_I00AFUNC
|
||||
fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl);
|
||||
#endif
|
||||
# endif
|
||||
if (pseg == 0)
|
||||
break;
|
||||
stkl = stkl - pseg;
|
||||
@@ -473,9 +475,9 @@ i00afunc (long address)
|
||||
|
||||
while (pseg != 0)
|
||||
{
|
||||
#ifdef DEBUG_I00AFUNC
|
||||
# ifdef DEBUG_I00AFUNC
|
||||
fprintf (stderr, "%011o %011o\n", pseg, size);
|
||||
#endif
|
||||
# endif
|
||||
stkl = stkl - pseg;
|
||||
ssptr = (struct stack_segment_linkage *) stkl;
|
||||
size = ssptr->sssize;
|
||||
@@ -485,8 +487,8 @@ i00afunc (long address)
|
||||
return (result);
|
||||
}
|
||||
|
||||
#endif /* not CRAY2 */
|
||||
#endif /* CRAY */
|
||||
# endif /* not CRAY2 */
|
||||
# endif /* CRAY */
|
||||
|
||||
#endif /* no alloca */
|
||||
# endif /* no alloca */
|
||||
#endif /* not GCC version 2 */
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* argmatch.c -- find a match for a string in an array
|
||||
Copyright (C) 1990 Free Software Foundation, Inc.
|
||||
Copyright (C) 1990, 1997 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -12,33 +12,34 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
along with this program; see the file COPYING.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* Written by David MacKenzie <djm@ai.mit.edu> */
|
||||
/* Written by David MacKenzie <djm@gnu.ai.mit.edu> */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#include <argmatch.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#ifdef STDC_HEADERS
|
||||
#if HAVE_STRING_H
|
||||
# include <string.h>
|
||||
#else
|
||||
# include <strings.h>
|
||||
#endif
|
||||
|
||||
extern char *program_name;
|
||||
|
||||
/* If ARG is an unambiguous match for an element of the
|
||||
null-terminated array OPTLIST, return the index in OPTLIST
|
||||
of the matched element, else -1 if it does not match any element
|
||||
or -2 if it is ambiguous (is a prefix of more than one element). */
|
||||
|
||||
int
|
||||
argmatch (arg, optlist)
|
||||
const char *arg;
|
||||
const char *const *optlist;
|
||||
argmatch (const char *arg, const char *const *optlist)
|
||||
{
|
||||
int i; /* Temporary index in OPTLIST. */
|
||||
size_t arglen; /* Length of ARG. */
|
||||
@@ -75,15 +76,10 @@ argmatch (arg, optlist)
|
||||
PROBLEM is the return value from argmatch. */
|
||||
|
||||
void
|
||||
invalid_arg (kind, value, problem)
|
||||
const char *kind;
|
||||
const char *value;
|
||||
int problem;
|
||||
invalid_arg (const char *kind, const char *value, int problem)
|
||||
{
|
||||
fprintf (stderr, "%s: ", program_name);
|
||||
if (problem == -1)
|
||||
fprintf (stderr, "invalid");
|
||||
else /* Assume -2. */
|
||||
fprintf (stderr, "ambiguous");
|
||||
fprintf (stderr, " %s `%s'\n", kind, value);
|
||||
const char *fmt = (problem == -1
|
||||
? "%s: invalid %s `%s'\n"
|
||||
: "%s: ambiguous %s `%s'\n");
|
||||
fprintf (stderr, fmt, program_name, kind, value);
|
||||
}
|
||||
|
||||
@@ -1,18 +1,12 @@
|
||||
#ifndef ARGMATCH_H
|
||||
#define ARGMATCH_H 1
|
||||
/* argmatch.h -- declarations for matching arguments against option lists */
|
||||
|
||||
#ifndef __P
|
||||
# if defined (__GNUC__) || (defined (__STDC__) && __STDC__)
|
||||
# define __P(args) args
|
||||
# else
|
||||
# define __P(args) ()
|
||||
# endif /* GCC. */
|
||||
#endif /* Not __P. */
|
||||
#if defined __STDC__ || __GNUC__
|
||||
# define __ARGMATCH_P(args) args
|
||||
#else
|
||||
# define __ARGMATCH_P(args) ()
|
||||
#endif
|
||||
|
||||
int
|
||||
argmatch __P ((const char *arg, const char *const *optlist));
|
||||
int argmatch __ARGMATCH_P ((const char *, const char * const *));
|
||||
void invalid_arg __ARGMATCH_P ((const char *, const char *, int));
|
||||
|
||||
void
|
||||
invalid_arg __P ((const char *kind, const char *value, int problem));
|
||||
|
||||
#endif /* ARGMATCH_H */
|
||||
extern char *program_name;
|
||||
|
||||
227
lib/backupfile.c
227
lib/backupfile.c
@@ -1,5 +1,5 @@
|
||||
/* backupfile.c -- make Emacs style backup file names
|
||||
Copyright (C) 1990 Free Software Foundation, Inc.
|
||||
Copyright (C) 1990-1997, 1998 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -12,100 +12,97 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
along with this program; see the file COPYING.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* David MacKenzie <djm@gnu.ai.mit.edu>.
|
||||
/* Written by David MacKenzie <djm@gnu.ai.mit.edu>.
|
||||
Some algorithms adapted from GNU Emacs. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#include <argmatch.h>
|
||||
#include <backupfile.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include "backupfile.h"
|
||||
#ifdef HAVE_STRING_H
|
||||
#if HAVE_STRING_H
|
||||
# include <string.h>
|
||||
#else
|
||||
# include <strings.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_DIRENT_H
|
||||
#if HAVE_DIRENT_H
|
||||
# include <dirent.h>
|
||||
# define NLENGTH(direct) (strlen((direct)->d_name))
|
||||
#else /* not HAVE_DIRENT_H */
|
||||
# define NLENGTH(direct) strlen ((direct)->d_name)
|
||||
#else
|
||||
# define dirent direct
|
||||
# define NLENGTH(direct) ((direct)->d_namlen)
|
||||
# ifdef HAVE_SYS_NDIR_H
|
||||
# define NLENGTH(direct) ((size_t) (direct)->d_namlen)
|
||||
# if HAVE_SYS_NDIR_H
|
||||
# include <sys/ndir.h>
|
||||
# endif /* HAVE_SYS_NDIR_H */
|
||||
# ifdef HAVE_SYS_DIR_H
|
||||
# endif
|
||||
# if HAVE_SYS_DIR_H
|
||||
# include <sys/dir.h>
|
||||
# endif /* HAVE_SYS_DIR_H */
|
||||
# ifdef HAVE_NDIR_H
|
||||
# endif
|
||||
# if HAVE_NDIR_H
|
||||
# include <ndir.h>
|
||||
# endif /* HAVE_NDIR_H */
|
||||
#endif /* HAVE_DIRENT_H */
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef CLOSEDIR_VOID
|
||||
#if CLOSEDIR_VOID
|
||||
/* Fake a return value. */
|
||||
# define CLOSEDIR(d) (closedir (d), 0)
|
||||
#else
|
||||
# define CLOSEDIR(d) closedir (d)
|
||||
#endif
|
||||
|
||||
#ifdef STDC_HEADERS
|
||||
#if STDC_HEADERS
|
||||
# include <stdlib.h>
|
||||
#else
|
||||
char *malloc ();
|
||||
#endif
|
||||
|
||||
#if defined (STDC_HEADERS) || (!defined (isascii) && !defined (HAVE_ISASCII))
|
||||
# define IN_CTYPE_DOMAIN(c) 1
|
||||
#if HAVE_DIRENT_H || HAVE_NDIR_H || HAVE_SYS_DIR_H || HAVE_SYS_NDIR_H
|
||||
# define HAVE_DIR 1
|
||||
#else
|
||||
# define IN_CTYPE_DOMAIN(c) isascii(c)
|
||||
# define HAVE_DIR 0
|
||||
#endif
|
||||
|
||||
#define ISDIGIT_LOCALE(c) (IN_CTYPE_DOMAIN (c) && isdigit (c))
|
||||
#if HAVE_LIMITS_H
|
||||
# include <limits.h>
|
||||
#endif
|
||||
#ifndef CHAR_BIT
|
||||
# define CHAR_BIT 8
|
||||
#endif
|
||||
/* Upper bound on the string length of an integer converted to string.
|
||||
302 / 1000 is ceil (log10 (2.0)). Subtract 1 for the sign bit;
|
||||
add 1 for integer division truncation; add 1 more for a minus sign. */
|
||||
#define INT_STRLEN_BOUND(t) ((sizeof (t) * CHAR_BIT - 1) * 302 / 1000 + 2)
|
||||
|
||||
/* ISDIGIT differs from ISDIGIT_LOCALE, as follows:
|
||||
/* ISDIGIT differs from isdigit, as follows:
|
||||
- Its arg may be any int or unsigned int; it need not be an unsigned char.
|
||||
- It's guaranteed to evaluate its argument exactly once.
|
||||
- It's typically faster.
|
||||
Posix 1003.2-1992 section 2.5.2.1 page 50 lines 1556-1558 says that
|
||||
only '0' through '9' are digits. Prefer ISDIGIT to ISDIGIT_LOCALE unless
|
||||
only '0' through '9' are digits. Prefer ISDIGIT to isdigit unless
|
||||
it's important to use the locale's definition of `digit' even when the
|
||||
host does not conform to Posix. */
|
||||
#define ISDIGIT(c) ((unsigned) (c) - '0' <= 9)
|
||||
|
||||
#if defined (HAVE_UNISTD_H)
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#if defined (_POSIX_VERSION)
|
||||
/* POSIX does not require that the d_ino field be present, and some
|
||||
systems do not provide it. */
|
||||
# define REAL_DIR_ENTRY(dp) 1
|
||||
#else
|
||||
#if D_INO_IN_DIRENT
|
||||
# define REAL_DIR_ENTRY(dp) ((dp)->d_ino != 0)
|
||||
#else
|
||||
# define REAL_DIR_ENTRY(dp) 1
|
||||
#endif
|
||||
|
||||
/* Which type of backup file names are generated. */
|
||||
enum backup_type backup_type = none;
|
||||
|
||||
/* The extension added to file names to produce a simple (as opposed
|
||||
to numbered) backup file name. */
|
||||
char *simple_backup_suffix = "~";
|
||||
const char *simple_backup_suffix = "~";
|
||||
|
||||
char *basename ();
|
||||
char *dirname ();
|
||||
static char *concat ();
|
||||
char *find_backup_file_name ();
|
||||
static char *make_version_name ();
|
||||
static int max_backup_version ();
|
||||
static int version_number ();
|
||||
static int max_backup_version PARAMS ((const char *, const char *));
|
||||
static int version_number PARAMS ((const char *, const char *, size_t));
|
||||
|
||||
/* Return the name of the new backup file for file FILE,
|
||||
allocated with malloc. Return 0 if out of memory.
|
||||
@@ -113,41 +110,56 @@ static int version_number ();
|
||||
Do not call this function if backup_type == none. */
|
||||
|
||||
char *
|
||||
find_backup_file_name (file)
|
||||
const char *file;
|
||||
find_backup_file_name (const char *file, enum backup_type backup_type)
|
||||
{
|
||||
char *dir;
|
||||
char *base_versions;
|
||||
int highest_backup;
|
||||
size_t backup_suffix_size_max;
|
||||
size_t file_len = strlen (file);
|
||||
size_t numbered_suffix_size_max = INT_STRLEN_BOUND (int) + 4;
|
||||
char *s;
|
||||
const char *suffix = simple_backup_suffix;
|
||||
|
||||
if (backup_type == simple)
|
||||
return concat (file, simple_backup_suffix);
|
||||
base_versions = concat (basename (file), ".~");
|
||||
if (base_versions == 0)
|
||||
return 0;
|
||||
dir = dirname (file);
|
||||
if (dir == 0)
|
||||
/* Allow room for simple or `.~N~' backups. */
|
||||
backup_suffix_size_max = strlen (simple_backup_suffix) + 1;
|
||||
if (HAVE_DIR && backup_suffix_size_max < numbered_suffix_size_max)
|
||||
backup_suffix_size_max = numbered_suffix_size_max;
|
||||
|
||||
s = malloc (file_len + backup_suffix_size_max + numbered_suffix_size_max);
|
||||
if (s)
|
||||
{
|
||||
free (base_versions);
|
||||
return 0;
|
||||
strcpy (s, file);
|
||||
|
||||
#if HAVE_DIR
|
||||
if (backup_type != simple)
|
||||
{
|
||||
int highest_backup;
|
||||
size_t dir_len = base_name (s) - s;
|
||||
|
||||
strcpy (s + dir_len, ".");
|
||||
highest_backup = max_backup_version (file + dir_len, s);
|
||||
if (! (backup_type == numbered_existing && highest_backup == 0))
|
||||
{
|
||||
char *numbered_suffix = s + (file_len + backup_suffix_size_max);
|
||||
sprintf (numbered_suffix, ".~%d~", highest_backup + 1);
|
||||
suffix = numbered_suffix;
|
||||
}
|
||||
strcpy (s, file);
|
||||
}
|
||||
#endif /* HAVE_DIR */
|
||||
|
||||
addext (s, suffix, '~');
|
||||
}
|
||||
highest_backup = max_backup_version (base_versions, dir);
|
||||
free (base_versions);
|
||||
free (dir);
|
||||
if (backup_type == numbered_existing && highest_backup == 0)
|
||||
return concat (file, simple_backup_suffix);
|
||||
return make_version_name (file, highest_backup + 1);
|
||||
return s;
|
||||
}
|
||||
|
||||
#if HAVE_DIR
|
||||
|
||||
/* Return the number of the highest-numbered backup file for file
|
||||
FILE in directory DIR. If there are no numbered backups
|
||||
of FILE in DIR, or an error occurs reading DIR, return 0.
|
||||
FILE should already have ".~" appended to it. */
|
||||
*/
|
||||
|
||||
static int
|
||||
max_backup_version (file, dir)
|
||||
const char *file;
|
||||
const char *dir;
|
||||
max_backup_version (const char *file, const char *dir)
|
||||
{
|
||||
DIR *dirp;
|
||||
struct dirent *dp;
|
||||
@@ -164,7 +176,7 @@ max_backup_version (file, dir)
|
||||
|
||||
while ((dp = readdir (dirp)) != 0)
|
||||
{
|
||||
if (!REAL_DIR_ENTRY (dp) || NLENGTH (dp) <= file_name_length)
|
||||
if (!REAL_DIR_ENTRY (dp) || NLENGTH (dp) < file_name_length + 4)
|
||||
continue;
|
||||
|
||||
this_version = version_number (file, dp->d_name, file_name_length);
|
||||
@@ -176,62 +188,55 @@ max_backup_version (file, dir)
|
||||
return highest_version;
|
||||
}
|
||||
|
||||
/* Return a string, allocated with malloc, containing
|
||||
"FILE.~VERSION~". Return 0 if out of memory. */
|
||||
|
||||
static char *
|
||||
make_version_name (file, version)
|
||||
const char *file;
|
||||
int version;
|
||||
{
|
||||
char *backup_name;
|
||||
|
||||
backup_name = malloc (strlen (file) + 16);
|
||||
if (backup_name == 0)
|
||||
return 0;
|
||||
sprintf (backup_name, "%s.~%d~", file, version);
|
||||
return backup_name;
|
||||
}
|
||||
|
||||
/* If BACKUP is a numbered backup of BASE, return its version number;
|
||||
otherwise return 0. BASE_LENGTH is the length of BASE.
|
||||
BASE should already have ".~" appended to it. */
|
||||
*/
|
||||
|
||||
static int
|
||||
version_number (base, backup, base_length)
|
||||
const char *base;
|
||||
const char *backup;
|
||||
int base_length;
|
||||
version_number (const char *base, const char *backup, size_t base_length)
|
||||
{
|
||||
int version;
|
||||
const char *p;
|
||||
|
||||
version = 0;
|
||||
if (!strncmp (base, backup, base_length) && ISDIGIT (backup[base_length]))
|
||||
if (strncmp (base, backup, base_length) == 0
|
||||
&& backup[base_length] == '.'
|
||||
&& backup[base_length + 1] == '~')
|
||||
{
|
||||
for (p = &backup[base_length]; ISDIGIT (*p); ++p)
|
||||
for (p = &backup[base_length + 2]; ISDIGIT (*p); ++p)
|
||||
version = version * 10 + *p - '0';
|
||||
if (p[0] != '~' || p[1])
|
||||
version = 0;
|
||||
}
|
||||
return version;
|
||||
}
|
||||
#endif /* HAVE_DIR */
|
||||
|
||||
/* Return the newly-allocated concatenation of STR1 and STR2.
|
||||
If out of memory, return 0. */
|
||||
|
||||
static char *
|
||||
concat (str1, str2)
|
||||
const char *str1;
|
||||
const char *str2;
|
||||
static const char * const backup_args[] =
|
||||
{
|
||||
char *newstr;
|
||||
int str1_length = strlen (str1);
|
||||
"never", "simple", "nil", "existing", "t", "numbered", 0
|
||||
};
|
||||
|
||||
newstr = malloc (str1_length + strlen (str2) + 1);
|
||||
if (newstr == 0)
|
||||
return 0;
|
||||
strcpy (newstr, str1);
|
||||
strcpy (newstr + str1_length, str2);
|
||||
return newstr;
|
||||
static const enum backup_type backup_types[] =
|
||||
{
|
||||
simple, simple, numbered_existing, numbered_existing, numbered, numbered
|
||||
};
|
||||
|
||||
/* Return the type of backup indicated by VERSION.
|
||||
Unique abbreviations are accepted. */
|
||||
|
||||
enum backup_type
|
||||
get_version (const char *version)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (version == 0 || *version == 0)
|
||||
return numbered_existing;
|
||||
i = argmatch (version, backup_args);
|
||||
if (i < 0)
|
||||
{
|
||||
invalid_arg ("version control type", version, i);
|
||||
exit (2);
|
||||
}
|
||||
return backup_types[i];
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* backupfile.h -- declarations for making Emacs style backup file names
|
||||
Copyright (C) 1990 Free Software Foundation, Inc.
|
||||
Copyright (C) 1990, 1991, 1992, 1997, 1998 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -12,8 +12,9 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
along with this program; see the file COPYING.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* When to make backup files. */
|
||||
enum backup_type
|
||||
@@ -32,11 +33,23 @@ enum backup_type
|
||||
numbered
|
||||
};
|
||||
|
||||
extern enum backup_type backup_type;
|
||||
extern char *simple_backup_suffix;
|
||||
#define VALID_BACKUP_TYPE(Type) \
|
||||
((Type) == none \
|
||||
|| (Type) == simple \
|
||||
|| (Type) == numbered_existing \
|
||||
|| (Type) == numbered)
|
||||
|
||||
#ifdef __STDC__
|
||||
char *find_backup_file_name (const char *file);
|
||||
#else
|
||||
char *find_backup_file_name ();
|
||||
extern char const *simple_backup_suffix;
|
||||
|
||||
#ifndef PARAMS
|
||||
# if defined PROTOTYPES || (defined __STDC__ && __STDC__)
|
||||
# define PARAMS(Args) Args
|
||||
# else
|
||||
# define PARAMS(Args) ()
|
||||
# endif
|
||||
#endif
|
||||
|
||||
char *base_name PARAMS ((char const *));
|
||||
char *find_backup_file_name PARAMS ((char const *, enum backup_type));
|
||||
enum backup_type get_version PARAMS ((char const *));
|
||||
void addext PARAMS ((char *, char const *, int));
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* basename.c -- return the last element in a path
|
||||
Copyright (C) 1990 Free Software Foundation, Inc.
|
||||
Copyright (C) 1990, 1998 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -15,24 +15,30 @@
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
/* Return NAME with any leading path stripped off.
|
||||
Don't use strrchr/rindex. */
|
||||
#ifndef FILESYSTEM_PREFIX_LEN
|
||||
# define FILESYSTEM_PREFIX_LEN(Filename) 0
|
||||
#endif
|
||||
|
||||
#ifndef ISSLASH
|
||||
# define ISSLASH(C) ((C) == '/')
|
||||
#endif
|
||||
|
||||
/* In general, we can't use the builtin `basename' function if available,
|
||||
since it has different meanings in different environments.
|
||||
In some environments the builtin `basename' modifies its argument. */
|
||||
|
||||
char *
|
||||
basename (name)
|
||||
const char *name;
|
||||
base_name (char const *name)
|
||||
{
|
||||
const char *base = name;
|
||||
char const *base = name += FILESYSTEM_PREFIX_LEN (name);
|
||||
|
||||
for (; *name; name++)
|
||||
if (ISSLASH (*name))
|
||||
base = name + 1;
|
||||
|
||||
while (*name)
|
||||
{
|
||||
if (*name == '/')
|
||||
base = name + 1;
|
||||
++name;
|
||||
}
|
||||
return (char *) base;
|
||||
}
|
||||
|
||||
58
lib/chown.c
Normal file
58
lib/chown.c
Normal file
@@ -0,0 +1,58 @@
|
||||
/* provide consistent interface to chown for systems that don't interpret
|
||||
an ID of -1 as meaning `don't change the corresponding ID'.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* written by Jim Meyering */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* Disable the definition of chown to rpl_chown (from config.h) in this
|
||||
file. Otherwise, we'd get conflicting prototypes for rpl_chown on
|
||||
most systems. */
|
||||
#undef chown
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#if HAVE_UNISTD_H
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
/* FIXME: describe. */
|
||||
|
||||
int
|
||||
rpl_chown (file, uid, gid)
|
||||
const char *file;
|
||||
uid_t uid;
|
||||
gid_t gid;
|
||||
{
|
||||
if (gid == (gid_t) -1 || uid == (uid_t) -1)
|
||||
{
|
||||
struct stat file_stats;
|
||||
|
||||
/* Stat file to get id(s) that should remain unchanged. */
|
||||
if (stat (file, &file_stats))
|
||||
return 1;
|
||||
|
||||
if (gid == (gid_t) -1)
|
||||
gid = file_stats.st_gid;
|
||||
|
||||
if (uid == (uid_t) -1)
|
||||
uid = file_stats.st_uid;
|
||||
}
|
||||
|
||||
return chown (file, uid, gid);
|
||||
}
|
||||
60
lib/closeout.c
Normal file
60
lib/closeout.c
Normal file
@@ -0,0 +1,60 @@
|
||||
/* closeout.c - close standard output
|
||||
Copyright (C) 1998 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#if ENABLE_NLS
|
||||
# include <libintl.h>
|
||||
# define _(Text) gettext (Text)
|
||||
#else
|
||||
# define _(Text) Text
|
||||
#endif
|
||||
|
||||
#if HAVE_STDLIB_H
|
||||
# include <stdlib.h>
|
||||
#endif
|
||||
#ifndef EXIT_FAILURE
|
||||
# define EXIT_FAILURE 1
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
#ifndef errno
|
||||
extern int errno;
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include "closeout.h"
|
||||
#include "error.h"
|
||||
|
||||
/* Close standard output, exiting with status STATUS on failure. */
|
||||
void
|
||||
close_stdout_status (int status)
|
||||
{
|
||||
if (ferror (stdout))
|
||||
error (status, 0, _("write error"));
|
||||
if (fclose (stdout) != 0)
|
||||
error (status, errno, _("write error"));
|
||||
}
|
||||
|
||||
/* Close standard output, exiting with status EXIT_FAILURE on failure. */
|
||||
void
|
||||
close_stdout (void)
|
||||
{
|
||||
close_stdout_status (EXIT_FAILURE);
|
||||
}
|
||||
10
lib/closeout.h
Normal file
10
lib/closeout.h
Normal file
@@ -0,0 +1,10 @@
|
||||
#ifndef PARAMS
|
||||
# if defined PROTOTYPES || (defined __STDC__ && __STDC__)
|
||||
# define PARAMS(Args) Args
|
||||
# else
|
||||
# define PARAMS(Args) ()
|
||||
# endif
|
||||
#endif
|
||||
|
||||
void close_stdout PARAMS ((void));
|
||||
void close_stdout_status PARAMS ((int status));
|
||||
@@ -1,5 +1,5 @@
|
||||
/* dirname.c -- return all but the last element in a path
|
||||
Copyright (C) 1990 Free Software Foundation, Inc.
|
||||
Copyright (C) 1990, 1998 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -15,22 +15,22 @@
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#ifdef STDC_HEADERS
|
||||
#include <stdlib.h>
|
||||
# include <stdlib.h>
|
||||
#else
|
||||
char *malloc ();
|
||||
#endif
|
||||
#if defined(STDC_HEADERS) || defined(HAVE_STRING_H)
|
||||
#include <string.h>
|
||||
#if defined STDC_HEADERS || defined HAVE_STRING_H
|
||||
# include <string.h>
|
||||
#else
|
||||
#include <strings.h>
|
||||
#ifndef strrchr
|
||||
#define strrchr rindex
|
||||
#endif
|
||||
# include <strings.h>
|
||||
# ifndef strrchr
|
||||
# define strrchr rindex
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Return the leading directories part of PATH,
|
||||
|
||||
90
lib/error.c
90
lib/error.c
@@ -1,23 +1,27 @@
|
||||
/* error.c -- error handler for noninteractive utilities
|
||||
Copyright (C) 1990, 91, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
|
||||
/* Error handler for noninteractive utilities
|
||||
Copyright (C) 1990,91,92,93,94,95,96,97,98 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
This file is part of the GNU C Library. Its master source is NOT part of
|
||||
the C library, however. The master source lives in /gd/gnu/lib.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* Written by David MacKenzie <djm@gnu.ai.mit.edu>. */
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
@@ -43,13 +47,12 @@
|
||||
void exit ();
|
||||
#endif
|
||||
|
||||
#include "error.h"
|
||||
|
||||
#ifndef _
|
||||
# define _(String) String
|
||||
#endif
|
||||
|
||||
/* Get prototypes for the functions defined here. */
|
||||
#include <error.h>
|
||||
|
||||
/* If NULL, error will flush stdout, then print on stderr the program
|
||||
name, a colon and a space. Otherwise, error will call this
|
||||
function without parameters instead. */
|
||||
@@ -68,17 +71,25 @@ unsigned int error_message_count;
|
||||
# define program_name program_invocation_name
|
||||
# include <errno.h>
|
||||
|
||||
#else /* not _LIBC */
|
||||
/* In GNU libc we want do not want to use the common name `error' directly.
|
||||
Instead make it a weak alias. */
|
||||
# define error __error
|
||||
# define error_at_line __error_at_line
|
||||
|
||||
#else /* not _LIBC */
|
||||
|
||||
/* The calling program should define program_name and set it to the
|
||||
name of the executing program. */
|
||||
extern char *program_name;
|
||||
|
||||
# if HAVE_STRERROR
|
||||
# ifndef strerror /* On some systems, strerror is a macro */
|
||||
char *strerror ();
|
||||
# endif
|
||||
# ifdef HAVE_STRERROR_R
|
||||
# define __strerror_r strerror_r
|
||||
# else
|
||||
# if HAVE_STRERROR
|
||||
# ifndef strerror /* On some systems, strerror is a macro */
|
||||
char *strerror ();
|
||||
# endif
|
||||
# else
|
||||
static char *
|
||||
private_strerror (errnum)
|
||||
int errnum;
|
||||
@@ -87,11 +98,12 @@ private_strerror (errnum)
|
||||
extern int sys_nerr;
|
||||
|
||||
if (errnum > 0 && errnum <= sys_nerr)
|
||||
return sys_errlist[errnum];
|
||||
return _(sys_errlist[errnum]);
|
||||
return _("Unknown system error");
|
||||
}
|
||||
# define strerror private_strerror
|
||||
# endif /* HAVE_STRERROR */
|
||||
# define strerror private_strerror
|
||||
# endif /* HAVE_STRERROR */
|
||||
# endif /* HAVE_STRERROR_R */
|
||||
#endif /* not _LIBC */
|
||||
|
||||
/* Print the program name and error message MESSAGE, which is a printf-style
|
||||
@@ -101,7 +113,7 @@ private_strerror (errnum)
|
||||
/* VARARGS */
|
||||
|
||||
void
|
||||
#if defined(VA_START) && __STDC__
|
||||
#if defined VA_START && __STDC__
|
||||
error (int status, int errnum, const char *message, ...)
|
||||
#else
|
||||
error (status, errnum, message, va_alist)
|
||||
@@ -137,7 +149,14 @@ error (status, errnum, message, va_alist)
|
||||
|
||||
++error_message_count;
|
||||
if (errnum)
|
||||
fprintf (stderr, ": %s", strerror (errnum));
|
||||
{
|
||||
#if defined HAVE_STRERROR_R || defined _LIBC
|
||||
char errbuf[1024];
|
||||
fprintf (stderr, ": %s", __strerror_r (errnum, errbuf, sizeof errbuf));
|
||||
#else
|
||||
fprintf (stderr, ": %s", strerror (errnum));
|
||||
#endif
|
||||
}
|
||||
putc ('\n', stderr);
|
||||
fflush (stderr);
|
||||
if (status)
|
||||
@@ -149,7 +168,7 @@ error (status, errnum, message, va_alist)
|
||||
int error_one_per_line;
|
||||
|
||||
void
|
||||
#if defined(VA_START) && __STDC__
|
||||
#if defined VA_START && __STDC__
|
||||
error_at_line (int status, int errnum, const char *file_name,
|
||||
unsigned int line_number, const char *message, ...)
|
||||
#else
|
||||
@@ -205,9 +224,24 @@ error_at_line (status, errnum, file_name, line_number, message, va_alist)
|
||||
|
||||
++error_message_count;
|
||||
if (errnum)
|
||||
fprintf (stderr, ": %s", strerror (errnum));
|
||||
{
|
||||
#if defined HAVE_STRERROR_R || defined _LIBC
|
||||
char errbuf[1024];
|
||||
fprintf (stderr, ": %s", __strerror_r (errnum, errbuf, sizeof errbuf));
|
||||
#else
|
||||
fprintf (stderr, ": %s", strerror (errnum));
|
||||
#endif
|
||||
}
|
||||
putc ('\n', stderr);
|
||||
fflush (stderr);
|
||||
if (status)
|
||||
exit (status);
|
||||
}
|
||||
|
||||
#ifdef _LIBC
|
||||
/* Make the weak alias. */
|
||||
# undef error
|
||||
# undef error_at_line
|
||||
weak_alias (__error, error)
|
||||
weak_alias (__error_at_line, error_at_line)
|
||||
#endif
|
||||
|
||||
57
lib/error.h
57
lib/error.h
@@ -1,10 +1,14 @@
|
||||
/* error.h -- declaration for error-reporting function
|
||||
Copyright (C) 1995, 1996 Free Software Foundation, Inc.
|
||||
/* Declaration for error-reporting function
|
||||
Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
NOTE: The canonical source of this file is maintained with the GNU C Library.
|
||||
Bugs can be reported to bug-glibc@prep.ai.mit.edu.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
@@ -12,26 +16,31 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
USA. */
|
||||
|
||||
#ifndef ERROR_H_
|
||||
# define ERROR_H_
|
||||
#ifndef _ERROR_H
|
||||
#define _ERROR_H 1
|
||||
|
||||
# ifndef __attribute__
|
||||
#ifndef __attribute__
|
||||
/* This feature is available in gcc versions 2.5 and later. */
|
||||
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
|
||||
# define __attribute__(Spec) /* empty */
|
||||
# endif
|
||||
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
|
||||
# define __attribute__(Spec) /* empty */
|
||||
# endif
|
||||
/* The __-protected variants of `format' and `printf' attributes
|
||||
are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */
|
||||
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
|
||||
# define __format__ format
|
||||
# define __printf__ printf
|
||||
# endif
|
||||
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
|
||||
# define __format__ format
|
||||
# define __printf__ printf
|
||||
# endif
|
||||
#endif
|
||||
|
||||
# if defined (__STDC__) && __STDC__
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#if defined (__STDC__) && __STDC__
|
||||
|
||||
/* Print a message with `fprintf (stderr, FORMAT, ...)';
|
||||
if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM).
|
||||
@@ -49,11 +58,11 @@ extern void error_at_line (int status, int errnum, const char *fname,
|
||||
function without parameters instead. */
|
||||
extern void (*error_print_progname) (void);
|
||||
|
||||
# else
|
||||
#else
|
||||
void error ();
|
||||
void error_at_line ();
|
||||
extern void (*error_print_progname) ();
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* This variable is incremented each time `error' is called. */
|
||||
extern unsigned int error_message_count;
|
||||
@@ -62,4 +71,8 @@ extern unsigned int error_message_count;
|
||||
variable controls whether this mode is selected or not. */
|
||||
extern int error_one_per_line;
|
||||
|
||||
#endif /* not ERROR_H_ */
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* error.h */
|
||||
|
||||
@@ -21,7 +21,7 @@ Suite 330, Boston, MA 02111-1307, USA. */
|
||||
/* Written by David MacKenzie and Torbjorn Granlund.
|
||||
Adapted for GNU C library by Roland McGrath. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
@@ -111,7 +111,7 @@ static gid_t egid;
|
||||
/* Nonzero if UID, GID, EUID, and EGID have valid values. */
|
||||
static int have_ids = 0;
|
||||
|
||||
# ifdef HAVE_GETGROUPS
|
||||
# if HAVE_GETGROUPS
|
||||
int group_member ();
|
||||
# else
|
||||
# define group_member(gid) 0
|
||||
|
||||
127
lib/exclude.c
Normal file
127
lib/exclude.c
Normal file
@@ -0,0 +1,127 @@
|
||||
/* exclude.c -- exclude file names
|
||||
Copyright 1992, 1993, 1994, 1997 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; see the file COPYING.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* Written by Paul Eggert <eggert@twinsun.com> */
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
#ifndef errno
|
||||
extern int errno;
|
||||
#endif
|
||||
#include <exclude.h>
|
||||
#include <fnmatch.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
void *xmalloc PARAMS ((size_t));
|
||||
void *xrealloc PARAMS ((void *, size_t));
|
||||
|
||||
/* Keep track of excluded file name patterns. */
|
||||
|
||||
struct exclude
|
||||
{
|
||||
char const **exclude;
|
||||
int exclude_alloc;
|
||||
int exclude_count;
|
||||
};
|
||||
|
||||
struct exclude *
|
||||
new_exclude (void)
|
||||
{
|
||||
struct exclude *ex = (struct exclude *) xmalloc (sizeof (struct exclude));
|
||||
ex->exclude_count = 0;
|
||||
ex->exclude_alloc = 64;
|
||||
ex->exclude = (char const **) xmalloc (ex->exclude_alloc * sizeof (char *));
|
||||
return ex;
|
||||
}
|
||||
|
||||
int
|
||||
excluded_filename (struct exclude const *ex, char const *f)
|
||||
{
|
||||
char const * const *exclude = ex->exclude;
|
||||
int exclude_count = ex->exclude_count;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < exclude_count; i++)
|
||||
if (fnmatch (exclude[i], f, 0) == 0)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
add_exclude (struct exclude *ex, char const *pattern)
|
||||
{
|
||||
if (ex->exclude_alloc <= ex->exclude_count)
|
||||
ex->exclude = (char const **) xrealloc (ex->exclude,
|
||||
((ex->exclude_alloc *= 2)
|
||||
* sizeof (char *)));
|
||||
|
||||
ex->exclude[ex->exclude_count++] = pattern;
|
||||
}
|
||||
|
||||
int
|
||||
add_exclude_file (struct exclude *ex, char const *filename, char line_end)
|
||||
{
|
||||
int use_stdin = filename[0] == '-' && !filename[1];
|
||||
FILE *in;
|
||||
char *buf;
|
||||
char *p;
|
||||
char const *pattern;
|
||||
char const *lim;
|
||||
size_t buf_alloc = 1024;
|
||||
size_t buf_count = 0;
|
||||
int c;
|
||||
int e = 0;
|
||||
|
||||
if (use_stdin)
|
||||
in = stdin;
|
||||
else if (! (in = fopen (filename, "r")))
|
||||
return -1;
|
||||
|
||||
buf = xmalloc (buf_alloc);
|
||||
|
||||
while ((c = getc (in)) != EOF)
|
||||
{
|
||||
buf[buf_count++] = c;
|
||||
if (buf_count == buf_alloc)
|
||||
buf = xrealloc (buf, buf_alloc *= 2);
|
||||
}
|
||||
|
||||
buf = xrealloc (buf, buf_count + 1);
|
||||
|
||||
if (ferror (in))
|
||||
e = errno;
|
||||
|
||||
if (!use_stdin && fclose (in) != 0)
|
||||
e = errno;
|
||||
|
||||
for (pattern = p = buf, lim = buf + buf_count; p <= lim; p++)
|
||||
if (p < lim ? *p == line_end : buf < p && p[-1])
|
||||
{
|
||||
*p = '\0';
|
||||
add_exclude (ex, pattern);
|
||||
pattern = p + 1;
|
||||
}
|
||||
|
||||
errno = e;
|
||||
return e ? -1 : 0;
|
||||
}
|
||||
34
lib/exclude.h
Normal file
34
lib/exclude.h
Normal file
@@ -0,0 +1,34 @@
|
||||
/* exclude.h -- declarations for excluding file names
|
||||
Copyright 1992, 1993, 1994, 1997 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; see the file COPYING.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* Written by Paul Eggert <eggert@twinsun.com> */
|
||||
|
||||
#ifndef PARAMS
|
||||
# if defined PROTOTYPES || (defined __STDC__ && __STDC__)
|
||||
# define PARAMS(Args) Args
|
||||
# else
|
||||
# define PARAMS(Args) ()
|
||||
# endif
|
||||
#endif
|
||||
|
||||
struct exclude;
|
||||
|
||||
struct exclude *new_exclude PARAMS ((void));
|
||||
void add_exclude PARAMS ((struct exclude *, char const *));
|
||||
int add_exclude_file PARAMS ((struct exclude *, char const *, char));
|
||||
int excluded_filename PARAMS ((struct exclude const *, char const *));
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Convert file size to number of blocks on System V-like machines.
|
||||
Copyright (C) 1990 Free Software Foundation, Inc.
|
||||
Copyright (C) 1990, 1997, 1998 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -17,23 +17,31 @@
|
||||
|
||||
/* Written by Brian L. Matthews, blm@6sceng.UUCP. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#if !defined (HAVE_ST_BLOCKS) && !defined(_POSIX_VERSION)
|
||||
# include <sys/types.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#if HAVE_SYS_PARAM_H
|
||||
# include <sys/param.h>
|
||||
#endif
|
||||
|
||||
#if !HAVE_ST_BLOCKS && !defined _POSIX_SOURCE && defined BSIZE
|
||||
|
||||
# if HAVE_UNISTD_H
|
||||
# include <unistd.h>
|
||||
# endif
|
||||
|
||||
# ifndef NINDIR
|
||||
/* Some SysV's, like Irix, seem to lack these. Hope they're correct. */
|
||||
/* Size of a indirect block, in bytes. */
|
||||
# ifndef BSIZE
|
||||
# define BSIZE 1024
|
||||
|
||||
# if defined (__DJGPP__)
|
||||
typedef long daddr_t; /* for disk address */
|
||||
# endif
|
||||
|
||||
/* Some SysV's, like Irix, seem to lack this. Hope it's correct. */
|
||||
/* Number of inode pointers per indirect block. */
|
||||
# define NINDIR (BSIZE/sizeof(daddr_t))
|
||||
# define NINDIR (BSIZE / sizeof (daddr_t))
|
||||
# endif /* !NINDIR */
|
||||
|
||||
/* Number of direct block addresses in an inode. */
|
||||
@@ -41,12 +49,12 @@
|
||||
|
||||
/* Return the number of 512-byte blocks in a file of SIZE bytes. */
|
||||
|
||||
long
|
||||
off_t
|
||||
st_blocks (size)
|
||||
long size;
|
||||
off_t size;
|
||||
{
|
||||
long datablks = (size + 512 - 1) / 512;
|
||||
long indrblks = 0;
|
||||
off_t datablks = size / 512 + (size % 512 != 0);
|
||||
off_t indrblks = 0;
|
||||
|
||||
if (datablks > NDIR)
|
||||
{
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* filemode.c -- make a string describing file modes
|
||||
Copyright (C) 1985, 1990, 1993 Free Software Foundation, Inc.
|
||||
Copyright (C) 1985, 1990, 1993, 1998 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -15,8 +15,8 @@
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
@@ -47,45 +47,45 @@
|
||||
#endif
|
||||
|
||||
#ifdef STAT_MACROS_BROKEN
|
||||
#undef S_ISBLK
|
||||
#undef S_ISCHR
|
||||
#undef S_ISDIR
|
||||
#undef S_ISFIFO
|
||||
#undef S_ISLNK
|
||||
#undef S_ISMPB
|
||||
#undef S_ISMPC
|
||||
#undef S_ISNWK
|
||||
#undef S_ISREG
|
||||
#undef S_ISSOCK
|
||||
# undef S_ISBLK
|
||||
# undef S_ISCHR
|
||||
# undef S_ISDIR
|
||||
# undef S_ISFIFO
|
||||
# undef S_ISLNK
|
||||
# undef S_ISMPB
|
||||
# undef S_ISMPC
|
||||
# undef S_ISNWK
|
||||
# undef S_ISREG
|
||||
# undef S_ISSOCK
|
||||
#endif /* STAT_MACROS_BROKEN. */
|
||||
|
||||
#if !defined(S_ISBLK) && defined(S_IFBLK)
|
||||
#define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
|
||||
# define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
|
||||
#endif
|
||||
#if !defined(S_ISCHR) && defined(S_IFCHR)
|
||||
#define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
|
||||
# define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
|
||||
#endif
|
||||
#if !defined(S_ISDIR) && defined(S_IFDIR)
|
||||
#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
|
||||
# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
|
||||
#endif
|
||||
#if !defined(S_ISREG) && defined(S_IFREG)
|
||||
#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
|
||||
# define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
|
||||
#endif
|
||||
#if !defined(S_ISFIFO) && defined(S_IFIFO)
|
||||
#define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
|
||||
# define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
|
||||
#endif
|
||||
#if !defined(S_ISLNK) && defined(S_IFLNK)
|
||||
#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
|
||||
# define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
|
||||
#endif
|
||||
#if !defined(S_ISSOCK) && defined(S_IFSOCK)
|
||||
#define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
|
||||
# define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
|
||||
#endif
|
||||
#if !defined(S_ISMPB) && defined(S_IFMPB) /* V7 */
|
||||
#define S_ISMPB(m) (((m) & S_IFMT) == S_IFMPB)
|
||||
#define S_ISMPC(m) (((m) & S_IFMT) == S_IFMPC)
|
||||
# define S_ISMPB(m) (((m) & S_IFMT) == S_IFMPB)
|
||||
# define S_ISMPC(m) (((m) & S_IFMT) == S_IFMPC)
|
||||
#endif
|
||||
#if !defined(S_ISNWK) && defined(S_IFNWK) /* HP/UX */
|
||||
#define S_ISNWK(m) (((m) & S_IFMT) == S_IFNWK)
|
||||
# define S_ISNWK(m) (((m) & S_IFMT) == S_IFNWK)
|
||||
#endif
|
||||
|
||||
void mode_string ();
|
||||
|
||||
@@ -1,38 +1,32 @@
|
||||
/* Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1991, 1992, 1993, 1996, 1997 Free Software Foundation, Inc.
|
||||
|
||||
NOTE: The canonical source of this file is maintained with the GNU C
|
||||
Library. Bugs can be reported to bug-glibc@prep.ai.mit.edu.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
/* Enable GNU extensions in fnmatch.h. */
|
||||
#ifndef _GNU_SOURCE
|
||||
# define _GNU_SOURCE 1
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
#include <fnmatch.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#if defined (STDC_HEADERS) || !defined (isascii)
|
||||
# define ISASCII(c) 1
|
||||
#else
|
||||
# define ISASCII(c) isascii(c)
|
||||
#endif
|
||||
|
||||
#define ISUPPER(c) (ISASCII (c) && isupper (c))
|
||||
|
||||
|
||||
/* Comment out all this code if we are using the GNU C Library, and are not
|
||||
actually compiling the library itself. This code is part of the GNU C
|
||||
@@ -42,7 +36,16 @@
|
||||
program understand `configure --with-gnu-libc' and omit the object files,
|
||||
it is simpler to just do this in the source for each such file. */
|
||||
|
||||
#if defined (_LIBC) || !defined (__GNU_LIBRARY__)
|
||||
#if defined _LIBC || !defined __GNU_LIBRARY__
|
||||
|
||||
|
||||
# if defined STDC_HEADERS || !defined isascii
|
||||
# define ISASCII(c) 1
|
||||
# else
|
||||
# define ISASCII(c) isascii(c)
|
||||
# endif
|
||||
|
||||
# define ISUPPER(c) (ISASCII (c) && isupper (c))
|
||||
|
||||
|
||||
# ifndef errno
|
||||
@@ -60,8 +63,8 @@ fnmatch (pattern, string, flags)
|
||||
register const char *p = pattern, *n = string;
|
||||
register char c;
|
||||
|
||||
/* Note that this evalutes C many times. */
|
||||
# define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER (c) ? tolower (c) : (c))
|
||||
/* Note that this evaluates C many times. */
|
||||
# define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER (c) ? tolower (c) : (c))
|
||||
|
||||
while ((c = *p++) != '\0')
|
||||
{
|
||||
@@ -83,6 +86,9 @@ fnmatch (pattern, string, flags)
|
||||
if (!(flags & FNM_NOESCAPE))
|
||||
{
|
||||
c = *p++;
|
||||
if (c == '\0')
|
||||
/* Trailing \ loses. */
|
||||
return FNM_NOMATCH;
|
||||
c = FOLD (c);
|
||||
}
|
||||
if (FOLD (*n) != c)
|
||||
@@ -94,10 +100,24 @@ fnmatch (pattern, string, flags)
|
||||
(n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/')))
|
||||
return FNM_NOMATCH;
|
||||
|
||||
for (c = *p++; c == '?' || c == '*'; c = *p++, ++n)
|
||||
if (((flags & FNM_FILE_NAME) && *n == '/') ||
|
||||
(c == '?' && *n == '\0'))
|
||||
return FNM_NOMATCH;
|
||||
for (c = *p++; c == '?' || c == '*'; c = *p++)
|
||||
{
|
||||
if ((flags & FNM_FILE_NAME) && *n == '/')
|
||||
/* A slash does not match a wildcard under FNM_FILE_NAME. */
|
||||
return FNM_NOMATCH;
|
||||
else if (c == '?')
|
||||
{
|
||||
/* A ? needs to match one character. */
|
||||
if (*n == '\0')
|
||||
/* There isn't another character; no match. */
|
||||
return FNM_NOMATCH;
|
||||
else
|
||||
/* One character of the string is consumed in matching
|
||||
this ? wildcard, so *??? won't match if there are
|
||||
less than three characters. */
|
||||
++n;
|
||||
}
|
||||
}
|
||||
|
||||
if (c == '\0')
|
||||
return 0;
|
||||
@@ -134,7 +154,11 @@ fnmatch (pattern, string, flags)
|
||||
register char cstart = c, cend = c;
|
||||
|
||||
if (!(flags & FNM_NOESCAPE) && c == '\\')
|
||||
cstart = cend = *p++;
|
||||
{
|
||||
if (*p == '\0')
|
||||
return FNM_NOMATCH;
|
||||
cstart = cend = *p++;
|
||||
}
|
||||
|
||||
cstart = cend = FOLD (cstart);
|
||||
|
||||
@@ -181,8 +205,12 @@ fnmatch (pattern, string, flags)
|
||||
|
||||
c = *p++;
|
||||
if (!(flags & FNM_NOESCAPE) && c == '\\')
|
||||
/* XXX 1003.2d11 is unclear if this is right. */
|
||||
++p;
|
||||
{
|
||||
if (*p == '\0')
|
||||
return FNM_NOMATCH;
|
||||
/* XXX 1003.2d11 is unclear if this is right. */
|
||||
++p;
|
||||
}
|
||||
}
|
||||
if (not)
|
||||
return FNM_NOMATCH;
|
||||
|
||||
132
lib/fsusage.c
132
lib/fsusage.c
@@ -1,5 +1,5 @@
|
||||
/* fsusage.c -- return space usage of mounted filesystems
|
||||
Copyright (C) 1991, 1992, 1996 Free Software Foundation, Inc.
|
||||
Copyright (C) 1991, 1992, 1996, 1998 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -19,10 +19,20 @@
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#if HAVE_INTTYPES_H
|
||||
# include <inttypes.h>
|
||||
#endif
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include "fsusage.h"
|
||||
|
||||
#if HAVE_LIMITS_H
|
||||
# include <limits.h>
|
||||
#endif
|
||||
#ifndef CHAR_BIT
|
||||
# define CHAR_BIT 8
|
||||
#endif
|
||||
|
||||
int statfs ();
|
||||
|
||||
#if HAVE_SYS_PARAM_H
|
||||
@@ -62,30 +72,27 @@ int statfs ();
|
||||
int statvfs ();
|
||||
#endif
|
||||
|
||||
/* Many space usage primitives use all 1 bits to denote a value that is
|
||||
not applicable or unknown. Propagate this information by returning
|
||||
a uintmax_t value that is all 1 bits if the argument is all 1 bits,
|
||||
even if the argument is unsigned and smaller than uintmax_t. */
|
||||
#define PROPAGATE_ALL_ONES(x) ((x) == -1 ? (uintmax_t) -1 : (uintmax_t) (x))
|
||||
|
||||
/* Extract the top bit of X as an uintmax_t value. */
|
||||
#define EXTRACT_TOP_BIT(x) ((x) \
|
||||
& ((uintmax_t) 1 << (sizeof (x) * CHAR_BIT - 1)))
|
||||
|
||||
/* If a value is negative, many space usage primitives store it into an
|
||||
integer variable by assignment, even if the variable's type is unsigned.
|
||||
So, if a space usage variable X's top bit is set, convert X to the
|
||||
uintmax_t value V such that (- (uintmax_t) V) is the negative of
|
||||
the original value. If X's top bit is clear, just yield X.
|
||||
Use PROPAGATE_TOP_BIT if the original value might be negative;
|
||||
otherwise, use PROPAGATE_ALL_ONES. */
|
||||
#define PROPAGATE_TOP_BIT(x) ((x) | ~ (EXTRACT_TOP_BIT (x) - 1))
|
||||
|
||||
int safe_read ();
|
||||
|
||||
/* Return the number of TOSIZE-byte blocks used by
|
||||
BLOCKS FROMSIZE-byte blocks, rounding away from zero.
|
||||
TOSIZE must be positive. Return -1 if FROMSIZE is not positive. */
|
||||
|
||||
static long
|
||||
adjust_blocks (blocks, fromsize, tosize)
|
||||
long blocks;
|
||||
int fromsize, tosize;
|
||||
{
|
||||
if (tosize <= 0)
|
||||
abort ();
|
||||
if (fromsize <= 0)
|
||||
return -1;
|
||||
|
||||
if (fromsize == tosize) /* e.g., from 512 to 512 */
|
||||
return blocks;
|
||||
else if (fromsize > tosize) /* e.g., from 2048 to 512 */
|
||||
return blocks * (fromsize / tosize);
|
||||
else /* e.g., from 256 to 512 */
|
||||
return (blocks + (blocks < 0 ? -1 : 1)) / (tosize / fromsize);
|
||||
}
|
||||
|
||||
/* Fill in the fields of FSP with information about space usage for
|
||||
the filesystem on which PATH resides.
|
||||
DISK is the device on which PATH is mounted, for space-getting
|
||||
@@ -100,27 +107,30 @@ get_fs_usage (path, disk, fsp)
|
||||
struct fs_usage *fsp;
|
||||
{
|
||||
#ifdef STAT_STATFS3_OSF1
|
||||
# define CONVERT_BLOCKS(B) adjust_blocks ((B), fsd.f_fsize, 512)
|
||||
|
||||
struct statfs fsd;
|
||||
|
||||
if (statfs (path, &fsd, sizeof (struct statfs)) != 0)
|
||||
return -1;
|
||||
|
||||
fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_fsize);
|
||||
|
||||
#endif /* STAT_STATFS3_OSF1 */
|
||||
|
||||
#ifdef STAT_STATFS2_FS_DATA /* Ultrix */
|
||||
# define CONVERT_BLOCKS(B) adjust_blocks ((B), 1024, 512)
|
||||
|
||||
struct fs_data fsd;
|
||||
|
||||
if (statfs (path, &fsd) != 1)
|
||||
return -1;
|
||||
fsp->fsu_blocks = CONVERT_BLOCKS (fsd.fd_req.btot);
|
||||
fsp->fsu_bfree = CONVERT_BLOCKS (fsd.fd_req.bfree);
|
||||
fsp->fsu_bavail = CONVERT_BLOCKS (fsd.fd_req.bfreen);
|
||||
fsp->fsu_files = fsd.fd_req.gtot;
|
||||
fsp->fsu_ffree = fsd.fd_req.gfree;
|
||||
|
||||
fsp->fsu_blocksize = 1024;
|
||||
fsp->fsu_blocks = PROPAGATE_ALL_ONES (fsd.fd_req.btot);
|
||||
fsp->fsu_bfree = PROPAGATE_ALL_ONES (fsd.fd_req.bfree);
|
||||
fsp->fsu_bavail = PROPAGATE_TOP_BIT (fsd.fd_req.bfreen);
|
||||
fsp->fsu_bavail_top_bit_set = EXTRACT_TOP_BIT (fsd.fd_req.bfreen) != 0;
|
||||
fsp->fsu_files = PROPAGATE_ALL_ONES (fsd.fd_req.gtot);
|
||||
fsp->fsu_ffree = PROPAGATE_ALL_ONES (fsd.fd_req.gfree);
|
||||
|
||||
#endif /* STAT_STATFS2_FS_DATA */
|
||||
|
||||
@@ -128,8 +138,6 @@ get_fs_usage (path, disk, fsp)
|
||||
# ifndef SUPERBOFF
|
||||
# define SUPERBOFF (SUPERB * 512)
|
||||
# endif
|
||||
# define CONVERT_BLOCKS(B) \
|
||||
adjust_blocks ((B), (fsd.s_type == Fs2b ? 1024 : 512), 512)
|
||||
|
||||
struct filsys fsd;
|
||||
int fd;
|
||||
@@ -143,29 +151,35 @@ get_fs_usage (path, disk, fsp)
|
||||
fd = open (disk, O_RDONLY);
|
||||
if (fd < 0)
|
||||
return -1;
|
||||
lseek (fd, (long) SUPERBOFF, 0);
|
||||
lseek (fd, (off_t) SUPERBOFF, 0);
|
||||
if (safe_read (fd, (char *) &fsd, sizeof fsd) != sizeof fsd)
|
||||
{
|
||||
close (fd);
|
||||
return -1;
|
||||
}
|
||||
close (fd);
|
||||
fsp->fsu_blocks = CONVERT_BLOCKS (fsd.s_fsize);
|
||||
fsp->fsu_bfree = CONVERT_BLOCKS (fsd.s_tfree);
|
||||
fsp->fsu_bavail = CONVERT_BLOCKS (fsd.s_tfree);
|
||||
fsp->fsu_files = (fsd.s_isize - 2) * INOPB * (fsd.s_type == Fs2b ? 2 : 1);
|
||||
fsp->fsu_ffree = fsd.s_tinode;
|
||||
|
||||
fsp->fsu_blocksize = (fsd.s_type == Fs2b ? 1024 : 512);
|
||||
fsp->fsu_blocks = PROPAGATE_ALL_ONES (fsd.s_fsize);
|
||||
fsp->fsu_bfree = PROPAGATE_ALL_ONES (fsd.s_tfree);
|
||||
fsp->fsu_bavail = PROPAGATE_TOP_BIT (fsd.s_tfree);
|
||||
fsp->fsu_bavail_top_bit_set = EXTRACT_TOP_BIT (fsd.s_tfree) != 0;
|
||||
fsp->fsu_files = (fsd.s_isize == -1
|
||||
? (uintmax_t) -1
|
||||
: (fsd.s_isize - 2) * INOPB * (fsd.s_type == Fs2b ? 2 : 1));
|
||||
fsp->fsu_ffree = PROPAGATE_ALL_ONES (fsd.s_tinode);
|
||||
|
||||
#endif /* STAT_READ_FILSYS */
|
||||
|
||||
#ifdef STAT_STATFS2_BSIZE /* 4.3BSD, SunOS 4, HP-UX, AIX */
|
||||
# define CONVERT_BLOCKS(B) adjust_blocks ((B), fsd.f_bsize, 512)
|
||||
|
||||
struct statfs fsd;
|
||||
|
||||
if (statfs (path, &fsd) < 0)
|
||||
return -1;
|
||||
|
||||
fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_bsize);
|
||||
|
||||
# ifdef STATFS_TRUNCATES_BLOCK_COUNTS
|
||||
|
||||
/* In SunOS 4.1.2, 4.1.3, and 4.1.3_U1, the block counts in the
|
||||
@@ -184,60 +198,60 @@ get_fs_usage (path, disk, fsp)
|
||||
#endif /* STAT_STATFS2_BSIZE */
|
||||
|
||||
#ifdef STAT_STATFS2_FSIZE /* 4.4BSD */
|
||||
# define CONVERT_BLOCKS(B) adjust_blocks ((B), fsd.f_fsize, 512)
|
||||
|
||||
struct statfs fsd;
|
||||
|
||||
if (statfs (path, &fsd) < 0)
|
||||
return -1;
|
||||
|
||||
fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_fsize);
|
||||
|
||||
#endif /* STAT_STATFS2_FSIZE */
|
||||
|
||||
#ifdef STAT_STATFS4 /* SVR3, Dynix, Irix, AIX */
|
||||
# if _AIX || defined(_CRAY)
|
||||
# define CONVERT_BLOCKS(B) adjust_blocks ((B), fsd.f_bsize, 512)
|
||||
# ifdef _CRAY
|
||||
# define f_bavail f_bfree
|
||||
# endif
|
||||
# else
|
||||
# define CONVERT_BLOCKS(B) (B)
|
||||
# ifndef _SEQUENT_ /* _SEQUENT_ is DYNIX/ptx */
|
||||
# ifndef DOLPHIN /* DOLPHIN 3.8.alfa/7.18 has f_bavail */
|
||||
# define f_bavail f_bfree
|
||||
# endif
|
||||
# endif
|
||||
|
||||
# if !_AIX && !defined _SEQUENT_ && !defined DOLPHIN
|
||||
# define f_bavail f_bfree
|
||||
# endif
|
||||
|
||||
struct statfs fsd;
|
||||
|
||||
if (statfs (path, &fsd, sizeof fsd, 0) < 0)
|
||||
return -1;
|
||||
|
||||
/* Empirically, the block counts on most SVR3 and SVR3-derived
|
||||
systems seem to always be in terms of 512-byte blocks,
|
||||
no matter what value f_bsize has. */
|
||||
# if _AIX || defined(_CRAY)
|
||||
fsp->fsu_blocksize = PROPAGATE_ALL_ONES (fsd.f_bsize);
|
||||
# else
|
||||
fsp->fsu_blocksize = 512;
|
||||
# endif
|
||||
|
||||
#endif /* STAT_STATFS4 */
|
||||
|
||||
#ifdef STAT_STATVFS /* SVR4 */
|
||||
# define CONVERT_BLOCKS(B) \
|
||||
adjust_blocks ((B), fsd.f_frsize ? fsd.f_frsize : fsd.f_bsize, 512)
|
||||
|
||||
struct statvfs fsd;
|
||||
|
||||
if (statvfs (path, &fsd) < 0)
|
||||
return -1;
|
||||
|
||||
/* f_frsize isn't guaranteed to be supported. */
|
||||
fsp->fsu_blocksize =
|
||||
PROPAGATE_ALL_ONES (fsd.f_frsize ? fsd.f_frsize : fsd.f_bsize);
|
||||
|
||||
#endif /* STAT_STATVFS */
|
||||
|
||||
#if !defined(STAT_STATFS2_FS_DATA) && !defined(STAT_READ_FILSYS)
|
||||
/* !Ultrix && !SVR2 */
|
||||
|
||||
fsp->fsu_blocks = CONVERT_BLOCKS (fsd.f_blocks);
|
||||
fsp->fsu_bfree = CONVERT_BLOCKS (fsd.f_bfree);
|
||||
fsp->fsu_bavail = CONVERT_BLOCKS (fsd.f_bavail);
|
||||
fsp->fsu_files = fsd.f_files;
|
||||
fsp->fsu_ffree = fsd.f_ffree;
|
||||
fsp->fsu_blocks = PROPAGATE_ALL_ONES (fsd.f_blocks);
|
||||
fsp->fsu_bfree = PROPAGATE_ALL_ONES (fsd.f_bfree);
|
||||
fsp->fsu_bavail = PROPAGATE_TOP_BIT (fsd.f_bavail);
|
||||
fsp->fsu_bavail_top_bit_set = EXTRACT_TOP_BIT (fsd.f_bavail) != 0;
|
||||
fsp->fsu_files = PROPAGATE_ALL_ONES (fsd.f_files);
|
||||
fsp->fsu_ffree = PROPAGATE_ALL_ONES (fsd.f_ffree);
|
||||
|
||||
#endif /* not STAT_STATFS2_FS_DATA && not STAT_READ_FILSYS */
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* fsusage.h -- declarations for filesystem space usage info
|
||||
Copyright (C) 1991, 1992 Free Software Foundation, Inc.
|
||||
Copyright (C) 1991, 1992, 1997 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -16,22 +16,30 @@
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* Space usage statistics for a filesystem. Blocks are 512-byte. */
|
||||
|
||||
#if !defined FSUSAGE_H_
|
||||
# define FSUSAGE_H_
|
||||
|
||||
struct fs_usage
|
||||
{
|
||||
long fsu_blocks; /* Total blocks. */
|
||||
long fsu_bfree; /* Free blocks available to superuser. */
|
||||
long fsu_bavail; /* Free blocks available to non-superuser. */
|
||||
long fsu_files; /* Total file nodes. */
|
||||
long fsu_ffree; /* Free file nodes. */
|
||||
int fsu_blocksize; /* Size of a block. */
|
||||
uintmax_t fsu_blocks; /* Total blocks. */
|
||||
uintmax_t fsu_bfree; /* Free blocks available to superuser. */
|
||||
uintmax_t fsu_bavail; /* Free blocks available to non-superuser. */
|
||||
int fsu_bavail_top_bit_set; /* 1 if fsu_bavail represents a value < 0. */
|
||||
uintmax_t fsu_files; /* Total file nodes. */
|
||||
uintmax_t fsu_ffree; /* Free file nodes. */
|
||||
};
|
||||
|
||||
#ifndef __P
|
||||
#if defined (__GNUC__) || (defined (__STDC__) && __STDC__)
|
||||
#define __P(args) args
|
||||
#else
|
||||
#define __P(args) ()
|
||||
#endif /* GCC. */
|
||||
#endif /* Not __P. */
|
||||
# ifndef PARAMS
|
||||
# if defined PROTOTYPES || (defined __STDC__ && __STDC__)
|
||||
# define PARAMS(Args) Args
|
||||
# else
|
||||
# define PARAMS(Args) ()
|
||||
# endif
|
||||
# endif
|
||||
|
||||
int get_fs_usage __P ((const char *path, const char *disk,
|
||||
struct fs_usage *fsp));
|
||||
int get_fs_usage PARAMS ((const char *path, const char *disk,
|
||||
struct fs_usage *fsp));
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/* ftruncate emulations that work on some System V's.
|
||||
This file is in the public domain. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
@@ -19,15 +19,15 @@ ftruncate (fd, length)
|
||||
}
|
||||
|
||||
#else /* not F_CHSIZE */
|
||||
#ifdef F_FREESP
|
||||
# ifdef F_FREESP
|
||||
|
||||
/* By William Kucharski <kucharsk@netcom.com>. */
|
||||
|
||||
#include <sys/stat.h>
|
||||
#include <errno.h>
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
# include <sys/stat.h>
|
||||
# include <errno.h>
|
||||
# if HAVE_UNISTD_H
|
||||
# include <unistd.h>
|
||||
# endif
|
||||
|
||||
int
|
||||
ftruncate (fd, length)
|
||||
@@ -71,8 +71,8 @@ ftruncate (fd, length)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else /* not F_CHSIZE nor F_FREESP */
|
||||
#ifdef HAVE_CHSIZE
|
||||
# else /* not F_CHSIZE nor F_FREESP */
|
||||
# if HAVE_CHSIZE
|
||||
|
||||
int
|
||||
ftruncate (fd, length)
|
||||
@@ -82,12 +82,12 @@ ftruncate (fd, length)
|
||||
return chsize (fd, length);
|
||||
}
|
||||
|
||||
#else /* not F_CHSIZE nor F_FREESP nor HAVE_CHSIZE */
|
||||
# else /* not F_CHSIZE nor F_FREESP nor HAVE_CHSIZE */
|
||||
|
||||
#include <errno.h>
|
||||
#ifndef errno
|
||||
# include <errno.h>
|
||||
# ifndef errno
|
||||
extern int errno;
|
||||
#endif
|
||||
# endif
|
||||
|
||||
int
|
||||
ftruncate (fd, length)
|
||||
@@ -98,6 +98,6 @@ ftruncate (fd, length)
|
||||
return -1;
|
||||
}
|
||||
|
||||
#endif /* not HAVE_CHSIZE */
|
||||
#endif /* not F_FREESP */
|
||||
# endif /* not HAVE_CHSIZE */
|
||||
# endif /* not F_FREESP */
|
||||
#endif /* not F_CHSIZE */
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* full-write.c -- an interface to write that retries after interrupts
|
||||
Copyright (C) 1993, 1994 Free Software Foundation, Inc.
|
||||
Copyright (C) 1993, 1994, 1997, 1998 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -37,10 +37,7 @@ extern int errno;
|
||||
Return LEN upon success, write's (negative) error code otherwise. */
|
||||
|
||||
int
|
||||
full_write (desc, ptr, len)
|
||||
int desc;
|
||||
char *ptr;
|
||||
size_t len;
|
||||
full_write (int desc, const char *ptr, size_t len)
|
||||
{
|
||||
int total_written;
|
||||
|
||||
@@ -48,6 +45,10 @@ full_write (desc, ptr, len)
|
||||
while (len > 0)
|
||||
{
|
||||
int written = write (desc, ptr, len);
|
||||
/* FIXME: write on my slackware Linux 1.2.13 returns zero when
|
||||
I try to write more data than there is room on a floppy disk.
|
||||
This puts dd into an infinite loop. Reproduce with
|
||||
dd if=/dev/zero of=/dev/fd0. */
|
||||
if (written < 0)
|
||||
{
|
||||
#ifdef EINTR
|
||||
|
||||
46
lib/getdate.h
Normal file
46
lib/getdate.h
Normal file
@@ -0,0 +1,46 @@
|
||||
/* Copyright (C) 1995, 1997, 1998 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#ifndef PARAMS
|
||||
# if defined PROTOTYPES || (defined __STDC__ && __STDC__)
|
||||
# define PARAMS(Args) Args
|
||||
# else
|
||||
# define PARAMS(Args) ()
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef vms
|
||||
# include <types.h>
|
||||
# include <time.h>
|
||||
#else
|
||||
# include <sys/types.h>
|
||||
# if TIME_WITH_SYS_TIME
|
||||
# include <sys/time.h>
|
||||
# include <time.h>
|
||||
# else
|
||||
# if HAVE_SYS_TIME_H
|
||||
# include <sys/time.h>
|
||||
# else
|
||||
# include <time.h>
|
||||
# endif
|
||||
# endif
|
||||
#endif /* defined (vms) */
|
||||
|
||||
time_t get_date PARAMS ((const char *p, const time_t *now));
|
||||
845
lib/getdate.y
845
lib/getdate.y
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
/* getline.c -- Replacement for GNU C library function getline
|
||||
|
||||
Copyright (C) 1993, 1996 Free Software Foundation, Inc.
|
||||
Copyright (C) 1993, 1996, 1997 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
@@ -24,7 +24,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* The `getdelim' function is only declared if the following symbol
|
||||
is defined. */
|
||||
#define _GNU_SOURCE 1
|
||||
#ifndef _GNU_SOURCE
|
||||
# define _GNU_SOURCE 1
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1995 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1995, 1997 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -20,10 +20,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
# include <stdio.h>
|
||||
|
||||
# ifndef PARAMS
|
||||
# if defined (__GNUC__) || __STDC__
|
||||
# define PARAMS(args) args
|
||||
# if defined PROTOTYPES || (defined __STDC__ && __STDC__)
|
||||
# define PARAMS(Args) Args
|
||||
# else
|
||||
# define PARAMS(args) ()
|
||||
# define PARAMS(Args) ()
|
||||
# endif
|
||||
# endif
|
||||
|
||||
|
||||
785
lib/getloadavg.c
785
lib/getloadavg.c
File diff suppressed because it is too large
Load Diff
170
lib/getopt.c
170
lib/getopt.c
@@ -6,23 +6,25 @@
|
||||
Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This file is part of the GNU C Library. Its master source is NOT part of
|
||||
the C library, however. The master source lives in /gd/gnu/lib.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
NOTE: The canonical source of this file is maintained with the GNU C Library.
|
||||
Bugs can be reported to bug-glibc@prep.ai.mit.edu.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
USA. */
|
||||
|
||||
/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.
|
||||
Ditto for AIX 3.2 and <stdlib.h>. */
|
||||
@@ -52,7 +54,7 @@
|
||||
program understand `configure --with-gnu-libc' and omit the object files,
|
||||
it is simpler to just do this in the source for each such file. */
|
||||
|
||||
#define GETOPT_INTERFACE_VERSION 1
|
||||
#define GETOPT_INTERFACE_VERSION 2
|
||||
#if !defined (_LIBC) && defined (__GLIBC__) && __GLIBC__ >= 2
|
||||
#include <gnu-versions.h>
|
||||
#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
|
||||
@@ -88,7 +90,7 @@
|
||||
#ifndef _
|
||||
/* This is for other GNU distributions with internationalized messages.
|
||||
When compiling libc, the _ macro is predefined. */
|
||||
#if defined (HAVE_LIBINTL_H) || defined (ENABLE_NLS)
|
||||
#ifdef HAVE_LIBINTL_H
|
||||
# include <libintl.h>
|
||||
# define _(msgid) gettext (msgid)
|
||||
#else
|
||||
@@ -126,7 +128,7 @@ char *optarg = NULL;
|
||||
|
||||
On entry to `getopt', zero means this is the first call; initialize.
|
||||
|
||||
When `getopt' returns EOF, this is the index of the first of the
|
||||
When `getopt' returns -1, this is the index of the first of the
|
||||
non-option elements that the caller should itself scan.
|
||||
|
||||
Otherwise, `optind' communicates from one call to the next
|
||||
@@ -188,7 +190,7 @@ int optopt = '?';
|
||||
|
||||
The special argument `--' forces an end of option-scanning regardless
|
||||
of the value of `ordering'. In the case of RETURN_IN_ORDER, only
|
||||
`--' can cause `getopt' to return EOF with `optind' != ARGC. */
|
||||
`--' can cause `getopt' to return -1 with `optind' != ARGC. */
|
||||
|
||||
static enum
|
||||
{
|
||||
@@ -253,26 +255,41 @@ static int last_nonopt;
|
||||
/* Bash 2.0 gives us an environment variable containing flags
|
||||
indicating ARGV elements that should not be considered arguments. */
|
||||
|
||||
static const char *nonoption_flags;
|
||||
/* Defined in getopt_init.c */
|
||||
extern char *__getopt_nonoption_flags;
|
||||
|
||||
static int nonoption_flags_max_len;
|
||||
static int nonoption_flags_len;
|
||||
|
||||
static int original_argc;
|
||||
static char *const *original_argv;
|
||||
|
||||
extern pid_t __libc_pid;
|
||||
|
||||
/* Make sure the environment variable bash 2.0 puts in the environment
|
||||
is valid for the getopt call we must make sure that the ARGV passed
|
||||
to getopt is that one passed to the process. */
|
||||
static void store_args (int argc, char *const *argv) __attribute__ ((unused));
|
||||
static void
|
||||
store_args (int argc, char *const *argv)
|
||||
__attribute__ ((unused))
|
||||
store_args_and_env (int argc, char *const *argv)
|
||||
{
|
||||
/* XXX This is no good solution. We should rather copy the args so
|
||||
that we can compare them later. But we must not use malloc(3). */
|
||||
original_argc = argc;
|
||||
original_argv = argv;
|
||||
}
|
||||
text_set_element (__libc_subinit, store_args);
|
||||
#endif
|
||||
text_set_element (__libc_subinit, store_args_and_env);
|
||||
|
||||
# define SWAP_FLAGS(ch1, ch2) \
|
||||
if (nonoption_flags_len > 0) \
|
||||
{ \
|
||||
char __tmp = __getopt_nonoption_flags[ch1]; \
|
||||
__getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \
|
||||
__getopt_nonoption_flags[ch2] = __tmp; \
|
||||
}
|
||||
#else /* !_LIBC */
|
||||
# define SWAP_FLAGS(ch1, ch2)
|
||||
#endif /* _LIBC */
|
||||
|
||||
/* Exchange two adjacent subsequences of ARGV.
|
||||
One subsequence is elements [first_nonopt,last_nonopt)
|
||||
@@ -301,6 +318,28 @@ exchange (argv)
|
||||
It leaves the longer segment in the right place overall,
|
||||
but it consists of two parts that need to be swapped next. */
|
||||
|
||||
#ifdef _LIBC
|
||||
/* First make sure the handling of the `__getopt_nonoption_flags'
|
||||
string can work normally. Our top argument must be in the range
|
||||
of the string. */
|
||||
if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len)
|
||||
{
|
||||
/* We must extend the array. The user plays games with us and
|
||||
presents new arguments. */
|
||||
char *new_str = malloc (top + 1);
|
||||
if (new_str == NULL)
|
||||
nonoption_flags_len = nonoption_flags_max_len = 0;
|
||||
else
|
||||
{
|
||||
memcpy (new_str, __getopt_nonoption_flags, nonoption_flags_max_len);
|
||||
memset (&new_str[nonoption_flags_max_len], '\0',
|
||||
top + 1 - nonoption_flags_max_len);
|
||||
nonoption_flags_max_len = top + 1;
|
||||
__getopt_nonoption_flags = new_str;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
while (top > middle && middle > bottom)
|
||||
{
|
||||
if (top - middle > middle - bottom)
|
||||
@@ -315,6 +354,7 @@ exchange (argv)
|
||||
tem = argv[bottom + i];
|
||||
argv[bottom + i] = argv[top - (middle - bottom) + i];
|
||||
argv[top - (middle - bottom) + i] = tem;
|
||||
SWAP_FLAGS (bottom + i, top - (middle - bottom) + i);
|
||||
}
|
||||
/* Exclude the moved bottom segment from further swapping. */
|
||||
top -= len;
|
||||
@@ -331,6 +371,7 @@ exchange (argv)
|
||||
tem = argv[bottom + i];
|
||||
argv[bottom + i] = argv[middle + i];
|
||||
argv[middle + i] = tem;
|
||||
SWAP_FLAGS (bottom + i, middle + i);
|
||||
}
|
||||
/* Exclude the moved top segment from further swapping. */
|
||||
bottom += len;
|
||||
@@ -358,7 +399,7 @@ _getopt_initialize (argc, argv, optstring)
|
||||
is the program name); the sequence of previously skipped
|
||||
non-option ARGV-elements is empty. */
|
||||
|
||||
first_nonopt = last_nonopt = optind = 1;
|
||||
first_nonopt = last_nonopt = optind;
|
||||
|
||||
nextchar = NULL;
|
||||
|
||||
@@ -385,17 +426,30 @@ _getopt_initialize (argc, argv, optstring)
|
||||
if (posixly_correct == NULL
|
||||
&& argc == original_argc && argv == original_argv)
|
||||
{
|
||||
/* Bash 2.0 puts a special variable in the environment for each
|
||||
command it runs, specifying which ARGV elements are the results of
|
||||
file name wildcard expansion and therefore should not be
|
||||
considered as options. */
|
||||
char var[100];
|
||||
sprintf (var, "_%d_GNU_nonoption_argv_flags_", getpid ());
|
||||
nonoption_flags = getenv (var);
|
||||
if (nonoption_flags == NULL)
|
||||
nonoption_flags_len = 0;
|
||||
else
|
||||
nonoption_flags_len = strlen (nonoption_flags);
|
||||
if (nonoption_flags_max_len == 0)
|
||||
{
|
||||
if (__getopt_nonoption_flags == NULL
|
||||
|| __getopt_nonoption_flags[0] == '\0')
|
||||
nonoption_flags_max_len = -1;
|
||||
else
|
||||
{
|
||||
const char *orig_str = __getopt_nonoption_flags;
|
||||
int len = nonoption_flags_max_len = strlen (orig_str);
|
||||
if (nonoption_flags_max_len < argc)
|
||||
nonoption_flags_max_len = argc;
|
||||
__getopt_nonoption_flags =
|
||||
(char *) malloc (nonoption_flags_max_len);
|
||||
if (__getopt_nonoption_flags == NULL)
|
||||
nonoption_flags_max_len = -1;
|
||||
else
|
||||
{
|
||||
memcpy (__getopt_nonoption_flags, orig_str, len);
|
||||
memset (&__getopt_nonoption_flags[len], '\0',
|
||||
nonoption_flags_max_len - len);
|
||||
}
|
||||
}
|
||||
}
|
||||
nonoption_flags_len = nonoption_flags_max_len;
|
||||
}
|
||||
else
|
||||
nonoption_flags_len = 0;
|
||||
@@ -417,7 +471,7 @@ _getopt_initialize (argc, argv, optstring)
|
||||
updating `optind' and `nextchar' so that the next call to `getopt' can
|
||||
resume the scan with the following option character or ARGV-element.
|
||||
|
||||
If there are no more option characters, `getopt' returns `EOF'.
|
||||
If there are no more option characters, `getopt' returns -1.
|
||||
Then `optind' is the index in ARGV of the first ARGV-element
|
||||
that is not an option. (The ARGV-elements have been permuted
|
||||
so that those that are not options now come last.)
|
||||
@@ -471,10 +525,11 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
|
||||
{
|
||||
optarg = NULL;
|
||||
|
||||
if (!__getopt_initialized || optind == 0)
|
||||
if (optind == 0 || !__getopt_initialized)
|
||||
{
|
||||
if (optind == 0)
|
||||
optind = 1; /* Don't scan ARGV[0], the program name. */
|
||||
optstring = _getopt_initialize (argc, argv, optstring);
|
||||
optind = 1; /* Don't scan ARGV[0], the program name. */
|
||||
__getopt_initialized = 1;
|
||||
}
|
||||
|
||||
@@ -485,7 +540,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
|
||||
#ifdef _LIBC
|
||||
#define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \
|
||||
|| (optind < nonoption_flags_len \
|
||||
&& nonoption_flags[optind] == '1'))
|
||||
&& __getopt_nonoption_flags[optind] == '1'))
|
||||
#else
|
||||
#define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0')
|
||||
#endif
|
||||
@@ -546,7 +601,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
|
||||
that we previously skipped, so the caller will digest them. */
|
||||
if (first_nonopt != last_nonopt)
|
||||
optind = first_nonopt;
|
||||
return EOF;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* If we have come to a non-option and did not permute it,
|
||||
@@ -555,7 +610,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
|
||||
if (NONOPTION_P)
|
||||
{
|
||||
if (ordering == REQUIRE_ORDER)
|
||||
return EOF;
|
||||
return -1;
|
||||
optarg = argv[optind++];
|
||||
return 1;
|
||||
}
|
||||
@@ -646,16 +701,18 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
|
||||
else
|
||||
{
|
||||
if (opterr)
|
||||
if (argv[optind - 1][1] == '-')
|
||||
/* --option */
|
||||
fprintf (stderr,
|
||||
_("%s: option `--%s' doesn't allow an argument\n"),
|
||||
argv[0], pfound->name);
|
||||
else
|
||||
/* +option or -option */
|
||||
fprintf (stderr,
|
||||
_("%s: option `%c%s' doesn't allow an argument\n"),
|
||||
argv[0], argv[optind - 1][0], pfound->name);
|
||||
{
|
||||
if (argv[optind - 1][1] == '-')
|
||||
/* --option */
|
||||
fprintf (stderr,
|
||||
_("%s: option `--%s' doesn't allow an argument\n"),
|
||||
argv[0], pfound->name);
|
||||
else
|
||||
/* +option or -option */
|
||||
fprintf (stderr,
|
||||
_("%s: option `%c%s' doesn't allow an argument\n"),
|
||||
argv[0], argv[optind - 1][0], pfound->name);
|
||||
}
|
||||
|
||||
nextchar += strlen (nextchar);
|
||||
|
||||
@@ -763,8 +820,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
|
||||
if (opterr)
|
||||
{
|
||||
/* 1003.2 specifies the format of this message. */
|
||||
fprintf (stderr,
|
||||
_ ("%s: option requires an argument -- %c\n"),
|
||||
fprintf (stderr, _("%s: option requires an argument -- %c\n"),
|
||||
argv[0], c);
|
||||
}
|
||||
optopt = c;
|
||||
@@ -811,7 +867,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
|
||||
if (ambig && !exact)
|
||||
{
|
||||
if (opterr)
|
||||
fprintf (stderr, _ ("%s: option `-W %s' is ambiguous\n"),
|
||||
fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"),
|
||||
argv[0], argv[optind]);
|
||||
nextchar += strlen (nextchar);
|
||||
optind++;
|
||||
@@ -829,8 +885,8 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
|
||||
else
|
||||
{
|
||||
if (opterr)
|
||||
fprintf (stderr,
|
||||
_ ("%s: option `-W %s' doesn't allow an argument\n"),
|
||||
fprintf (stderr, _("\
|
||||
%s: option `-W %s' doesn't allow an argument\n"),
|
||||
argv[0], pfound->name);
|
||||
|
||||
nextchar += strlen (nextchar);
|
||||
@@ -845,7 +901,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
|
||||
{
|
||||
if (opterr)
|
||||
fprintf (stderr,
|
||||
_ ("%s: option `%s' requires an argument\n"),
|
||||
_("%s: option `%s' requires an argument\n"),
|
||||
argv[0], argv[optind - 1]);
|
||||
nextchar += strlen (nextchar);
|
||||
return optstring[0] == ':' ? ':' : '?';
|
||||
@@ -946,7 +1002,7 @@ main (argc, argv)
|
||||
int this_option_optind = optind ? optind : 1;
|
||||
|
||||
c = getopt (argc, argv, "abc:d:0123456789");
|
||||
if (c == EOF)
|
||||
if (c == -1)
|
||||
break;
|
||||
|
||||
switch (c)
|
||||
|
||||
32
lib/getopt.h
32
lib/getopt.h
@@ -1,19 +1,25 @@
|
||||
/* Declarations for getopt.
|
||||
Copyright (C) 1989, 90, 91, 92, 93, 94 Free Software Foundation, Inc.
|
||||
Copyright (C) 1989,90,91,92,93,94,96,97 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
the C library, however. The master source lives in /gd/gnu/lib.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
NOTE: The canonical source of this file is maintained with the GNU C Library.
|
||||
Bugs can be reported to bug-glibc@prep.ai.mit.edu.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
USA. */
|
||||
|
||||
#ifndef _GETOPT_H
|
||||
#define _GETOPT_H 1
|
||||
@@ -36,7 +42,7 @@ extern char *optarg;
|
||||
|
||||
On entry to `getopt', zero means this is the first call; initialize.
|
||||
|
||||
When `getopt' returns EOF, this is the index of the first of the
|
||||
When `getopt' returns -1, this is the index of the first of the
|
||||
non-option elements that the caller should itself scan.
|
||||
|
||||
Otherwise, `optind' communicates from one call to the next
|
||||
|
||||
@@ -1,20 +1,25 @@
|
||||
/* getopt_long and getopt_long_only entry points for GNU getopt.
|
||||
Copyright (C) 1987, 88, 89, 90, 91, 92, 1993, 1994
|
||||
Free Software Foundation, Inc.
|
||||
Copyright (C) 1987,88,89,90,91,92,93,94,96,97 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
the C library, however. The master source lives in /gd/gnu/lib.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
NOTE: The canonical source of this file is maintained with the GNU C Library.
|
||||
Bugs can be reported to bug-glibc@prep.ai.mit.edu.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
USA. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
@@ -40,15 +45,21 @@
|
||||
program understand `configure --with-gnu-libc' and omit the object files,
|
||||
it is simpler to just do this in the source for each such file. */
|
||||
|
||||
#if defined (_LIBC) || !defined (__GNU_LIBRARY__)
|
||||
#define GETOPT_INTERFACE_VERSION 2
|
||||
#if !defined (_LIBC) && defined (__GLIBC__) && __GLIBC__ >= 2
|
||||
#include <gnu-versions.h>
|
||||
#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
|
||||
#define ELIDE_CODE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef ELIDE_CODE
|
||||
|
||||
|
||||
/* This needs to come after some library #include
|
||||
to get __GNU_LIBRARY__ defined. */
|
||||
#ifdef __GNU_LIBRARY__
|
||||
#include <stdlib.h>
|
||||
#else
|
||||
char *getenv ();
|
||||
#endif
|
||||
|
||||
#ifndef NULL
|
||||
@@ -83,7 +94,7 @@ getopt_long_only (argc, argv, options, long_options, opt_index)
|
||||
}
|
||||
|
||||
|
||||
#endif /* _LIBC or not __GNU_LIBRARY__. */
|
||||
#endif /* Not ELIDE_CODE. */
|
||||
|
||||
#ifdef TEST
|
||||
|
||||
@@ -114,7 +125,7 @@ main (argc, argv)
|
||||
|
||||
c = getopt_long (argc, argv, "abc:d:0123456789",
|
||||
long_options, &option_index);
|
||||
if (c == EOF)
|
||||
if (c == -1)
|
||||
break;
|
||||
|
||||
switch (c)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* getugroups.c -- return a list of the groups a user is in
|
||||
Copyright (C) 1990, 1991 Free Software Foundation.
|
||||
Copyright (C) 1990, 1991, 1998 Free Software Foundation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -45,10 +45,7 @@ struct group *getgrent ();
|
||||
the current process. */
|
||||
|
||||
int
|
||||
getugroups (maxcount, grouplist, username)
|
||||
int maxcount;
|
||||
GETGROUPS_T *grouplist;
|
||||
char *username;
|
||||
getugroups (int maxcount, GETGROUPS_T *grouplist, char *username)
|
||||
{
|
||||
struct group *grp;
|
||||
register char **cp;
|
||||
@@ -59,16 +56,27 @@ getugroups (maxcount, grouplist, username)
|
||||
for (cp = grp->gr_mem; *cp; ++cp)
|
||||
if (!strcmp (username, *cp))
|
||||
{
|
||||
if (maxcount != 0)
|
||||
int n;
|
||||
|
||||
/* See if this group number is already on the list. */
|
||||
for (n = 0; n < count; ++n)
|
||||
if (grouplist[n] == grp->gr_gid)
|
||||
break;
|
||||
|
||||
/* If it's a new group number, then try to add it to the list. */
|
||||
if (n == count)
|
||||
{
|
||||
if (count >= maxcount)
|
||||
if (maxcount != 0)
|
||||
{
|
||||
endgrent ();
|
||||
return count;
|
||||
if (count >= maxcount)
|
||||
{
|
||||
endgrent ();
|
||||
return count;
|
||||
}
|
||||
grouplist[count] = grp->gr_gid;
|
||||
}
|
||||
grouplist[count] = grp->gr_gid;
|
||||
count++;
|
||||
}
|
||||
count++;
|
||||
}
|
||||
endgrent ();
|
||||
return count;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* getusershell.c -- Return names of valid user shells.
|
||||
Copyright (C) 1991 Free Software Foundation, Inc.
|
||||
Copyright (C) 1991, 1997 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -29,6 +29,14 @@
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#if defined (STDC_HEADERS) || (!defined (isascii) && !defined (HAVE_ISASCII))
|
||||
# define IN_CTYPE_DOMAIN(c) 1
|
||||
#else
|
||||
# define IN_CTYPE_DOMAIN(c) isascii(c)
|
||||
#endif
|
||||
|
||||
#define ISSPACE(c) (IN_CTYPE_DOMAIN (c) && isspace (c))
|
||||
|
||||
#ifdef STDC_HEADERS
|
||||
# include <stdlib.h>
|
||||
#else
|
||||
@@ -175,10 +183,10 @@ readname (name, size, stream)
|
||||
}
|
||||
|
||||
/* Skip blank space. */
|
||||
while ((c = getc (stream)) != EOF && isspace (c))
|
||||
while ((c = getc (stream)) != EOF && ISSPACE (c))
|
||||
/* Do nothing. */ ;
|
||||
|
||||
while (c != EOF && !isspace (c))
|
||||
while (c != EOF && !ISSPACE (c))
|
||||
{
|
||||
(*name)[name_index++] = c;
|
||||
while (name_index >= *size)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* group-member.c -- determine whether group id is in calling user's group list
|
||||
Copyright (C) 1994 Free Software Foundation, Inc.
|
||||
Copyright (C) 1994, 1997, 1998 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -15,7 +15,7 @@
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
# include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#if HAVE_UNISTD_H
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
@@ -41,18 +41,17 @@ struct group_info
|
||||
GETGROUPS_T *group;
|
||||
};
|
||||
|
||||
#ifdef HAVE_GETGROUPS
|
||||
#if HAVE_GETGROUPS
|
||||
|
||||
static void
|
||||
free_group_info (g)
|
||||
struct group_info *g;
|
||||
free_group_info (struct group_info *g)
|
||||
{
|
||||
free (g->group);
|
||||
free (g);
|
||||
}
|
||||
|
||||
static struct group_info *
|
||||
get_group_info ()
|
||||
get_group_info (void)
|
||||
{
|
||||
int n_groups;
|
||||
int n_group_slots;
|
||||
@@ -96,8 +95,7 @@ get_group_info ()
|
||||
either of the current or effective group IDs. */
|
||||
|
||||
int
|
||||
group_member (gid)
|
||||
gid_t gid;
|
||||
group_member (gid_t gid)
|
||||
{
|
||||
#ifndef HAVE_GETGROUPS
|
||||
return ((gid == getgid ()) || (gid == getegid ()));
|
||||
|
||||
@@ -1,7 +1,15 @@
|
||||
#ifndef GROUP_MEMBER_H_
|
||||
# define GROUP_MEMBER_H_ 1
|
||||
|
||||
# ifndef PARAMS
|
||||
# if defined PROTOTYPES || (defined __STDC__ && __STDC__)
|
||||
# define PARAMS(Args) Args
|
||||
# else
|
||||
# define PARAMS(Args) ()
|
||||
# endif
|
||||
# endif
|
||||
|
||||
int
|
||||
group_member ();
|
||||
group_member PARAMS ((gid_t));
|
||||
|
||||
#endif /* GROUP_MEMBER_H_ */
|
||||
|
||||
873
lib/hash.c
Normal file
873
lib/hash.c
Normal file
@@ -0,0 +1,873 @@
|
||||
/* hash - hashing table processing.
|
||||
Copyright (C) 1998 Free Software Foundation, Inc.
|
||||
Written by Jim Meyering, 1992.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* A generic hash table package. */
|
||||
|
||||
/* Define USE_OBSTACK to 1 if you want the allocator to use obstacks instead
|
||||
of malloc. If you change USE_OBSTACK, you have to recompile! */
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
#if HAVE_STDLIB_H
|
||||
# include <stdlib.h>
|
||||
#endif
|
||||
#if HAVE_STDBOOL_H
|
||||
# include <stdbool.h>
|
||||
#else
|
||||
typedef enum {false = 0, true = 1} bool;
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
|
||||
#if !HAVE_DECL_FREE
|
||||
void free ();
|
||||
#endif
|
||||
#if !HAVE_DECL_MALLOC
|
||||
char *malloc ();
|
||||
#endif
|
||||
|
||||
#if USE_OBSTACK
|
||||
# include "obstack.h"
|
||||
# ifndef obstack_chunk_alloc
|
||||
# define obstack_chunk_alloc malloc
|
||||
# endif
|
||||
# ifndef obstack_chunk_free
|
||||
# define obstack_chunk_free free
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#include "hash.h"
|
||||
|
||||
/* An hash table contains many internal entries, each holding a pointer to
|
||||
some user provided data (also called a user entry). An entry indistinctly
|
||||
refers to both the internal entry and its associated user entry. A user
|
||||
entry contents may be hashed by a randomisation function (the hashing
|
||||
function, or just `hasher' for short) into a number (or `slot') between 0
|
||||
and the current table size. At each slot position in the hash table,
|
||||
starts a linked chain of entries for which the user data all hash to this
|
||||
slot. A bucket is the collection of all entries hashing to the same slot.
|
||||
|
||||
A good `hasher' function will distribute entries rather evenly in buckets.
|
||||
In the ideal case, the length of each bucket is roughly the number of
|
||||
entries divided by the table size. Finding the slot for a data is usually
|
||||
done at constant speed by the `hasher', and the later finding of a precise
|
||||
entry is linear in time with the size of the bucket. Consequently, a
|
||||
bigger hash table size (that is, a bigger number of buckets) is prone to
|
||||
yielding shorter buckets, *given* the `hasher' function behaves properly.
|
||||
|
||||
Long buckets slow down the lookup algorithm. One might use big hash table
|
||||
sizes in hope to reduce the average length of buckets, but this might
|
||||
become inordinate, as unused slots in the hash table take some space. The
|
||||
best bet is to make sure you are using a good `hasher' function (beware
|
||||
that those are not that easy to write! :-), and to use a table size at
|
||||
least bigger than the actual number of entries.
|
||||
|
||||
Currently, whenever the addition of an entry gets 80% of buckets to be
|
||||
non-empty, this package automatically doubles the number of buckets. */
|
||||
|
||||
/* Information and lookup. */
|
||||
|
||||
/* The following few functions provide information about the overall hash
|
||||
table organisation: the number of entries, number of buckets and maximum
|
||||
length of buckets. */
|
||||
|
||||
/* Return the number of buckets in the hash table. The table size, the total
|
||||
number of buckets (used plus unused), or the maximum number of slots, are
|
||||
the same quantity. */
|
||||
|
||||
unsigned int
|
||||
hash_get_n_buckets (const Hash_table *table)
|
||||
{
|
||||
return table->n_buckets;
|
||||
}
|
||||
|
||||
/* Return the number of slots in use (non-empty buckets). */
|
||||
|
||||
unsigned int
|
||||
hash_get_n_buckets_used (const Hash_table *table)
|
||||
{
|
||||
return table->n_buckets_used;
|
||||
}
|
||||
|
||||
/* Return the number of active entries. */
|
||||
|
||||
unsigned int
|
||||
hash_get_n_entries (const Hash_table *table)
|
||||
{
|
||||
return table->n_entries;
|
||||
}
|
||||
|
||||
/* Return the length of the most lenghty chain (bucket). */
|
||||
|
||||
unsigned int
|
||||
hash_get_max_bucket_length (const Hash_table *table)
|
||||
{
|
||||
struct hash_entry *bucket;
|
||||
unsigned int max_bucket_length = 0;
|
||||
|
||||
for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
|
||||
{
|
||||
if (bucket->data)
|
||||
{
|
||||
struct hash_entry *cursor = bucket;
|
||||
unsigned int bucket_length = 1;
|
||||
|
||||
while (cursor = cursor->next, cursor)
|
||||
bucket_length++;
|
||||
|
||||
if (bucket_length > max_bucket_length)
|
||||
max_bucket_length = bucket_length;
|
||||
}
|
||||
}
|
||||
|
||||
return max_bucket_length;
|
||||
}
|
||||
|
||||
/* Do a mild validation of an hash table, by traversing it and checking two
|
||||
statistics. */
|
||||
|
||||
bool
|
||||
hash_table_ok (const Hash_table *table)
|
||||
{
|
||||
struct hash_entry *bucket;
|
||||
unsigned int n_buckets_used = 0;
|
||||
unsigned int n_entries = 0;
|
||||
|
||||
for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
|
||||
{
|
||||
if (bucket->data)
|
||||
{
|
||||
struct hash_entry *cursor = bucket;
|
||||
|
||||
/* Count bucket head. */
|
||||
n_buckets_used++;
|
||||
n_entries++;
|
||||
|
||||
/* Count bucket overflow. */
|
||||
while (cursor = cursor->next, cursor)
|
||||
n_entries++;
|
||||
}
|
||||
}
|
||||
|
||||
if (n_buckets_used == table->n_buckets_used && n_entries == table->n_entries)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void
|
||||
hash_print_statistics (const Hash_table *table, FILE *stream)
|
||||
{
|
||||
unsigned int n_entries = hash_get_n_entries (table);
|
||||
unsigned int n_buckets = hash_get_n_buckets (table);
|
||||
unsigned int n_buckets_used = hash_get_n_buckets_used (table);
|
||||
unsigned int max_bucket_length = hash_get_max_bucket_length (table);
|
||||
|
||||
fprintf (stream, "# entries: %u\n", n_entries);
|
||||
fprintf (stream, "# buckets: %u\n", n_buckets);
|
||||
fprintf (stream, "# buckets used: %u (%.2f%%)\n", n_buckets_used,
|
||||
(100.0 * n_buckets_used) / n_buckets);
|
||||
fprintf (stream, "max bucket length: %u\n", max_bucket_length);
|
||||
}
|
||||
|
||||
/* Return the user entry from the hash table, if some entry in the hash table
|
||||
compares equally with ENTRY, or NULL otherwise. */
|
||||
|
||||
void *
|
||||
hash_lookup (const Hash_table *table, const void *entry)
|
||||
{
|
||||
struct hash_entry *bucket
|
||||
= table->bucket + table->hasher (entry, table->n_buckets);
|
||||
struct hash_entry *cursor;
|
||||
|
||||
assert (bucket < table->bucket_limit);
|
||||
|
||||
if (bucket->data == NULL)
|
||||
return NULL;
|
||||
|
||||
for (cursor = bucket; cursor; cursor = cursor->next)
|
||||
if (table->comparator (entry, cursor->data))
|
||||
return cursor->data;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Walking. */
|
||||
|
||||
/* The functions in this page traverse the hash table and process the
|
||||
contained entries. For the traversal to work properly, the hash table
|
||||
should not be resized nor modified while any particular entry is being
|
||||
processed. In particular, entries should not be added or removed. */
|
||||
|
||||
/* Return the first data in the table, or NULL if the table is empty. */
|
||||
|
||||
void *
|
||||
hash_get_first (const Hash_table *table)
|
||||
{
|
||||
struct hash_entry *bucket;
|
||||
|
||||
if (table->n_entries == 0)
|
||||
return NULL;
|
||||
|
||||
for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
|
||||
if (bucket->data)
|
||||
return bucket->data;
|
||||
|
||||
abort ();
|
||||
}
|
||||
|
||||
/* Return the user data for the entry following ENTRY, where ENTRY has been
|
||||
returned by a previous call to either `hash_get_first' or `hash_get_next'.
|
||||
Return NULL if there is no more entries. */
|
||||
|
||||
void *
|
||||
hash_get_next (const Hash_table *table, const void *entry)
|
||||
{
|
||||
struct hash_entry *bucket
|
||||
= table->bucket + table->hasher (entry, table->n_buckets);
|
||||
struct hash_entry *cursor;
|
||||
|
||||
assert (bucket < table->bucket_limit);
|
||||
|
||||
/* Find next entry in the same bucket. */
|
||||
for (cursor = bucket; cursor; cursor = cursor->next)
|
||||
if (cursor->data == entry && cursor->next)
|
||||
return cursor->next->data;
|
||||
|
||||
/* Find first entry in any subsequent bucket. */
|
||||
for (; bucket < table->bucket_limit; bucket++)
|
||||
if (bucket->data)
|
||||
return bucket->data;
|
||||
|
||||
/* None found. */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Fill BUFFER with pointers to active user entries in the hash table, then
|
||||
return the number of pointers copied. Do not copy more than BUFFER_SIZE
|
||||
pointers. */
|
||||
|
||||
unsigned int
|
||||
hash_get_entries (const Hash_table *table, void **buffer,
|
||||
unsigned int buffer_size)
|
||||
{
|
||||
unsigned int counter = 0;
|
||||
struct hash_entry *bucket;
|
||||
struct hash_entry *cursor;
|
||||
|
||||
for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
|
||||
{
|
||||
if (bucket->data)
|
||||
{
|
||||
for (cursor = bucket; cursor; cursor = cursor->next)
|
||||
{
|
||||
if (counter >= buffer_size)
|
||||
return counter;
|
||||
buffer[counter++] = cursor->data;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return counter;
|
||||
}
|
||||
|
||||
/* Call a PROCESSOR function for each entry of an hash table, and return the
|
||||
number of entries for which the processor function returned success. A
|
||||
pointer to some PROCESSOR_DATA which will be made available to each call to
|
||||
the processor function. The PROCESSOR accepts two arguments: the first is
|
||||
the user entry being walked into, the second is the value of PROCESSOR_DATA
|
||||
as received. The walking continue for as long as the PROCESSOR function
|
||||
returns nonzero. When it returns zero, the walking is interrupted. */
|
||||
|
||||
unsigned int
|
||||
hash_do_for_each (const Hash_table *table, Hash_processor processor,
|
||||
void *processor_data)
|
||||
{
|
||||
unsigned int counter = 0;
|
||||
struct hash_entry *bucket;
|
||||
struct hash_entry *cursor;
|
||||
|
||||
for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
|
||||
{
|
||||
if (bucket->data)
|
||||
{
|
||||
for (cursor = bucket; cursor; cursor = cursor->next)
|
||||
{
|
||||
if (!(*processor) (cursor->data, processor_data))
|
||||
return counter;
|
||||
counter++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return counter;
|
||||
}
|
||||
|
||||
/* Allocation and clean-up. */
|
||||
|
||||
/* Return a hash index for a NUL-terminated STRING between 0 and N_BUCKETS-1.
|
||||
This is a convenience routine for constructing other hashing functions. */
|
||||
|
||||
#if USE_DIFF_HASH
|
||||
|
||||
/* About hashings, Paul Eggert writes to me (FP), on 1994-01-01: "Please see
|
||||
B. J. McKenzie, R. Harries & T. Bell, Selecting a hashing algorithm,
|
||||
Software--practice & experience 20, 2 (Feb 1990), 209-224. Good hash
|
||||
algorithms tend to be domain-specific, so what's good for [diffutils'] io.c
|
||||
may not be good for your application." */
|
||||
|
||||
unsigned int
|
||||
hash_string (const char *string, unsigned int n_buckets)
|
||||
{
|
||||
# ifndef CHAR_BIT
|
||||
# define CHAR_BIT 8
|
||||
# endif
|
||||
# define ROTATE_LEFT(Value, Shift) \
|
||||
((Value) << (Shift) | (Value) >> ((sizeof (unsigned) * CHAR_BIT) - (Shift)))
|
||||
# define HASH_ONE_CHAR(Value, Byte) \
|
||||
((Byte) + ROTATE_LEFT (Value, 7))
|
||||
|
||||
unsigned value = 0;
|
||||
|
||||
for (; *string; string++)
|
||||
value = HASH_ONE_CHAR (value, *(const unsigned char *) string);
|
||||
return value % n_buckets;
|
||||
|
||||
# undef ROTATE_LEFT
|
||||
# undef HASH_ONE_CHAR
|
||||
}
|
||||
|
||||
#else /* not USE_DIFF_HASH */
|
||||
|
||||
/* This one comes from `recode', and performs a bit better than the above as
|
||||
per a few experiments. It is inspired from a hashing routine found in the
|
||||
very old Cyber `snoop', itself written in typical Greg Mansfield style.
|
||||
(By the way, what happened to this excellent man? Is he still alive?) */
|
||||
|
||||
unsigned int
|
||||
hash_string (const char *string, unsigned int n_buckets)
|
||||
{
|
||||
unsigned value = 0;
|
||||
|
||||
while (*string)
|
||||
value = ((value * 31 + (int) *(const unsigned char *) string++)
|
||||
% n_buckets);
|
||||
return value;
|
||||
}
|
||||
|
||||
#endif /* not USE_DIFF_HASH */
|
||||
|
||||
/* Return true if CANDIDATE is a prime number. CANDIDATE should be an odd
|
||||
number at least equal to 11. */
|
||||
|
||||
static int
|
||||
is_prime (unsigned long candidate)
|
||||
{
|
||||
unsigned long divisor = 3;
|
||||
unsigned long square = divisor * divisor;
|
||||
|
||||
while (square < candidate && (candidate % divisor))
|
||||
{
|
||||
divisor++;
|
||||
square += 4 * divisor;
|
||||
divisor++;
|
||||
}
|
||||
|
||||
return candidate % divisor != 0;
|
||||
}
|
||||
|
||||
/* Round a given CANDIDATE number up to the nearest prime, and return that
|
||||
prime. CANDIDATE should be at least equal to 10. */
|
||||
|
||||
static unsigned long
|
||||
next_prime (unsigned long candidate)
|
||||
{
|
||||
assert (candidate >= 10);
|
||||
|
||||
/* Make it definitely odd. */
|
||||
candidate |= 1;
|
||||
|
||||
while (!is_prime (candidate))
|
||||
candidate += 2;
|
||||
|
||||
return candidate;
|
||||
}
|
||||
|
||||
/* Allocate and return a new hash table, or NULL if an error is met. The
|
||||
initial number of buckets would be at least CANDIDATE (which need not be
|
||||
prime).
|
||||
|
||||
If DATA_FREER is not NULL, this function may be later called with the data
|
||||
as an argument, just before they entry containing the data gets freed. The
|
||||
HASHER function should be supplied, and FIXME. The COMPARATOR function
|
||||
should also be supplied, and FIXME. */
|
||||
|
||||
/* User-supplied function for freeing datas. It is specified in
|
||||
hash_initialize. If non-null, it is used by hash_free and hash_clear.
|
||||
You should specify `free' here only if you want these functions to free
|
||||
all of your `data' data. This is typically the case when your data is
|
||||
simply an auxilliary struct that you have malloc'd to aggregate several
|
||||
values. */
|
||||
|
||||
/* User-supplied hash function that hashes entry ENTRY to an integer in
|
||||
the range 0..TABLE_SIZE-1. */
|
||||
|
||||
/* User-supplied function that determines whether a new entry is unique by
|
||||
comparing the new entry to entries that hashed to the same bucket
|
||||
index. It should return zero for a pair of entries that compare equal,
|
||||
non-zero otherwise. */
|
||||
|
||||
Hash_table *
|
||||
hash_initialize (unsigned int candidate, Hash_hasher hasher,
|
||||
Hash_comparator comparator, Hash_data_freer data_freer)
|
||||
{
|
||||
Hash_table *table;
|
||||
struct hash_entry *bucket;
|
||||
|
||||
if (hasher == NULL || comparator == NULL)
|
||||
return NULL;
|
||||
|
||||
table = (Hash_table *) malloc (sizeof (Hash_table));
|
||||
if (table == NULL)
|
||||
return NULL;
|
||||
|
||||
table->n_buckets = next_prime (candidate < 10 ? 10 : candidate);
|
||||
table->bucket = (struct hash_entry *)
|
||||
malloc (table->n_buckets * sizeof (struct hash_entry));
|
||||
if (table->bucket == NULL)
|
||||
{
|
||||
free (table);
|
||||
return NULL;
|
||||
}
|
||||
table->bucket_limit = table->bucket + table->n_buckets;
|
||||
|
||||
for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
|
||||
{
|
||||
bucket->data = NULL;
|
||||
bucket->next = NULL;
|
||||
}
|
||||
table->n_buckets_used = 0;
|
||||
table->n_entries = 0;
|
||||
|
||||
table->hasher = hasher;
|
||||
table->comparator = comparator;
|
||||
table->data_freer = data_freer;
|
||||
|
||||
table->free_entry_list = NULL;
|
||||
#if USE_OBSTACK
|
||||
obstack_init (&table->entry_stack);
|
||||
#endif
|
||||
return table;
|
||||
}
|
||||
|
||||
/* Make all buckets empty, placing any chained entries on the free list.
|
||||
Apply the user-specified function data_freer (if any) to the datas of any
|
||||
affected entries. */
|
||||
|
||||
void
|
||||
hash_clear (Hash_table *table)
|
||||
{
|
||||
struct hash_entry *bucket;
|
||||
struct hash_entry *cursor;
|
||||
|
||||
for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
|
||||
{
|
||||
if (bucket->data)
|
||||
{
|
||||
/* Free the bucket overflow. */
|
||||
for (cursor = bucket->next; cursor; cursor = cursor->next)
|
||||
{
|
||||
if (table->data_freer)
|
||||
(*table->data_freer) (cursor->data);
|
||||
cursor->data = NULL;
|
||||
|
||||
/* Relinking is done one entry at a time, as it is to be expected
|
||||
that overflows are either rare or short. */
|
||||
cursor->next = table->free_entry_list;
|
||||
table->free_entry_list = cursor;
|
||||
}
|
||||
|
||||
/* Free the bucket head. */
|
||||
if (table->data_freer)
|
||||
(*table->data_freer) (bucket->data);
|
||||
bucket->data = NULL;
|
||||
bucket->next = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
table->n_buckets_used = 0;
|
||||
table->n_entries = 0;
|
||||
}
|
||||
|
||||
/* Reclaim all storage associated with an hash table. If a data_freer
|
||||
function has been supplied by the user when the hash table was created,
|
||||
this function applies it to the data of each entry before freeing that
|
||||
entry. */
|
||||
|
||||
void
|
||||
hash_free (Hash_table *table)
|
||||
{
|
||||
struct hash_entry *bucket;
|
||||
struct hash_entry *cursor;
|
||||
struct hash_entry *next;
|
||||
|
||||
/* Call the user data_freer function. */
|
||||
if (table->data_freer && table->n_entries)
|
||||
{
|
||||
for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
|
||||
{
|
||||
if (bucket->data)
|
||||
{
|
||||
for (cursor = bucket; cursor; cursor = cursor->next)
|
||||
{
|
||||
(*table->data_freer) (cursor->data);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#if USE_OBSTACK
|
||||
|
||||
obstack_free (&table->entry_stack, NULL);
|
||||
|
||||
#else
|
||||
|
||||
/* Free all bucket overflowed entries. */
|
||||
for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
|
||||
{
|
||||
for (cursor = bucket->next; cursor; cursor = next)
|
||||
{
|
||||
next = cursor->next;
|
||||
free (cursor);
|
||||
}
|
||||
}
|
||||
|
||||
/* Also reclaim the internal list of previously freed entries. */
|
||||
for (cursor = table->free_entry_list; cursor; cursor = next)
|
||||
{
|
||||
next = cursor->next;
|
||||
free (cursor);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* Free the remainder of the hash table structure. */
|
||||
free (table->bucket);
|
||||
free (table);
|
||||
}
|
||||
|
||||
/* Insertion and deletion. */
|
||||
|
||||
/* Get a new hash entry for a bucket overflow, possibly by reclying a
|
||||
previously freed one. If this is not possible, allocate a new one. */
|
||||
|
||||
static struct hash_entry *
|
||||
allocate_entry (Hash_table *table)
|
||||
{
|
||||
struct hash_entry *new;
|
||||
|
||||
if (table->free_entry_list)
|
||||
{
|
||||
new = table->free_entry_list;
|
||||
table->free_entry_list = new->next;
|
||||
}
|
||||
else
|
||||
{
|
||||
#if USE_OBSTACK
|
||||
new = (struct hash_entry *)
|
||||
obstack_alloc (&table->entry_stack, sizeof (struct hash_entry));
|
||||
#else
|
||||
new = (struct hash_entry *) malloc (sizeof (struct hash_entry));
|
||||
#endif
|
||||
}
|
||||
|
||||
return new;
|
||||
}
|
||||
|
||||
/* Free a hash entry which was part of some bucket overflow,
|
||||
saving it for later recycling. */
|
||||
|
||||
static void
|
||||
free_entry (Hash_table *table, struct hash_entry *entry)
|
||||
{
|
||||
entry->data = NULL;
|
||||
entry->next = table->free_entry_list;
|
||||
table->free_entry_list = entry;
|
||||
}
|
||||
|
||||
/* This private function is used to help with insertion and deletion. When
|
||||
ENTRY matches an entry in the table, return a pointer to the corresponding
|
||||
user data and set *BUCKET_HEAD to the head of the selected bucket.
|
||||
Otherwise, return NULL. When DELETE is true and ENTRY matches an entry in
|
||||
the table, unlink the matching entry. */
|
||||
|
||||
static void *
|
||||
hash_find_entry (Hash_table *table, const void *entry,
|
||||
struct hash_entry **bucket_head, bool delete)
|
||||
{
|
||||
struct hash_entry *bucket
|
||||
= table->bucket + table->hasher (entry, table->n_buckets);
|
||||
struct hash_entry *cursor;
|
||||
|
||||
assert (bucket < table->bucket_limit);
|
||||
*bucket_head = bucket;
|
||||
|
||||
/* Test for empty bucket. */
|
||||
if (bucket->data == NULL)
|
||||
return NULL;
|
||||
|
||||
/* Check if then entry is found as the bucket head. */
|
||||
if ((*table->comparator) (entry, bucket->data))
|
||||
{
|
||||
void *data = bucket->data;
|
||||
|
||||
if (delete)
|
||||
{
|
||||
if (bucket->next)
|
||||
{
|
||||
struct hash_entry *next = bucket->next;
|
||||
|
||||
/* Bump the first overflow entry into the bucket head, then save
|
||||
the previous first overflow entry for later recycling. */
|
||||
*bucket = *next;
|
||||
free_entry (table, next);
|
||||
}
|
||||
else
|
||||
{
|
||||
bucket->data = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
/* Scan the bucket overflow. */
|
||||
for (cursor = bucket; cursor->next; cursor = cursor->next)
|
||||
{
|
||||
if ((*table->comparator) (entry, cursor->next->data))
|
||||
{
|
||||
void *data = cursor->next->data;
|
||||
|
||||
if (delete)
|
||||
{
|
||||
struct hash_entry *next = cursor->next;
|
||||
|
||||
/* Unlink the entry to delete, then save the freed entry for later
|
||||
recycling. */
|
||||
cursor->next = next->next;
|
||||
free_entry (table, next);
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
/* No entry found. */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* For an already existing hash table, change the number of buckets and make
|
||||
it NEW_TABLE_SIZE. The contents of the hash table are preserved. */
|
||||
|
||||
bool
|
||||
hash_rehash (Hash_table *table, unsigned int new_n_buckets)
|
||||
{
|
||||
Hash_table *new_table;
|
||||
struct hash_entry *bucket;
|
||||
struct hash_entry *cursor;
|
||||
struct hash_entry *next;
|
||||
|
||||
if (table->n_buckets <= 0 || new_n_buckets == 0)
|
||||
return false;
|
||||
|
||||
new_table = hash_initialize (new_n_buckets, table->hasher,
|
||||
table->comparator, table->data_freer);
|
||||
if (new_table == NULL)
|
||||
return false;
|
||||
|
||||
/* Merely reuse the extra old space into the new table. */
|
||||
#if USE_OBSTACK
|
||||
obstack_free (&new_table->entry_stack, NULL);
|
||||
new_table->entry_stack = table->entry_stack;
|
||||
#endif
|
||||
new_table->free_entry_list = table->free_entry_list;
|
||||
|
||||
for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
|
||||
{
|
||||
if (bucket->data)
|
||||
{
|
||||
for (cursor = bucket; cursor; cursor = next)
|
||||
{
|
||||
void *data = cursor->data;
|
||||
struct hash_entry *new_bucket
|
||||
= new_table->bucket + new_table->hasher (data, new_n_buckets);
|
||||
|
||||
assert (new_bucket < new_table->bucket_limit);
|
||||
|
||||
/* Free overflow entries as soon as possible, moving them from the
|
||||
old hash table into the new one, as they may be needed now. */
|
||||
next = cursor->next;
|
||||
if (cursor != bucket)
|
||||
free_entry (new_table, cursor);
|
||||
|
||||
/* Insert the entry into the new hash table. */
|
||||
if (new_bucket->data)
|
||||
{
|
||||
struct hash_entry *new_entry = allocate_entry (new_table);
|
||||
|
||||
if (new_entry == NULL)
|
||||
return false;
|
||||
|
||||
new_entry->data = data;
|
||||
new_entry->next = new_bucket->next;
|
||||
new_bucket->next = new_entry;
|
||||
}
|
||||
else
|
||||
{
|
||||
new_bucket->data = data;
|
||||
new_table->n_buckets_used++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
free (table->bucket);
|
||||
table->bucket = new_table->bucket;
|
||||
table->bucket_limit = new_table->bucket_limit;
|
||||
table->n_buckets = new_table->n_buckets;
|
||||
table->n_buckets_used = new_table->n_buckets_used;
|
||||
/* table->n_entries already holds its value. */
|
||||
#if USE_OBSTACK
|
||||
table->entry_stack = new_table->entry_stack;
|
||||
#endif
|
||||
free (new_table);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* If ENTRY matches an entry already in the hash table, don't modify the table
|
||||
and return the matched entry. Otherwise, insert ENTRY and return NULL.
|
||||
*DONE is set to true in all cases, unless the storage required for
|
||||
insertion cannot be allocated. */
|
||||
|
||||
void *
|
||||
hash_insert (Hash_table *table, const void *entry, bool *done)
|
||||
{
|
||||
void *data;
|
||||
struct hash_entry *bucket;
|
||||
|
||||
assert (entry); /* cannot insert a NULL data */
|
||||
|
||||
if (data = hash_find_entry (table, entry, &bucket, false), data)
|
||||
{
|
||||
*done = true;
|
||||
return data;
|
||||
}
|
||||
|
||||
/* ENTRY is not matched, it should be inserted. */
|
||||
|
||||
table->n_entries++;
|
||||
|
||||
if (bucket->data)
|
||||
{
|
||||
struct hash_entry *new_entry = allocate_entry (table);
|
||||
|
||||
if (new_entry == NULL)
|
||||
{
|
||||
*done = false;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Add ENTRY in the overflow of the bucket. */
|
||||
|
||||
new_entry->data = (void *) entry;
|
||||
new_entry->next = bucket->next;
|
||||
bucket->next = new_entry;
|
||||
*done = true;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Add ENTRY right in the bucket head. */
|
||||
|
||||
bucket->data = (void *) entry;
|
||||
table->n_buckets_used++;
|
||||
|
||||
/* If more than 80% of the buckets are in use, rehash the table two
|
||||
times bigger. It's no real use checking the number of entries, as if
|
||||
the hashing function is ill-conditioned, rehashing is not likely to
|
||||
improve it. */
|
||||
|
||||
if (5 * table->n_buckets_used > 4 * table->n_buckets)
|
||||
{
|
||||
unsigned int new_n_buckets = next_prime (2 * table->n_buckets + 1);
|
||||
|
||||
*done = hash_rehash (table, new_n_buckets);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
*done = true;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* If ENTRY is already in the table, remove it and return the just-deleted
|
||||
data (the user may want to deallocate its storage). If ENTRY is not in the
|
||||
table, don't modify the table and return NULL. */
|
||||
|
||||
void *
|
||||
hash_delete (Hash_table *table, const void *entry)
|
||||
{
|
||||
void *data;
|
||||
struct hash_entry *bucket;
|
||||
|
||||
if (data = hash_find_entry (table, entry, &bucket, true), !data)
|
||||
return NULL;
|
||||
|
||||
if (!bucket->data)
|
||||
table->n_buckets_used--;
|
||||
table->n_entries--;
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
/* Testing. */
|
||||
|
||||
#if TESTING
|
||||
|
||||
void
|
||||
hash_print (const Hash_table *table)
|
||||
{
|
||||
struct hash_entry *bucket;
|
||||
|
||||
for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
|
||||
{
|
||||
struct hash_entry *cursor;
|
||||
|
||||
if (bucket)
|
||||
printf ("%d:\n", slot);
|
||||
|
||||
for (cursor = bucket; cursor; cursor = cursor->next)
|
||||
{
|
||||
char *s = (char *) cursor->data;
|
||||
/* FIXME */
|
||||
printf (" %s\n", s);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* TESTING */
|
||||
103
lib/hash.h
Normal file
103
lib/hash.h
Normal file
@@ -0,0 +1,103 @@
|
||||
/* hash - hashing table processing.
|
||||
Copyright (C) 1998 Free Software Foundation, Inc.
|
||||
Written by Jim Meyering <meyering@ascend.com>, 1998.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* A generic hash table package. */
|
||||
|
||||
/* Make sure USE_OBSTACK is defined to 1 if you want the allocator to use
|
||||
obstacks instead of malloc, and recompile `hash.c' with same setting. */
|
||||
|
||||
#ifndef PARAMS
|
||||
# if PROTOTYPES || __STDC__
|
||||
# define PARAMS(Args) Args
|
||||
# else
|
||||
# define PARAMS(Args) ()
|
||||
# endif
|
||||
#endif
|
||||
|
||||
typedef unsigned int (*Hash_hasher) PARAMS ((const void *, unsigned int));
|
||||
typedef bool (*Hash_comparator) PARAMS ((const void *, const void *));
|
||||
typedef void (*Hash_data_freer) PARAMS ((void *));
|
||||
typedef bool (*Hash_processor) PARAMS ((void *, void *));
|
||||
|
||||
struct hash_entry
|
||||
{
|
||||
void *data;
|
||||
struct hash_entry *next;
|
||||
};
|
||||
|
||||
struct hash_table
|
||||
{
|
||||
/* The array of buckets starts at BUCKET and extends to BUCKET_LIMIT-1,
|
||||
for a possibility of N_BUCKETS. Among those, N_BUCKETS_USED buckets
|
||||
are not empty, there are N_ENTRIES active entries in the table. */
|
||||
struct hash_entry *bucket;
|
||||
struct hash_entry *bucket_limit;
|
||||
unsigned int n_buckets;
|
||||
unsigned int n_buckets_used;
|
||||
unsigned int n_entries;
|
||||
|
||||
/* Three functions are given to `hash_initialize', see the documentation
|
||||
block for this function. In a word, HASHER randomizes a user entry
|
||||
into a number up from 0 up to some maximum minus 1; COMPARATOR returns
|
||||
true if two user entries compare equally; and DATA_FREER is the cleanup
|
||||
function for a user entry. */
|
||||
Hash_hasher hasher;
|
||||
Hash_comparator comparator;
|
||||
Hash_data_freer data_freer;
|
||||
|
||||
/* A linked list of freed struct hash_entry structs. */
|
||||
struct hash_entry *free_entry_list;
|
||||
|
||||
#if USE_OBSTACK
|
||||
/* Whenever obstacks are used, it is possible to allocate all overflowed
|
||||
entries into a single stack, so they all can be freed in a single
|
||||
operation. It is not clear if the speedup is worth the trouble. */
|
||||
struct obstack entry_stack;
|
||||
#endif
|
||||
};
|
||||
|
||||
typedef struct hash_table Hash_table;
|
||||
|
||||
/* Information and lookup. */
|
||||
unsigned int hash_get_n_buckets PARAMS ((const Hash_table *));
|
||||
unsigned int hash_get_n_buckets_used PARAMS ((const Hash_table *));
|
||||
unsigned int hash_get_n_entries PARAMS ((const Hash_table *));
|
||||
unsigned int hash_get_max_bucket_length PARAMS ((const Hash_table *));
|
||||
bool hash_table_ok PARAMS ((const Hash_table *));
|
||||
void hash_print_statistics PARAMS ((const Hash_table *, FILE *));
|
||||
void *hash_lookup PARAMS ((const Hash_table *, const void *));
|
||||
|
||||
/* Walking. */
|
||||
void *hash_get_first PARAMS ((const Hash_table *));
|
||||
void *hash_get_next PARAMS ((const Hash_table *, const void *));
|
||||
unsigned int hash_get_entries PARAMS ((const Hash_table *, void **,
|
||||
unsigned int));
|
||||
unsigned int hash_do_for_each PARAMS ((const Hash_table *, Hash_processor,
|
||||
void *));
|
||||
|
||||
/* Allocation and clean-up. */
|
||||
unsigned int hash_string PARAMS ((const char *, unsigned int));
|
||||
Hash_table *hash_initialize PARAMS ((unsigned int, Hash_hasher,
|
||||
Hash_comparator, Hash_data_freer));
|
||||
void hash_clear PARAMS ((Hash_table *));
|
||||
void hash_free PARAMS ((Hash_table *));
|
||||
|
||||
/* Insertion and deletion. */
|
||||
bool hash_rehash PARAMS ((Hash_table *, unsigned int));
|
||||
void *hash_insert PARAMS ((Hash_table *, const void *, bool *));
|
||||
void *hash_delete PARAMS ((Hash_table *, const void *));
|
||||
286
lib/human.c
Normal file
286
lib/human.c
Normal file
@@ -0,0 +1,286 @@
|
||||
/* human.c -- print human readable file size
|
||||
Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* Originally contributed by lm@sgi.com;
|
||||
--si, output block size selection, and large file support
|
||||
added by eggert@twinsun.com. */
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#if HAVE_INTTYPES_H
|
||||
# include <inttypes.h>
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#if HAVE_LIMITS_H
|
||||
# include <limits.h>
|
||||
#endif
|
||||
|
||||
#ifndef CHAR_BIT
|
||||
# define CHAR_BIT 8
|
||||
#endif
|
||||
#if HAVE_STDLIB_H
|
||||
# include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_DECL_GETENV
|
||||
char *getenv ();
|
||||
#endif
|
||||
|
||||
#if ENABLE_NLS
|
||||
# include <libintl.h>
|
||||
# define _(Text) gettext (Text)
|
||||
#else
|
||||
# define _(Text) Text
|
||||
#endif
|
||||
|
||||
#include <argmatch.h>
|
||||
#include <error.h>
|
||||
#include <xstrtoul.h>
|
||||
|
||||
#include "human.h"
|
||||
|
||||
static const char suffixes[] =
|
||||
{
|
||||
0, /* not used */
|
||||
'k', /* kilo */
|
||||
'M', /* Mega */
|
||||
'G', /* Giga */
|
||||
'T', /* Tera */
|
||||
'P', /* Peta */
|
||||
'E', /* Exa */
|
||||
'Z', /* Zetta */
|
||||
'Y' /* Yotta */
|
||||
};
|
||||
|
||||
/* Convert N to a human readable format in BUF.
|
||||
|
||||
N is expressed in units of FROM_BLOCK_SIZE. FROM_BLOCK_SIZE must
|
||||
be positive.
|
||||
|
||||
If OUTPUT_BLOCK_SIZE is positive, use units of OUTPUT_BLOCK_SIZE in
|
||||
the output number. OUTPUT_BLOCK_SIZE must be a multiple of
|
||||
FROM_BLOCK_SIZE or vice versa.
|
||||
|
||||
If OUTPUT_BLOCK_SIZE is negative, use a format like "127k" if
|
||||
possible, using powers of -OUTPUT_BLOCK_SIZE; otherwise, use
|
||||
ordinary decimal format. Normally -OUTPUT_BLOCK_SIZE is either
|
||||
1000 or 1024; it must be at least 2. Most people visually process
|
||||
strings of 3-4 digits effectively, but longer strings of digits are
|
||||
more prone to misinterpretation. Hence, converting to an
|
||||
abbreviated form usually improves readability. Use a suffix
|
||||
indicating which power is being used. For example, assuming
|
||||
-OUTPUT_BLOCK_SIZE is 1024, 8500 would be converted to 8.3k,
|
||||
133456345 to 127M, 56990456345 to 53G, and so on. Numbers smaller
|
||||
than -OUTPUT_BLOCK_SIZE aren't modified. */
|
||||
|
||||
char *
|
||||
human_readable (uintmax_t n, char *buf,
|
||||
int from_block_size, int output_block_size)
|
||||
{
|
||||
uintmax_t amt;
|
||||
int base;
|
||||
int to_block_size;
|
||||
int tenths;
|
||||
int power;
|
||||
char *p;
|
||||
|
||||
/* 0 means adjusted N == AMT.TENTHS;
|
||||
1 means AMT.TENTHS < adjusted N < AMT.TENTHS + 0.05;
|
||||
2 means adjusted N == AMT.TENTHS + 0.05;
|
||||
3 means AMT.TENTHS + 0.05 < adjusted N < AMT.TENTHS + 0.1. */
|
||||
int rounding;
|
||||
|
||||
if (output_block_size < 0)
|
||||
{
|
||||
base = -output_block_size;
|
||||
to_block_size = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
base = 0;
|
||||
to_block_size = output_block_size;
|
||||
}
|
||||
|
||||
p = buf + LONGEST_HUMAN_READABLE;
|
||||
*p = '\0';
|
||||
|
||||
#ifdef lint
|
||||
/* Suppress `used before initialized' warning. */
|
||||
power = 0;
|
||||
#endif
|
||||
|
||||
/* Adjust AMT out of FROM_BLOCK_SIZE units and into TO_BLOCK_SIZE units. */
|
||||
|
||||
if (to_block_size <= from_block_size)
|
||||
{
|
||||
int multiplier = from_block_size / to_block_size;
|
||||
amt = n * multiplier;
|
||||
tenths = rounding = 0;
|
||||
|
||||
if (amt / multiplier != n)
|
||||
{
|
||||
/* Overflow occurred during multiplication. We should use
|
||||
multiple precision arithmetic here, but we'll be lazy and
|
||||
resort to floating point. This can yield answers that
|
||||
are slightly off. In practice it is quite rare to
|
||||
overflow uintmax_t, so this is good enough for now. */
|
||||
|
||||
double damt = n * (double) multiplier;
|
||||
|
||||
if (! base)
|
||||
sprintf (buf, "%.0f", damt);
|
||||
else
|
||||
{
|
||||
double e = 1;
|
||||
power = 0;
|
||||
|
||||
do
|
||||
{
|
||||
e *= base;
|
||||
power++;
|
||||
}
|
||||
while (e * base <= amt && power < sizeof suffixes - 1);
|
||||
|
||||
damt /= e;
|
||||
|
||||
sprintf (buf, "%.1f%c", damt, suffixes[power]);
|
||||
if (4 < strlen (buf))
|
||||
sprintf (buf, "%.0f%c", damt, suffixes[power]);
|
||||
}
|
||||
|
||||
return buf;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int divisor = to_block_size / from_block_size;
|
||||
int r10 = (n % divisor) * 10;
|
||||
int r2 = (r10 % divisor) * 2;
|
||||
amt = n / divisor;
|
||||
tenths = r10 / divisor;
|
||||
rounding = r2 < divisor ? 0 < r2 : 2 + (divisor < r2);
|
||||
}
|
||||
|
||||
|
||||
/* Use power of BASE notation if adjusted AMT is large enough. */
|
||||
|
||||
if (base && base <= amt)
|
||||
{
|
||||
power = 0;
|
||||
|
||||
do
|
||||
{
|
||||
int r10 = (amt % base) * 10 + tenths;
|
||||
int r2 = (r10 % base) * 2 + (rounding >> 1);
|
||||
amt /= base;
|
||||
tenths = r10 / base;
|
||||
rounding = (r2 < base
|
||||
? 0 < r2 + rounding
|
||||
: 2 + (base < r2 + rounding));
|
||||
power++;
|
||||
}
|
||||
while (base <= amt && power < sizeof suffixes - 1);
|
||||
|
||||
*--p = suffixes[power];
|
||||
|
||||
if (amt < 10)
|
||||
{
|
||||
tenths += 2 < rounding + (tenths & 1);
|
||||
|
||||
if (tenths == 10)
|
||||
{
|
||||
amt++;
|
||||
tenths = 0;
|
||||
}
|
||||
|
||||
if (amt < 10)
|
||||
{
|
||||
*--p = '0' + tenths;
|
||||
*--p = '.';
|
||||
tenths = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (5 < tenths + (2 < rounding + (amt & 1)))
|
||||
{
|
||||
amt++;
|
||||
|
||||
if (amt == base && power < sizeof suffixes - 1)
|
||||
{
|
||||
*p = suffixes[power + 1];
|
||||
*--p = '0';
|
||||
*--p = '.';
|
||||
amt = 1;
|
||||
}
|
||||
}
|
||||
|
||||
do
|
||||
*--p = '0' + (int) (amt % 10);
|
||||
while ((amt /= 10) != 0);
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
/* The default block size used for output. This number may change in
|
||||
the future as disks get larger. */
|
||||
#ifndef DEFAULT_BLOCK_SIZE
|
||||
# define DEFAULT_BLOCK_SIZE 1024
|
||||
#endif
|
||||
|
||||
static char const *const block_size_args[] = { "human-readable", "si", 0 };
|
||||
static int const block_size_types[] = { -1024, -1000 };
|
||||
|
||||
static strtol_error
|
||||
humblock (char const *spec, int *block_size)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (! spec && ! (spec = getenv ("BLOCK_SIZE")))
|
||||
*block_size = getenv ("POSIXLY_CORRECT") ? 512 : DEFAULT_BLOCK_SIZE;
|
||||
else if (0 <= (i = argmatch (spec, block_size_args)))
|
||||
*block_size = block_size_types[i];
|
||||
else
|
||||
{
|
||||
char *ptr;
|
||||
unsigned long val;
|
||||
strtol_error e = xstrtoul (spec, &ptr, 0, &val, "eEgGkKmMpPtTyYzZ0");
|
||||
if (e != LONGINT_OK)
|
||||
return e;
|
||||
if (*ptr)
|
||||
return LONGINT_INVALID_SUFFIX_CHAR;
|
||||
if ((int) val < 0 || val != (int) val)
|
||||
return LONGINT_OVERFLOW;
|
||||
*block_size = (int) val;
|
||||
}
|
||||
|
||||
return LONGINT_OK;
|
||||
}
|
||||
|
||||
void
|
||||
human_block_size (char const *spec, int report_errors, int *block_size)
|
||||
{
|
||||
strtol_error e = humblock (spec, block_size);
|
||||
if (e != LONGINT_OK && report_errors)
|
||||
STRTOL_FATAL_ERROR (spec, _("block size"), e);
|
||||
}
|
||||
22
lib/human.h
Normal file
22
lib/human.h
Normal file
@@ -0,0 +1,22 @@
|
||||
#ifndef HUMAN_H_
|
||||
# define HUMAN_H_ 1
|
||||
|
||||
/* A conservative bound on the maximum length of a human-readable string.
|
||||
The output can be the product of the largest uintmax_t and the largest int,
|
||||
so add their sizes before converting to a bound on digits. */
|
||||
# define LONGEST_HUMAN_READABLE ((sizeof (uintmax_t) + sizeof (int)) \
|
||||
* CHAR_BIT / 3)
|
||||
|
||||
# ifndef PARAMS
|
||||
# if defined PROTOTYPES || (defined __STDC__ && __STDC__)
|
||||
# define PARAMS(Args) Args
|
||||
# else
|
||||
# define PARAMS(Args) ()
|
||||
# endif
|
||||
# endif
|
||||
|
||||
char *human_readable PARAMS ((uintmax_t, char *, int, int));
|
||||
|
||||
void human_block_size PARAMS ((char const *, int, int *));
|
||||
|
||||
#endif /* HUMAN_H_ */
|
||||
@@ -1,5 +1,5 @@
|
||||
/* idcache.c -- map user and group IDs, cached for speed
|
||||
Copyright (C) 1985, 1988, 1989, 1990 Free Software Foundation, Inc.
|
||||
Copyright (C) 1985, 1988, 1989, 1990, 1997, 1998 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -15,8 +15,8 @@
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
@@ -24,15 +24,16 @@
|
||||
#include <pwd.h>
|
||||
#include <grp.h>
|
||||
|
||||
#if defined(STDC_HEADERS) || defined(HAVE_STRING_H)
|
||||
#include <string.h>
|
||||
#if STDC_HEADERS || HAVE_STRING_H
|
||||
# include <string.h>
|
||||
#else
|
||||
#include <strings.h>
|
||||
# include <strings.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#if HAVE_UNISTD_H
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#ifndef _POSIX_VERSION
|
||||
struct passwd *getpwuid ();
|
||||
struct passwd *getpwnam ();
|
||||
@@ -43,6 +44,10 @@ struct group *getgrnam ();
|
||||
char *xmalloc ();
|
||||
char *xstrdup ();
|
||||
|
||||
#ifdef __DJGPP__
|
||||
static char digits[] = "0123456789";
|
||||
#endif
|
||||
|
||||
struct userid
|
||||
{
|
||||
union
|
||||
@@ -59,16 +64,13 @@ static struct userid *user_alist;
|
||||
/* The members of this list have names not in the local passwd file. */
|
||||
static struct userid *nouser_alist;
|
||||
|
||||
/* Translate UID to a login name or a stringified number,
|
||||
with cache. */
|
||||
/* Translate UID to a login name, with cache, or NULL if unresolved. */
|
||||
|
||||
char *
|
||||
getuser (uid)
|
||||
uid_t uid;
|
||||
getuser (uid_t uid)
|
||||
{
|
||||
register struct userid *tail;
|
||||
struct passwd *pwent;
|
||||
char usernum_string[20];
|
||||
|
||||
for (tail = user_alist; tail; tail = tail->next)
|
||||
if (tail->id.u == uid)
|
||||
@@ -77,13 +79,7 @@ getuser (uid)
|
||||
pwent = getpwuid (uid);
|
||||
tail = (struct userid *) xmalloc (sizeof (struct userid));
|
||||
tail->id.u = uid;
|
||||
if (pwent == 0)
|
||||
{
|
||||
sprintf (usernum_string, "%u", (unsigned) uid);
|
||||
tail->name = xstrdup (usernum_string);
|
||||
}
|
||||
else
|
||||
tail->name = xstrdup (pwent->pw_name);
|
||||
tail->name = pwent ? xstrdup (pwent->pw_name) : NULL;
|
||||
|
||||
/* Add to the head of the list, so most recently used is first. */
|
||||
tail->next = user_alist;
|
||||
@@ -97,8 +93,7 @@ getuser (uid)
|
||||
so we don't keep looking them up.) */
|
||||
|
||||
uid_t *
|
||||
getuidbyname (user)
|
||||
char *user;
|
||||
getuidbyname (const char *user)
|
||||
{
|
||||
register struct userid *tail;
|
||||
struct passwd *pwent;
|
||||
@@ -114,6 +109,15 @@ getuidbyname (user)
|
||||
return 0;
|
||||
|
||||
pwent = getpwnam (user);
|
||||
#ifdef __DJGPP__
|
||||
/* We need to pretend to be the user USER, to make
|
||||
pwd functions know about an arbitrary user name. */
|
||||
if (!pwent && strspn (user, digits) < strlen (user))
|
||||
{
|
||||
setenv ("USER", user, 1);
|
||||
pwent = getpwnam (user); /* now it will succeed */
|
||||
}
|
||||
#endif
|
||||
|
||||
tail = (struct userid *) xmalloc (sizeof (struct userid));
|
||||
tail->name = xstrdup (user);
|
||||
@@ -136,16 +140,13 @@ getuidbyname (user)
|
||||
static struct userid *group_alist;
|
||||
static struct userid *nogroup_alist;
|
||||
|
||||
/* Translate GID to a group name or a stringified number,
|
||||
with cache. */
|
||||
/* Translate GID to a group name, with cache, or NULL if unresolved. */
|
||||
|
||||
char *
|
||||
getgroup (gid)
|
||||
gid_t gid;
|
||||
getgroup (gid_t gid)
|
||||
{
|
||||
register struct userid *tail;
|
||||
struct group *grent;
|
||||
char groupnum_string[20];
|
||||
|
||||
for (tail = group_alist; tail; tail = tail->next)
|
||||
if (tail->id.g == gid)
|
||||
@@ -154,13 +155,7 @@ getgroup (gid)
|
||||
grent = getgrgid (gid);
|
||||
tail = (struct userid *) xmalloc (sizeof (struct userid));
|
||||
tail->id.g = gid;
|
||||
if (grent == 0)
|
||||
{
|
||||
sprintf (groupnum_string, "%u", (unsigned int) gid);
|
||||
tail->name = xstrdup (groupnum_string);
|
||||
}
|
||||
else
|
||||
tail->name = xstrdup (grent->gr_name);
|
||||
tail->name = grent ? xstrdup (grent->gr_name) : NULL;
|
||||
|
||||
/* Add to the head of the list, so most recently used is first. */
|
||||
tail->next = group_alist;
|
||||
@@ -168,14 +163,13 @@ getgroup (gid)
|
||||
return tail->name;
|
||||
}
|
||||
|
||||
/* Translate GROUP to a UID, with cache.
|
||||
/* Translate GROUP to a GID, with cache.
|
||||
Return NULL if there is no such group.
|
||||
(We also cache which group names have no group entry,
|
||||
so we don't keep looking them up.) */
|
||||
|
||||
gid_t *
|
||||
getgidbyname (group)
|
||||
char *group;
|
||||
getgidbyname (const char *group)
|
||||
{
|
||||
register struct userid *tail;
|
||||
struct group *grent;
|
||||
@@ -191,6 +185,15 @@ getgidbyname (group)
|
||||
return 0;
|
||||
|
||||
grent = getgrnam (group);
|
||||
#ifdef __DJGPP__
|
||||
/* We need to pretend to belong to group GROUP, to make
|
||||
grp functions know about any arbitrary group name. */
|
||||
if (!grent && strspn (group, digits) < strlen (group))
|
||||
{
|
||||
setenv ("GROUP", group, 1);
|
||||
grent = getgrnam (group); /* now it will succeed */
|
||||
}
|
||||
#endif
|
||||
|
||||
tail = (struct userid *) xmalloc (sizeof (struct userid));
|
||||
tail->name = xstrdup (group);
|
||||
|
||||
16
lib/isdir.c
16
lib/isdir.c
@@ -1,5 +1,5 @@
|
||||
/* isdir.c -- determine whether a directory exists
|
||||
Copyright (C) 1990 Free Software Foundation, Inc.
|
||||
Copyright (C) 1990, 1998 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -15,19 +15,19 @@
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#ifdef STAT_MACROS_BROKEN
|
||||
#undef S_ISDIR
|
||||
#endif /* STAT_MACROS_BROKEN. */
|
||||
#if STAT_MACROS_BROKEN
|
||||
# undef S_ISDIR
|
||||
#endif
|
||||
|
||||
#if !defined(S_ISDIR) && defined(S_IFDIR)
|
||||
#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
|
||||
#if !defined S_ISDIR && defined S_IFDIR
|
||||
# define S_ISDIR(Mode) (((Mode) & S_IFMT) == S_IFDIR)
|
||||
#endif
|
||||
|
||||
/* If PATH is an existing directory or symbolic link to a directory,
|
||||
|
||||
44
lib/lchown.c
Normal file
44
lib/lchown.c
Normal file
@@ -0,0 +1,44 @@
|
||||
/* Provide a stub lchown function for systems that lack it.
|
||||
Copyright (C) 1998 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* written by Jim Meyering */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <errno.h>
|
||||
#ifndef errno
|
||||
extern int errno;
|
||||
#endif
|
||||
|
||||
/* Work just like chown, except when FILE is a symbolic link.
|
||||
In that case, set errno to ENOSYS and return -1. */
|
||||
|
||||
int
|
||||
lchown (const char *file, uid_t uid, gid_t gid)
|
||||
{
|
||||
struct stat stats;
|
||||
|
||||
if (lstat (file, &stats) == 0 && S_ISLNK (stats.st_mode))
|
||||
{
|
||||
errno = ENOSYS;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return chown (file, uid, gid);
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
/* linebuffer.h -- declarations for reading arbitrarily long lines
|
||||
Copyright (C) 1986, 1991 Free Software Foundation, Inc.
|
||||
Copyright (C) 1986, 1991, 1998 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -14,7 +14,10 @@
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
|
||||
#if !defined LINEBUFFER_H
|
||||
# define LINEBUFFER_H
|
||||
|
||||
/* A `struct linebuffer' holds a line of text. */
|
||||
|
||||
struct linebuffer
|
||||
@@ -24,12 +27,13 @@ struct linebuffer
|
||||
char *buffer;
|
||||
};
|
||||
|
||||
#undef PARAMS
|
||||
#if defined (__STDC__) && __STDC__
|
||||
# define PARAMS(Args) Args
|
||||
#else
|
||||
# define PARAMS(Args) ()
|
||||
#endif
|
||||
# ifndef PARAMS
|
||||
# if defined PROTOTYPES || (defined __STDC__ && __STDC__)
|
||||
# define PARAMS(Args) Args
|
||||
# else
|
||||
# define PARAMS(Args) ()
|
||||
# endif
|
||||
# endif
|
||||
|
||||
/* Initialize linebuffer LINEBUFFER for use. */
|
||||
void initbuffer PARAMS ((struct linebuffer *linebuffer));
|
||||
@@ -42,3 +46,5 @@ struct linebuffer *readline PARAMS ((struct linebuffer *linebuffer,
|
||||
|
||||
/* Free linebuffer LINEBUFFER and its data, all allocated with malloc. */
|
||||
void freebuffer PARAMS ((struct linebuffer *));
|
||||
|
||||
#endif /* LINEBUFFER_H */
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Utility to accept --help and --version options as unobtrusively as possible.
|
||||
Copyright (C) 1993, 1994 Free Software Foundation, Inc.
|
||||
Copyright (C) 1993, 1994, 1998 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -17,12 +17,13 @@
|
||||
|
||||
/* Written by Jim Meyering. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <getopt.h>
|
||||
#include "closeout.h"
|
||||
#include "long-options.h"
|
||||
|
||||
static struct option const long_options[] =
|
||||
@@ -46,16 +47,14 @@ parse_long_options (argc, argv, command_name, package, version, usage)
|
||||
{
|
||||
int c;
|
||||
int saved_opterr;
|
||||
int saved_optind;
|
||||
|
||||
saved_opterr = opterr;
|
||||
saved_optind = optind;
|
||||
|
||||
/* Don't print an error message for unrecognized options. */
|
||||
opterr = 0;
|
||||
|
||||
if (argc == 2
|
||||
&& (c = getopt_long (argc, argv, "+", long_options, (int *) 0)) != EOF)
|
||||
&& (c = getopt_long (argc, argv, "+", long_options, NULL)) != -1)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
@@ -64,6 +63,8 @@ parse_long_options (argc, argv, command_name, package, version, usage)
|
||||
|
||||
case 'v':
|
||||
printf ("%s (%s) %s\n", command_name, package, version);
|
||||
close_stdout (); /* FIXME: output failure exit status
|
||||
should be settable via an arg. */
|
||||
exit (0);
|
||||
|
||||
default:
|
||||
@@ -75,6 +76,7 @@ parse_long_options (argc, argv, command_name, package, version, usage)
|
||||
/* Restore previous value. */
|
||||
opterr = saved_opterr;
|
||||
|
||||
/* Restore optind in case it has advanced past a leading `--'. */
|
||||
optind = saved_optind;
|
||||
/* Reset this to zero so that getopt internals get initialized from
|
||||
the probably-new parameters when/if getopt is called later. */
|
||||
optind = 0;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* long-options.h -- declaration for --help- and --version-handling function.
|
||||
Copyright (C) 1993, 1994 Free Software Foundation, Inc.
|
||||
Copyright (C) 1993, 1994, 1997 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -17,11 +17,12 @@
|
||||
|
||||
/* Written by Jim Meyering. */
|
||||
|
||||
#undef PARAMS
|
||||
#if defined (__STDC__) && __STDC__
|
||||
# define PARAMS(Args) Args
|
||||
#else
|
||||
# define PARAMS(Args) ()
|
||||
#ifndef PARAMS
|
||||
# if defined PROTOTYPES || (defined __STDC__ && __STDC__)
|
||||
# define PARAMS(Args) Args
|
||||
# else
|
||||
# define PARAMS(Args) ()
|
||||
# endif
|
||||
#endif
|
||||
|
||||
void
|
||||
|
||||
50
lib/lstat.c
Normal file
50
lib/lstat.c
Normal file
@@ -0,0 +1,50 @@
|
||||
/* Work around the bug in some systems whereby lstat succeeds when
|
||||
given the zero-length file name argument. The lstat from SunOS4.1.4
|
||||
has this bug.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* written by Jim Meyering */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* Disable the definition of lstat to rpl_lstat (from config.h) in this
|
||||
file. Otherwise, we'd get conflicting prototypes for rpl_lstat on
|
||||
most systems. */
|
||||
#undef lstat
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <errno.h>
|
||||
#ifndef errno
|
||||
extern int errno;
|
||||
#endif
|
||||
|
||||
/* FIXME: describe. */
|
||||
|
||||
int
|
||||
rpl_lstat (file, sbuf)
|
||||
const char *file;
|
||||
struct stat *sbuf;
|
||||
{
|
||||
if (file && *file == 0)
|
||||
{
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return lstat (file, sbuf);
|
||||
}
|
||||
216
lib/makepath.c
216
lib/makepath.c
@@ -1,5 +1,5 @@
|
||||
/* makepath.c -- Ensure that a directory path exists.
|
||||
Copyright (C) 1990 Free Software Foundation, Inc.
|
||||
Copyright (C) 1990, 1997, 1998 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -28,7 +28,7 @@
|
||||
# include <alloca.h>
|
||||
# else
|
||||
# ifdef _AIX
|
||||
#pragma alloca
|
||||
# pragma alloca
|
||||
# else
|
||||
char *alloca ();
|
||||
# endif
|
||||
@@ -71,14 +71,49 @@ extern int errno;
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef S_IWUSR
|
||||
# define S_IWUSR 0200
|
||||
#endif
|
||||
|
||||
#ifndef S_IXUSR
|
||||
# define S_IXUSR 0100
|
||||
#endif
|
||||
|
||||
#define WX_USR (S_IWUSR | S_IXUSR)
|
||||
|
||||
#ifdef __MSDOS__
|
||||
typedef int uid_t;
|
||||
typedef int gid_t;
|
||||
#endif
|
||||
|
||||
#include "save-cwd.h"
|
||||
#include "makepath.h"
|
||||
#include "error.h"
|
||||
|
||||
void error ();
|
||||
void strip_trailing_slashes ();
|
||||
|
||||
#define CLEANUP_CWD \
|
||||
do \
|
||||
{ \
|
||||
/* We're done operating on basename_dir. \
|
||||
Restore working directory. */ \
|
||||
if (do_chdir) \
|
||||
{ \
|
||||
int fail = restore_cwd (&cwd, NULL, NULL); \
|
||||
free_cwd (&cwd); \
|
||||
if (fail) \
|
||||
return 1; \
|
||||
} \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
#define CLEANUP \
|
||||
do \
|
||||
{ \
|
||||
umask (oldmask); \
|
||||
CLEANUP_CWD; \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
/* Ensure that the directory ARGPATH exists.
|
||||
Remove any trailing slashes from ARGPATH before calling this function.
|
||||
@@ -98,7 +133,6 @@ void error ();
|
||||
Return 0 if ARGPATH exists as a directory with the proper
|
||||
ownership and permissions when done, otherwise 1. */
|
||||
|
||||
#if __STDC__
|
||||
int
|
||||
make_path (const char *argpath,
|
||||
int mode,
|
||||
@@ -107,30 +141,11 @@ make_path (const char *argpath,
|
||||
gid_t group,
|
||||
int preserve_existing,
|
||||
const char *verbose_fmt_string)
|
||||
#else
|
||||
int
|
||||
make_path (argpath, mode, parent_mode, owner, group, preserve_existing,
|
||||
verbose_fmt_string)
|
||||
const char *argpath;
|
||||
int mode;
|
||||
int parent_mode;
|
||||
uid_t owner;
|
||||
gid_t group;
|
||||
int preserve_existing;
|
||||
const char *verbose_fmt_string;
|
||||
#endif
|
||||
{
|
||||
char *dirpath; /* A copy we can scribble NULs on. */
|
||||
struct stat stats;
|
||||
int retval = 0;
|
||||
int oldmask = umask (0);
|
||||
|
||||
/* FIXME: move this alloca and strcpy into the if-block.
|
||||
Set dirpath to argpath in the else-block. */
|
||||
dirpath = (char *) alloca (strlen (argpath) + 1);
|
||||
strcpy (dirpath, argpath);
|
||||
|
||||
if (stat (dirpath, &stats))
|
||||
if (stat (argpath, &stats))
|
||||
{
|
||||
char *slash;
|
||||
int tmp_mode; /* Initial perms for leading dirs. */
|
||||
@@ -141,12 +156,24 @@ make_path (argpath, mode, parent_mode, owner, group, preserve_existing,
|
||||
struct ptr_list *next;
|
||||
};
|
||||
struct ptr_list *p, *leading_dirs = NULL;
|
||||
int do_chdir; /* Whether to chdir before each mkdir. */
|
||||
struct saved_cwd cwd;
|
||||
char *basename_dir;
|
||||
char *dirpath;
|
||||
|
||||
/* Temporarily relax umask in case it's overly restrictive. */
|
||||
int oldmask = umask (0);
|
||||
|
||||
/* Make a copy of ARGPATH that we can scribble NULs on. */
|
||||
dirpath = (char *) alloca (strlen (argpath) + 1);
|
||||
strcpy (dirpath, argpath);
|
||||
strip_trailing_slashes (dirpath);
|
||||
|
||||
/* If leading directories shouldn't be writable or executable,
|
||||
or should have set[ug]id or sticky bits set and we are setting
|
||||
their owners, we need to fix their permissions after making them. */
|
||||
if (((parent_mode & 0300) != 0300)
|
||||
|| (owner != (uid_t) -1 && group != (gid_t) -1
|
||||
if (((parent_mode & WX_USR) != WX_USR)
|
||||
|| ((owner != (uid_t) -1 || group != (gid_t) -1)
|
||||
&& (parent_mode & 07000) != 0))
|
||||
{
|
||||
tmp_mode = 0700;
|
||||
@@ -158,49 +185,103 @@ make_path (argpath, mode, parent_mode, owner, group, preserve_existing,
|
||||
re_protect = 0;
|
||||
}
|
||||
|
||||
/* If we can record the current working directory, we may be able
|
||||
to do the chdir optimization. */
|
||||
do_chdir = !save_cwd (&cwd);
|
||||
|
||||
/* If we've saved the cwd and DIRPATH is an absolute pathname,
|
||||
we must chdir to `/' in order to enable the chdir optimization.
|
||||
So if chdir ("/") fails, turn off the optimization. */
|
||||
if (do_chdir && *dirpath == '/' && chdir ("/") < 0)
|
||||
do_chdir = 0;
|
||||
|
||||
slash = dirpath;
|
||||
|
||||
/* Skip over leading slashes. */
|
||||
while (*slash == '/')
|
||||
slash++;
|
||||
while ((slash = strchr (slash, '/')))
|
||||
|
||||
while (1)
|
||||
{
|
||||
int newly_created_dir = 1;
|
||||
|
||||
/* slash points to the leftmost unprocessed component of dirpath. */
|
||||
basename_dir = slash;
|
||||
|
||||
slash = strchr (slash, '/');
|
||||
if (slash == NULL)
|
||||
break;
|
||||
|
||||
/* If we're *not* doing chdir before each mkdir, then we have to refer
|
||||
to the target using the full (multi-component) directory name. */
|
||||
if (!do_chdir)
|
||||
basename_dir = dirpath;
|
||||
|
||||
/* The mkdir and stat calls below appear to be reversed.
|
||||
They are not. It is important to call mkdir first and then to
|
||||
call stat (to distinguish the three cases) only if mkdir fails.
|
||||
The alternative to this approach is to `stat' each directory,
|
||||
then to call mkdir if it doesn't exist. But if some other process
|
||||
were to create the directory between the stat & mkdir, the mkdir
|
||||
would fail with EEXIST. */
|
||||
|
||||
*slash = '\0';
|
||||
if (stat (dirpath, &stats))
|
||||
if (mkdir (basename_dir, tmp_mode))
|
||||
{
|
||||
if (mkdir (dirpath, tmp_mode))
|
||||
if (stat (basename_dir, &stats))
|
||||
{
|
||||
error (0, errno, "cannot create directory `%s'", dirpath);
|
||||
umask (oldmask);
|
||||
CLEANUP;
|
||||
return 1;
|
||||
}
|
||||
else if (!S_ISDIR (stats.st_mode))
|
||||
{
|
||||
error (0, 0, "`%s' exists but is not a directory", dirpath);
|
||||
CLEANUP;
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (verbose_fmt_string != NULL)
|
||||
error (0, 0, verbose_fmt_string, dirpath);
|
||||
|
||||
if (owner != (uid_t) -1 && group != (gid_t) -1
|
||||
&& chown (dirpath, owner, group)
|
||||
#if defined(AFS) && defined (EPERM)
|
||||
&& errno != EPERM
|
||||
#endif
|
||||
)
|
||||
{
|
||||
error (0, errno, "%s", dirpath);
|
||||
retval = 1;
|
||||
}
|
||||
if (re_protect)
|
||||
{
|
||||
struct ptr_list *new = (struct ptr_list *)
|
||||
alloca (sizeof (struct ptr_list));
|
||||
new->dirname_end = slash;
|
||||
new->next = leading_dirs;
|
||||
leading_dirs = new;
|
||||
}
|
||||
/* DIRPATH already exists and is a directory. */
|
||||
newly_created_dir = 0;
|
||||
}
|
||||
}
|
||||
else if (!S_ISDIR (stats.st_mode))
|
||||
|
||||
if (newly_created_dir)
|
||||
{
|
||||
error (0, 0, "`%s' exists but is not a directory", dirpath);
|
||||
umask (oldmask);
|
||||
if (verbose_fmt_string)
|
||||
fprintf (stderr, verbose_fmt_string, dirpath);
|
||||
|
||||
if ((owner != (uid_t) -1 || group != (gid_t) -1)
|
||||
&& chown (basename_dir, owner, group)
|
||||
#if defined(AFS) && defined (EPERM)
|
||||
&& errno != EPERM
|
||||
#endif
|
||||
)
|
||||
{
|
||||
error (0, errno, "%s", dirpath);
|
||||
CLEANUP;
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (re_protect)
|
||||
{
|
||||
struct ptr_list *new = (struct ptr_list *)
|
||||
alloca (sizeof (struct ptr_list));
|
||||
new->dirname_end = slash;
|
||||
new->next = leading_dirs;
|
||||
leading_dirs = new;
|
||||
}
|
||||
}
|
||||
|
||||
/* If we were able to save the initial working directory,
|
||||
then we can use chdir to change into each directory before
|
||||
creating an entry in that directory. This avoids making
|
||||
stat and mkdir process O(n^2) file name components. */
|
||||
if (do_chdir && chdir (basename_dir) < 0)
|
||||
{
|
||||
error (0, errno, "cannot chdir to directory, %s", dirpath);
|
||||
CLEANUP;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -212,40 +293,49 @@ make_path (argpath, mode, parent_mode, owner, group, preserve_existing,
|
||||
slash++;
|
||||
}
|
||||
|
||||
if (!do_chdir)
|
||||
basename_dir = dirpath;
|
||||
|
||||
/* We're done making leading directories.
|
||||
Create the final component of the path. */
|
||||
|
||||
/* The path could end in "/." or contain "/..", so test
|
||||
if we really have to create the directory. */
|
||||
|
||||
if (stat (dirpath, &stats) && mkdir (dirpath, mode))
|
||||
if (stat (basename_dir, &stats) && mkdir (basename_dir, mode))
|
||||
{
|
||||
error (0, errno, "cannot create directory `%s'", dirpath);
|
||||
umask (oldmask);
|
||||
CLEANUP;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Done creating directories. Restore original umask. */
|
||||
umask (oldmask);
|
||||
|
||||
if (verbose_fmt_string != NULL)
|
||||
error (0, 0, verbose_fmt_string, dirpath);
|
||||
|
||||
if (owner != (uid_t) -1 && group != (gid_t) -1)
|
||||
{
|
||||
if (chown (dirpath, owner, group)
|
||||
if (chown (basename_dir, owner, group)
|
||||
#ifdef AFS
|
||||
&& errno != EPERM
|
||||
#endif
|
||||
)
|
||||
{
|
||||
error (0, errno, "%s", dirpath);
|
||||
error (0, errno, "cannot chown %s", dirpath);
|
||||
retval = 1;
|
||||
}
|
||||
/* chown may have turned off some permission bits we wanted. */
|
||||
if ((mode & 07000) != 0 && chmod (dirpath, mode))
|
||||
if ((mode & 07000) != 0 && chmod (basename_dir, mode))
|
||||
{
|
||||
error (0, errno, "%s", dirpath);
|
||||
error (0, errno, "cannot chmod %s", dirpath);
|
||||
retval = 1;
|
||||
}
|
||||
}
|
||||
|
||||
CLEANUP_CWD;
|
||||
|
||||
/* If the mode for leading directories didn't include owner "wx"
|
||||
privileges, we have to reset their protections to the correct
|
||||
value. */
|
||||
@@ -263,10 +353,11 @@ make_path (argpath, mode, parent_mode, owner, group, preserve_existing,
|
||||
{
|
||||
/* We get here if the entire path already exists. */
|
||||
|
||||
const char *dirpath = argpath;
|
||||
|
||||
if (!S_ISDIR (stats.st_mode))
|
||||
{
|
||||
error (0, 0, "`%s' exists but is not a directory", dirpath);
|
||||
umask (oldmask);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -278,7 +369,7 @@ make_path (argpath, mode, parent_mode, owner, group, preserve_existing,
|
||||
On System V, users can give away files with chown and then not
|
||||
be able to chmod them. So don't give files away. */
|
||||
|
||||
if (owner != (uid_t) -1 && group != (gid_t) -1
|
||||
if ((owner != (uid_t) -1 || group != (gid_t) -1)
|
||||
&& chown (dirpath, owner, group)
|
||||
#ifdef AFS
|
||||
&& errno != EPERM
|
||||
@@ -296,6 +387,5 @@ make_path (argpath, mode, parent_mode, owner, group, preserve_existing,
|
||||
}
|
||||
}
|
||||
|
||||
umask (oldmask);
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -1,15 +1,16 @@
|
||||
# undef __P
|
||||
#if __STDC__
|
||||
# define __P(Args) Args
|
||||
#else
|
||||
# define __P(Args) ()
|
||||
#ifndef PARAMS
|
||||
# if defined PROTOTYPES || (defined __STDC__ && __STDC__)
|
||||
# define PARAMS(Args) Args
|
||||
# else
|
||||
# define PARAMS(Args) ()
|
||||
# endif
|
||||
#endif
|
||||
|
||||
int
|
||||
make_path __P ((const char *_argpath,
|
||||
int _mode,
|
||||
int _parent_mode,
|
||||
uid_t _owner,
|
||||
gid_t _group,
|
||||
int _preserve_existing,
|
||||
const char *_verbose_fmt_string));
|
||||
make_path PARAMS ((const char *_argpath,
|
||||
int _mode,
|
||||
int _parent_mode,
|
||||
uid_t _owner,
|
||||
gid_t _group,
|
||||
int _preserve_existing,
|
||||
const char *_verbose_fmt_string));
|
||||
|
||||
39
lib/malloc.c
Normal file
39
lib/malloc.c
Normal file
@@ -0,0 +1,39 @@
|
||||
/* Work around bug on some systems where malloc (0) fails.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* written by Jim Meyering */
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
#undef malloc
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
char *malloc ();
|
||||
|
||||
/* Allocate an N-byte block of memory from the heap.
|
||||
If N is zero, allocate a 1-byte block. */
|
||||
|
||||
char *
|
||||
rpl_malloc (n)
|
||||
size_t n;
|
||||
{
|
||||
if (n == 0)
|
||||
n = 1;
|
||||
return malloc (n);
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Case-insensitive buffer comparator.
|
||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||
Copyright (C) 1996, 1997 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -25,21 +25,23 @@
|
||||
#include <ctype.h>
|
||||
|
||||
#if defined (STDC_HEADERS) || (!defined (isascii) && !defined (HAVE_ISASCII))
|
||||
#define IN_CTYPE_DOMAIN(c) 1
|
||||
# define IN_CTYPE_DOMAIN(c) 1
|
||||
#else
|
||||
#define IN_CTYPE_DOMAIN(c) isascii(c)
|
||||
# define IN_CTYPE_DOMAIN(c) isascii(c)
|
||||
#endif
|
||||
#define ISUPPER(c) (IN_CTYPE_DOMAIN (c) && isupper (c))
|
||||
#define ISLOWER(c) (IN_CTYPE_DOMAIN (c) && islower (c))
|
||||
|
||||
#if _LIBC || STDC_HEADERS
|
||||
# define TOLOWER(c) tolower (c)
|
||||
# define TOUPPER(c) toupper (c)
|
||||
#else
|
||||
# define TOLOWER(c) (ISUPPER (c) ? tolower (c) : (c))
|
||||
# define TOUPPER(c) (ISLOWER (c) ? toupper (c) : (c))
|
||||
#endif
|
||||
|
||||
#include "memcasecmp.h"
|
||||
|
||||
/* Like memcmp, but ignore differences in case. */
|
||||
/* Like memcmp, but ignore differences in case.
|
||||
Convert to upper case (not lower) before comparing so that
|
||||
join -i works with sort -f. */
|
||||
|
||||
int
|
||||
memcasecmp (vs1, vs2, n)
|
||||
@@ -54,8 +56,8 @@ memcasecmp (vs1, vs2, n)
|
||||
{
|
||||
unsigned char u1 = *s1++;
|
||||
unsigned char u2 = *s2++;
|
||||
if (TOLOWER (u1) != TOLOWER (u2))
|
||||
return TOLOWER (u1) - TOLOWER (u2);
|
||||
if (TOUPPER (u1) != TOUPPER (u2))
|
||||
return TOUPPER (u1) - TOUPPER (u2);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
#undef PARAMS
|
||||
#if defined (__STDC__) && __STDC__
|
||||
# define PARAMS(Args) Args
|
||||
#else
|
||||
# define PARAMS(Args) ()
|
||||
#ifndef PARAMS
|
||||
# if defined PROTOTYPES || (defined __STDC__ && __STDC__)
|
||||
# define PARAMS(Args) Args
|
||||
# else
|
||||
# define PARAMS(Args) ()
|
||||
# endif
|
||||
#endif
|
||||
|
||||
int
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Copyright (C) 1991, 1993 Free Software Foundation, Inc.
|
||||
Based on strlen implemention by Torbjorn Granlund (tege@sics.se),
|
||||
/* Copyright (C) 1991, 1993, 1997 Free Software Foundation, Inc.
|
||||
Based on strlen implementation by Torbjorn Granlund (tege@sics.se),
|
||||
with help from Dan Sahlin (dan@sics.se) and
|
||||
commentary by Jim Blandy (jimb@ai.mit.edu);
|
||||
adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu),
|
||||
|
||||
98
lib/memcmp.c
98
lib/memcmp.c
@@ -1,72 +1,83 @@
|
||||
/* Copyright (C) 1991, 1993, 1995 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1991, 1993, 1995, 1997, 1998 Free Software Foundation, Inc.
|
||||
Contributed by Torbjorn Granlund (tege@sics.se).
|
||||
|
||||
NOTE: The canonical source of this file is maintained with the GNU C Library.
|
||||
Bugs can be reported to bug-glibc@prep.ai.mit.edu.
|
||||
NOTE: The canonical source of this file is maintained with the GNU C Library.
|
||||
Bugs can be reported to bug-glibc@prep.ai.mit.edu.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
USA. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#undef __ptr_t
|
||||
#if defined (__cplusplus) || (defined (__STDC__) && __STDC__)
|
||||
#define __ptr_t void *
|
||||
#if defined __cplusplus || (defined __STDC__ && __STDC__)
|
||||
# define __ptr_t void *
|
||||
#else /* Not C++ or ANSI C. */
|
||||
#undef const
|
||||
#define const
|
||||
#define __ptr_t char *
|
||||
# undef const
|
||||
# define const
|
||||
# define __ptr_t char *
|
||||
#endif /* C++ or ANSI C. */
|
||||
|
||||
#if defined (HAVE_STRING_H) || defined (_LIBC)
|
||||
#include <string.h>
|
||||
#ifndef __P
|
||||
# if defined __GNUC__ || (defined __STDC__ && __STDC__)
|
||||
# define __P(args) args
|
||||
# else
|
||||
# define __P(args) ()
|
||||
# endif /* GCC. */
|
||||
#endif /* Not __P. */
|
||||
|
||||
#if defined HAVE_STRING_H || defined _LIBC
|
||||
# include <string.h>
|
||||
#endif
|
||||
|
||||
#undef memcmp
|
||||
|
||||
#ifdef _LIBC
|
||||
|
||||
#include <memcopy.h>
|
||||
# include <memcopy.h>
|
||||
|
||||
#else /* Not in the GNU C library. */
|
||||
|
||||
#include <sys/types.h>
|
||||
# include <sys/types.h>
|
||||
|
||||
/* Type to use for aligned memory operations.
|
||||
This should normally be the biggest type supported by a single load
|
||||
and store. Must be an unsigned type. */
|
||||
#define op_t unsigned long int
|
||||
#define OPSIZ (sizeof(op_t))
|
||||
# define op_t unsigned long int
|
||||
# define OPSIZ (sizeof(op_t))
|
||||
|
||||
/* Threshold value for when to enter the unrolled loops. */
|
||||
#define OP_T_THRES 16
|
||||
# define OP_T_THRES 16
|
||||
|
||||
/* Type to use for unaligned operations. */
|
||||
typedef unsigned char byte;
|
||||
|
||||
#ifndef WORDS_BIGENDIAN
|
||||
#define MERGE(w0, sh_1, w1, sh_2) (((w0) >> (sh_1)) | ((w1) << (sh_2)))
|
||||
#else
|
||||
#define MERGE(w0, sh_1, w1, sh_2) (((w0) << (sh_1)) | ((w1) >> (sh_2)))
|
||||
#endif
|
||||
# ifndef WORDS_BIGENDIAN
|
||||
# define MERGE(w0, sh_1, w1, sh_2) (((w0) >> (sh_1)) | ((w1) << (sh_2)))
|
||||
# else
|
||||
# define MERGE(w0, sh_1, w1, sh_2) (((w0) << (sh_1)) | ((w1) >> (sh_2)))
|
||||
# endif
|
||||
|
||||
#endif /* In the GNU C library. */
|
||||
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
#define CMP_LT_OR_GT(a, b) ((a) > (b) ? 1 : -1)
|
||||
# define CMP_LT_OR_GT(a, b) ((a) > (b) ? 1 : -1)
|
||||
#else
|
||||
#define CMP_LT_OR_GT(a, b) memcmp_bytes ((a), (b))
|
||||
# define CMP_LT_OR_GT(a, b) memcmp_bytes ((a), (b))
|
||||
#endif
|
||||
|
||||
/* BE VERY CAREFUL IF YOU CHANGE THIS CODE! */
|
||||
@@ -86,9 +97,12 @@ typedef unsigned char byte;
|
||||
/* memcmp_bytes -- Compare A and B bytewise in the byte order of the machine.
|
||||
A and B are known to be different.
|
||||
This is needed only on little-endian machines. */
|
||||
#ifdef __GNUC__
|
||||
|
||||
static int memcmp_bytes __P((op_t, op_t));
|
||||
|
||||
# ifdef __GNUC__
|
||||
__inline
|
||||
#endif
|
||||
# endif
|
||||
static int
|
||||
memcmp_bytes (a, b)
|
||||
op_t a, b;
|
||||
@@ -109,6 +123,8 @@ memcmp_bytes (a, b)
|
||||
}
|
||||
#endif
|
||||
|
||||
static int memcmp_common_alignment __P((long, long, size_t));
|
||||
|
||||
/* memcmp_common_alignment -- Compare blocks at SRCP1 and SRCP2 with LEN `op_t'
|
||||
objects (not LEN bytes!). Both SRCP1 and SRCP2 should be aligned for
|
||||
memory operations on `op_t's. */
|
||||
@@ -126,6 +142,7 @@ memcmp_common_alignment (srcp1, srcp2, len)
|
||||
|
||||
switch (len % 4)
|
||||
{
|
||||
default: /* Avoid warning about uninitialized local variables. */
|
||||
case 2:
|
||||
a0 = ((op_t *) srcp1)[0];
|
||||
b0 = ((op_t *) srcp2)[0];
|
||||
@@ -196,6 +213,8 @@ memcmp_common_alignment (srcp1, srcp2, len)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int memcmp_not_common_alignment __P((long, long, size_t));
|
||||
|
||||
/* memcmp_not_common_alignment -- Compare blocks at SRCP1 and SRCP2 with LEN
|
||||
`op_t' objects (not LEN bytes!). SRCP2 should be aligned for memory
|
||||
operations on `op_t', but SRCP1 *should be unaligned*. */
|
||||
@@ -225,6 +244,7 @@ memcmp_not_common_alignment (srcp1, srcp2, len)
|
||||
|
||||
switch (len % 4)
|
||||
{
|
||||
default: /* Avoid warning about uninitialized local variables. */
|
||||
case 2:
|
||||
a1 = ((op_t *) srcp1)[0];
|
||||
a2 = ((op_t *) srcp1)[1];
|
||||
@@ -305,7 +325,7 @@ memcmp_not_common_alignment (srcp1, srcp2, len)
|
||||
}
|
||||
|
||||
int
|
||||
memcmp (s1, s2, len)
|
||||
rpl_memcmp (s1, s2, len)
|
||||
const __ptr_t s1;
|
||||
const __ptr_t s2;
|
||||
size_t len;
|
||||
@@ -366,8 +386,6 @@ memcmp (s1, s2, len)
|
||||
}
|
||||
|
||||
#ifdef weak_alias
|
||||
#undef bcmp
|
||||
# undef bcmp
|
||||
weak_alias (memcmp, bcmp)
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
24
lib/memcpy.c
24
lib/memcpy.c
@@ -1,11 +1,29 @@
|
||||
/* Copy LEN bytes starting at SRCADDR to DESTADDR. Result undefined
|
||||
if the source overlaps with the destination.
|
||||
Return DESTADDR. */
|
||||
/* Copyright (C) 1995, 1997 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* Written by Jim Meyering <meyering@na-net.ornl.gov>. */
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
/* Copy LEN bytes starting at SRCADDR to DESTADDR. Result undefined
|
||||
if the source overlaps with the destination.
|
||||
Return DESTADDR. */
|
||||
|
||||
char *
|
||||
memcpy (destaddr, srcaddr, len)
|
||||
char *destaddr;
|
||||
|
||||
260
lib/mktime.c
260
lib/mktime.c
@@ -1,8 +1,9 @@
|
||||
/* Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc.
|
||||
/* mktime: convert a `struct tm' to a time_t value zzzzzz
|
||||
Copyright (C) 1993-1997, 1998 Free Software Foundation, Inc.
|
||||
Contributed by Paul Eggert (eggert@twinsun.com).
|
||||
|
||||
NOTE: The canonical source of this file is maintained with the GNU C
|
||||
Library. Bugs can be reported to bug-glibc@prep.ai.mit.edu.
|
||||
NOTE: The canonical source of this file is maintained with the GNU C Library.
|
||||
Bugs can be reported to bug-glibc@prep.ai.mit.edu.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
@@ -15,65 +16,84 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
USA. */
|
||||
|
||||
/* Define this to have a standalone program to test this implementation of
|
||||
mktime. */
|
||||
/* #define DEBUG 1 */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
/* Some systems need this in order to declare localtime_r properly. */
|
||||
#ifndef _REENTRANT
|
||||
# define _REENTRANT 1
|
||||
#endif
|
||||
|
||||
#ifdef _LIBC
|
||||
# define HAVE_LIMITS_H 1
|
||||
# define HAVE_LOCALTIME_R 1
|
||||
# define STDC_HEADERS 1
|
||||
#endif
|
||||
|
||||
/* Assume that leap seconds are possible, unless told otherwise.
|
||||
If the host has a `zic' command with a `-L leapsecondfilename' option,
|
||||
then it supports leap seconds; otherwise it probably doesn't. */
|
||||
#ifndef LEAP_SECONDS_POSSIBLE
|
||||
#define LEAP_SECONDS_POSSIBLE 1
|
||||
# define LEAP_SECONDS_POSSIBLE 1
|
||||
#endif
|
||||
|
||||
#include <sys/types.h> /* Some systems define `time_t' here. */
|
||||
#include <time.h>
|
||||
|
||||
#if __STDC__ || __GNU_LIBRARY__ || STDC_HEADERS
|
||||
#include <limits.h>
|
||||
#if HAVE_LIMITS_H
|
||||
# include <limits.h>
|
||||
#endif
|
||||
|
||||
#if DEBUG
|
||||
#include <stdio.h>
|
||||
#if __STDC__ || __GNU_LIBRARY__ || STDC_HEADERS
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
# include <stdio.h>
|
||||
# if STDC_HEADERS
|
||||
# include <stdlib.h>
|
||||
# endif
|
||||
/* Make it work even if the system's libc has its own mktime routine. */
|
||||
#define mktime my_mktime
|
||||
# define mktime my_mktime
|
||||
#endif /* DEBUG */
|
||||
|
||||
#ifndef __P
|
||||
#if defined (__GNUC__) || (defined (__STDC__) && __STDC__)
|
||||
#define __P(args) args
|
||||
#else
|
||||
#define __P(args) ()
|
||||
#endif /* GCC. */
|
||||
# if defined (__GNUC__) || (defined (__STDC__) && __STDC__)
|
||||
# define __P(args) args
|
||||
# else
|
||||
# define __P(args) ()
|
||||
# endif /* GCC. */
|
||||
#endif /* Not __P. */
|
||||
|
||||
#ifndef CHAR_BIT
|
||||
#define CHAR_BIT 8
|
||||
# define CHAR_BIT 8
|
||||
#endif
|
||||
|
||||
/* The extra casts work around common compiler bugs. */
|
||||
#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
|
||||
/* The outer cast is needed to work around a bug in Cray C 5.0.3.0.
|
||||
It is necessary at least when t == time_t. */
|
||||
#define TYPE_MINIMUM(t) ((t) (TYPE_SIGNED (t) \
|
||||
? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) : (t) 0))
|
||||
#define TYPE_MAXIMUM(t) ((t) (~ (t) 0 - TYPE_MINIMUM (t)))
|
||||
|
||||
#ifndef INT_MIN
|
||||
#define INT_MIN (~0 << (sizeof (int) * CHAR_BIT - 1))
|
||||
# define INT_MIN TYPE_MINIMUM (int)
|
||||
#endif
|
||||
#ifndef INT_MAX
|
||||
#define INT_MAX (~0 - INT_MIN)
|
||||
# define INT_MAX TYPE_MAXIMUM (int)
|
||||
#endif
|
||||
|
||||
#ifndef TIME_T_MIN
|
||||
#define TIME_T_MIN (0 < (time_t) -1 ? (time_t) 0 \
|
||||
: ~ (time_t) 0 << (sizeof (time_t) * CHAR_BIT - 1))
|
||||
# define TIME_T_MIN TYPE_MINIMUM (time_t)
|
||||
#endif
|
||||
#ifndef TIME_T_MAX
|
||||
#define TIME_T_MAX (~ (time_t) 0 - TIME_T_MIN)
|
||||
# define TIME_T_MAX TYPE_MAXIMUM (time_t)
|
||||
#endif
|
||||
|
||||
#define TM_YEAR_BASE 1900
|
||||
@@ -82,7 +102,7 @@
|
||||
#ifndef __isleap
|
||||
/* Nonzero if YEAR is a leap year (every 4 years,
|
||||
except every 100th isn't, and every 400th is). */
|
||||
#define __isleap(year) \
|
||||
# define __isleap(year) \
|
||||
((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
|
||||
#endif
|
||||
|
||||
@@ -95,18 +115,21 @@ const unsigned short int __mon_yday[2][13] =
|
||||
{ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
|
||||
};
|
||||
|
||||
static struct tm *ranged_convert __P ((struct tm *(*) __P ((const time_t *,
|
||||
struct tm *)),
|
||||
time_t *, struct tm *));
|
||||
static time_t ydhms_tm_diff __P ((int, int, int, int, int, const struct tm *));
|
||||
time_t __mktime_internal __P ((struct tm *,
|
||||
struct tm *(*) (const time_t *, struct tm *),
|
||||
time_t *));
|
||||
|
||||
|
||||
#if ! HAVE_LOCALTIME_R && ! defined (localtime_r)
|
||||
#ifdef _LIBC
|
||||
#define localtime_r __localtime_r
|
||||
# define localtime_r __localtime_r
|
||||
#else
|
||||
# if ! HAVE_LOCALTIME_R && ! defined localtime_r
|
||||
/* Approximate localtime_r as best we can in its absence. */
|
||||
#define localtime_r my_localtime_r
|
||||
# define localtime_r my_mktime_localtime_r
|
||||
static struct tm *localtime_r __P ((const time_t *, struct tm *));
|
||||
static struct tm *
|
||||
localtime_r (t, tp)
|
||||
@@ -119,42 +142,112 @@ localtime_r (t, tp)
|
||||
*tp = *l;
|
||||
return tp;
|
||||
}
|
||||
# endif /* ! HAVE_LOCALTIME_R && ! defined (localtime_r) */
|
||||
#endif /* ! _LIBC */
|
||||
#endif /* ! HAVE_LOCALTIME_R && ! defined (localtime_r) */
|
||||
|
||||
|
||||
/* Yield the difference between (YEAR-YDAY HOUR:MIN:SEC) and (*TP),
|
||||
measured in seconds, ignoring leap seconds.
|
||||
YEAR uses the same numbering as TM->tm_year.
|
||||
All values are in range, except possibly YEAR.
|
||||
If TP is null, return a nonzero value.
|
||||
If overflow occurs, yield the low order bits of the correct answer. */
|
||||
static time_t
|
||||
ydhms_tm_diff (year, yday, hour, min, sec, tp)
|
||||
int year, yday, hour, min, sec;
|
||||
const struct tm *tp;
|
||||
{
|
||||
time_t ay = year + (time_t) (TM_YEAR_BASE - 1);
|
||||
time_t by = tp->tm_year + (time_t) (TM_YEAR_BASE - 1);
|
||||
time_t intervening_leap_days =
|
||||
(ay/4 - by/4) - (ay/100 - by/100) + (ay/400 - by/400);
|
||||
time_t years = ay - by;
|
||||
time_t days = (365 * years + intervening_leap_days
|
||||
+ (yday - tp->tm_yday));
|
||||
return (60 * (60 * (24 * days + (hour - tp->tm_hour))
|
||||
+ (min - tp->tm_min))
|
||||
+ (sec - tp->tm_sec));
|
||||
if (!tp)
|
||||
return 1;
|
||||
else
|
||||
{
|
||||
/* Compute intervening leap days correctly even if year is negative.
|
||||
Take care to avoid int overflow. time_t overflow is OK, since
|
||||
only the low order bits of the correct time_t answer are needed.
|
||||
Don't convert to time_t until after all divisions are done, since
|
||||
time_t might be unsigned. */
|
||||
int a4 = (year >> 2) + (TM_YEAR_BASE >> 2) - ! (year & 3);
|
||||
int b4 = (tp->tm_year >> 2) + (TM_YEAR_BASE >> 2) - ! (tp->tm_year & 3);
|
||||
int a100 = a4 / 25 - (a4 % 25 < 0);
|
||||
int b100 = b4 / 25 - (b4 % 25 < 0);
|
||||
int a400 = a100 >> 2;
|
||||
int b400 = b100 >> 2;
|
||||
int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400);
|
||||
time_t years = year - (time_t) tp->tm_year;
|
||||
time_t days = (365 * years + intervening_leap_days
|
||||
+ (yday - tp->tm_yday));
|
||||
return (60 * (60 * (24 * days + (hour - tp->tm_hour))
|
||||
+ (min - tp->tm_min))
|
||||
+ (sec - tp->tm_sec));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static time_t localtime_offset;
|
||||
|
||||
/* Convert *TP to a time_t value. */
|
||||
time_t
|
||||
mktime (tp)
|
||||
struct tm *tp;
|
||||
{
|
||||
static time_t localtime_offset;
|
||||
#ifdef _LIBC
|
||||
/* POSIX.1 8.1.1 requires that whenever mktime() is called, the
|
||||
time zone names contained in the external variable `tzname' shall
|
||||
be set as if the tzset() function had been called. */
|
||||
__tzset ();
|
||||
#endif
|
||||
|
||||
return __mktime_internal (tp, localtime_r, &localtime_offset);
|
||||
}
|
||||
|
||||
/* Use CONVERT to convert *T to a broken down time in *TP.
|
||||
If *T is out of range for conversion, adjust it so that
|
||||
it is the nearest in-range value and then convert that. */
|
||||
static struct tm *
|
||||
ranged_convert (convert, t, tp)
|
||||
struct tm *(*convert) __P ((const time_t *, struct tm *));
|
||||
time_t *t;
|
||||
struct tm *tp;
|
||||
{
|
||||
struct tm *r;
|
||||
|
||||
if (! (r = (*convert) (t, tp)) && *t)
|
||||
{
|
||||
time_t bad = *t;
|
||||
time_t ok = 0;
|
||||
struct tm tm;
|
||||
|
||||
/* BAD is a known unconvertible time_t, and OK is a known good one.
|
||||
Use binary search to narrow the range between BAD and OK until
|
||||
they differ by 1. */
|
||||
while (bad != ok + (bad < 0 ? -1 : 1))
|
||||
{
|
||||
time_t mid = *t = (bad < 0
|
||||
? bad + ((ok - bad) >> 1)
|
||||
: ok + ((bad - ok) >> 1));
|
||||
if ((r = (*convert) (t, tp)))
|
||||
{
|
||||
tm = *r;
|
||||
ok = mid;
|
||||
}
|
||||
else
|
||||
bad = mid;
|
||||
}
|
||||
|
||||
if (!r && ok)
|
||||
{
|
||||
/* The last conversion attempt failed;
|
||||
revert to the most recent successful attempt. */
|
||||
*t = ok;
|
||||
*tp = tm;
|
||||
r = tp;
|
||||
}
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
/* Convert *TP to a time_t value, inverting
|
||||
the monotonic and mostly-unit-linear conversion function CONVERT.
|
||||
Use *OFFSET to keep track of a guess at the offset of the result,
|
||||
@@ -171,7 +264,7 @@ __mktime_internal (tp, convert, offset)
|
||||
|
||||
/* The maximum number of probes (calls to CONVERT) should be enough
|
||||
to handle any combinations of time zone rule changes, solar time,
|
||||
and leap seconds. Posix.1 prohibits leap seconds, but some hosts
|
||||
and leap seconds. POSIX.1 prohibits leap seconds, but some hosts
|
||||
have them anyway. */
|
||||
int remaining_probes = 4;
|
||||
|
||||
@@ -202,10 +295,10 @@ __mktime_internal (tp, convert, offset)
|
||||
[mon_remainder + 12 * negative_mon_remainder])
|
||||
+ mday - 1);
|
||||
|
||||
int sec_requested = sec;
|
||||
#if LEAP_SECONDS_POSSIBLE
|
||||
/* Handle out-of-range seconds specially,
|
||||
since ydhms_tm_diff assumes every minute has 60 seconds. */
|
||||
int sec_requested = sec;
|
||||
if (sec < 0)
|
||||
sec = 0;
|
||||
if (59 < sec)
|
||||
@@ -220,7 +313,8 @@ __mktime_internal (tp, convert, offset)
|
||||
t0 = ydhms_tm_diff (year, yday, hour, min, sec, &tm);
|
||||
|
||||
for (t = t0 + *offset;
|
||||
(dt = ydhms_tm_diff (year, yday, hour, min, sec, (*convert) (&t, &tm)));
|
||||
(dt = ydhms_tm_diff (year, yday, hour, min, sec,
|
||||
ranged_convert (convert, &t, &tm)));
|
||||
t += dt)
|
||||
if (--remaining_probes == 0)
|
||||
return -1;
|
||||
@@ -240,7 +334,7 @@ __mktime_internal (tp, convert, offset)
|
||||
{
|
||||
struct tm otm;
|
||||
if (! (dt = ydhms_tm_diff (year, yday, hour, min, sec,
|
||||
(*convert) (&ot, &otm))))
|
||||
ranged_convert (convert, &ot, &otm))))
|
||||
{
|
||||
t = ot;
|
||||
tm = otm;
|
||||
@@ -260,7 +354,8 @@ __mktime_internal (tp, convert, offset)
|
||||
/* Adjust time to reflect the tm_sec requested, not the normalized value.
|
||||
Also, repair any damage from a false match due to a leap second. */
|
||||
t += sec_requested - sec + (sec == 0 && tm.tm_sec == 60);
|
||||
(*convert) (&t, &tm);
|
||||
if (! (*convert) (&t, &tm))
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -276,7 +371,15 @@ __mktime_internal (tp, convert, offset)
|
||||
double dday = 366 * dyear + mday;
|
||||
double dsec = 60 * (60 * (24 * dday + hour) + min) + sec_requested;
|
||||
|
||||
if (TIME_T_MAX / 3 - TIME_T_MIN / 3 < (dsec < 0 ? - dsec : dsec))
|
||||
/* On Irix4.0.5 cc, dividing TIME_T_MIN by 3 does not produce
|
||||
correct results, ie., it erroneously gives a positive value
|
||||
of 715827882. Setting a variable first then doing math on it
|
||||
seems to work. (ghazi@caip.rutgers.edu) */
|
||||
|
||||
const time_t time_t_max = TIME_T_MAX;
|
||||
const time_t time_t_min = TIME_T_MIN;
|
||||
|
||||
if (time_t_max / 3 - time_t_min / 3 < (dsec < 0 ? - dsec : dsec))
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -310,25 +413,28 @@ static void
|
||||
print_tm (tp)
|
||||
struct tm *tp;
|
||||
{
|
||||
printf ("%04d-%02d-%02d %02d:%02d:%02d yday %03d wday %d isdst %d",
|
||||
tp->tm_year + TM_YEAR_BASE, tp->tm_mon + 1, tp->tm_mday,
|
||||
tp->tm_hour, tp->tm_min, tp->tm_sec,
|
||||
tp->tm_yday, tp->tm_wday, tp->tm_isdst);
|
||||
if (tp)
|
||||
printf ("%04d-%02d-%02d %02d:%02d:%02d yday %03d wday %d isdst %d",
|
||||
tp->tm_year + TM_YEAR_BASE, tp->tm_mon + 1, tp->tm_mday,
|
||||
tp->tm_hour, tp->tm_min, tp->tm_sec,
|
||||
tp->tm_yday, tp->tm_wday, tp->tm_isdst);
|
||||
else
|
||||
printf ("0");
|
||||
}
|
||||
|
||||
static int
|
||||
check_result (tk, tmk, tl, tml)
|
||||
check_result (tk, tmk, tl, lt)
|
||||
time_t tk;
|
||||
struct tm tmk;
|
||||
time_t tl;
|
||||
struct tm tml;
|
||||
struct tm *lt;
|
||||
{
|
||||
if (tk != tl || not_equal_tm (&tmk, &tml))
|
||||
if (tk != tl || !lt || not_equal_tm (&tmk, lt))
|
||||
{
|
||||
printf ("mktime (");
|
||||
print_tm (&tmk);
|
||||
printf (")\nyields (");
|
||||
print_tm (&tml);
|
||||
print_tm (lt);
|
||||
printf (") == %ld, should be %ld\n", (long) tl, (long) tk);
|
||||
return 1;
|
||||
}
|
||||
@@ -343,6 +449,7 @@ main (argc, argv)
|
||||
{
|
||||
int status = 0;
|
||||
struct tm tm, tmk, tml;
|
||||
struct tm *lt;
|
||||
time_t tk, tl;
|
||||
char trailer;
|
||||
|
||||
@@ -359,11 +466,16 @@ main (argc, argv)
|
||||
tm.tm_isdst = argc == 3 ? -1 : atoi (argv[3]);
|
||||
tmk = tm;
|
||||
tl = mktime (&tmk);
|
||||
tml = *localtime (&tl);
|
||||
lt = localtime (&tl);
|
||||
if (lt)
|
||||
{
|
||||
tml = *lt;
|
||||
lt = &tml;
|
||||
}
|
||||
printf ("mktime returns %ld == ", (long) tl);
|
||||
print_tm (&tmk);
|
||||
printf ("\n");
|
||||
status = check_result (tl, tmk, tl, tml);
|
||||
status = check_result (tl, tmk, tl, lt);
|
||||
}
|
||||
else if (argc == 4 || (argc == 5 && strcmp (argv[4], "-") == 0))
|
||||
{
|
||||
@@ -374,19 +486,35 @@ main (argc, argv)
|
||||
if (argc == 4)
|
||||
for (tl = from; tl <= to; tl += by)
|
||||
{
|
||||
tml = *localtime (&tl);
|
||||
tmk = tml;
|
||||
tk = mktime (&tmk);
|
||||
status |= check_result (tk, tmk, tl, tml);
|
||||
lt = localtime (&tl);
|
||||
if (lt)
|
||||
{
|
||||
tmk = tml = *lt;
|
||||
tk = mktime (&tmk);
|
||||
status |= check_result (tk, tmk, tl, tml);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf ("localtime (%ld) yields 0\n", (long) tl);
|
||||
status = 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
for (tl = from; tl <= to; tl += by)
|
||||
{
|
||||
/* Null benchmark. */
|
||||
tml = *localtime (&tl);
|
||||
tmk = tml;
|
||||
tk = tl;
|
||||
status |= check_result (tk, tmk, tl, tml);
|
||||
lt = localtime (&tl);
|
||||
if (lt)
|
||||
{
|
||||
tmk = tml = *lt;
|
||||
tk = tl;
|
||||
status |= check_result (tk, tmk, tl, tml);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf ("localtime (%ld) yields 0\n", (long) tl);
|
||||
status = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -403,6 +531,6 @@ main (argc, argv)
|
||||
|
||||
/*
|
||||
Local Variables:
|
||||
compile-command: "gcc -DDEBUG=1 -Wall -O -g mktime.c -o mktime"
|
||||
compile-command: "gcc -DDEBUG -D__EXTENSIONS__ -DHAVE_LIMITS_H -DHAVE_LOCALTIME_R -DSTDC_HEADERS -Wall -W -O -g mktime.c -o mktime"
|
||||
End:
|
||||
*/
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* modechange.c -- file mode manipulation
|
||||
Copyright (C) 1989, 1990 Free Software Foundation, Inc.
|
||||
Copyright (C) 1989, 1990, 1997 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -236,6 +236,33 @@ invalid:
|
||||
return MODE_INVALID;
|
||||
}
|
||||
|
||||
/* Return a file mode change operation that sets permissions to match those
|
||||
of REF_FILE. Return MODE_BAD_REFERENCE if REF_FILE can't be accessed. */
|
||||
|
||||
struct mode_change *
|
||||
mode_create_from_ref (ref_file)
|
||||
const char *ref_file;
|
||||
{
|
||||
struct mode_change *change; /* the only change element */
|
||||
struct stat ref_stats;
|
||||
|
||||
if (stat (ref_file, &ref_stats))
|
||||
return MODE_BAD_REFERENCE;
|
||||
|
||||
change = talloc (struct mode_change);
|
||||
|
||||
if (change == NULL)
|
||||
return MODE_MEMORY_EXHAUSTED;
|
||||
|
||||
change->op = '=';
|
||||
change->flags = 0;
|
||||
change->affected = 07777;
|
||||
change->value = ref_stats.st_mode;
|
||||
change->next = NULL;
|
||||
|
||||
return change;
|
||||
}
|
||||
|
||||
/* Return file mode OLDMODE, adjusted as indicated by the list of change
|
||||
operations CHANGES. If OLDMODE is a directory, the type `X'
|
||||
change affects it even if no execute bits were set in OLDMODE.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* modechange.h -- definitions for file mode manipulation
|
||||
Copyright (C) 1989, 1990 Free Software Foundation, Inc.
|
||||
Copyright (C) 1989, 1990, 1997 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -17,14 +17,17 @@
|
||||
|
||||
/* Masks for the `flags' field in a `struct mode_change'. */
|
||||
|
||||
#if ! defined MODECHANGE_H_
|
||||
# define MODECHANGE_H_
|
||||
|
||||
/* Affect the execute bits only if at least one execute bit is set already,
|
||||
or if the file is a directory. */
|
||||
#define MODE_X_IF_ANY_X 01
|
||||
# define MODE_X_IF_ANY_X 01
|
||||
|
||||
/* If set, copy some existing permissions for u, g, or o onto the other two.
|
||||
Which of u, g, or o is copied is determined by which bits are set in the
|
||||
`value' field. */
|
||||
#define MODE_COPY_EXISTING 02
|
||||
# define MODE_COPY_EXISTING 02
|
||||
|
||||
struct mode_change
|
||||
{
|
||||
@@ -36,22 +39,27 @@ struct mode_change
|
||||
};
|
||||
|
||||
/* Masks for mode_compile argument. */
|
||||
#define MODE_MASK_EQUALS 1
|
||||
#define MODE_MASK_PLUS 2
|
||||
#define MODE_MASK_MINUS 4
|
||||
# define MODE_MASK_EQUALS 1
|
||||
# define MODE_MASK_PLUS 2
|
||||
# define MODE_MASK_MINUS 4
|
||||
# define MODE_MASK_ALL (MODE_MASK_EQUALS | MODE_MASK_PLUS | MODE_MASK_MINUS)
|
||||
|
||||
/* Error return values for mode_compile. */
|
||||
#define MODE_INVALID (struct mode_change *) 0
|
||||
#define MODE_MEMORY_EXHAUSTED (struct mode_change *) 1
|
||||
# define MODE_INVALID (struct mode_change *) 0
|
||||
# define MODE_MEMORY_EXHAUSTED (struct mode_change *) 1
|
||||
# define MODE_BAD_REFERENCE (struct mode_change *) 2
|
||||
|
||||
#ifndef __P
|
||||
# if defined (__GNUC__) || (defined (__STDC__) && __STDC__)
|
||||
# define __P(Args) Args
|
||||
# else
|
||||
# define __P(Args) ()
|
||||
# ifndef PARAMS
|
||||
# if defined PROTOTYPES || (defined __STDC__ && __STDC__)
|
||||
# define PARAMS(Args) Args
|
||||
# else
|
||||
# define PARAMS(Args) ()
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
struct mode_change *mode_compile __P ((const char *, unsigned));
|
||||
unsigned short mode_adjust __P ((unsigned, const struct mode_change *));
|
||||
void mode_free __P ((struct mode_change *));
|
||||
struct mode_change *mode_compile PARAMS ((const char *, unsigned));
|
||||
struct mode_change *mode_create_from_ref PARAMS ((const char *));
|
||||
unsigned short mode_adjust PARAMS ((unsigned, const struct mode_change *));
|
||||
void mode_free PARAMS ((struct mode_change *));
|
||||
|
||||
#endif
|
||||
|
||||
248
lib/mountlist.c
248
lib/mountlist.c
@@ -1,5 +1,5 @@
|
||||
/* mountlist.c -- return a list of mounted filesystems
|
||||
Copyright (C) 1991, 1992 Free Software Foundation, Inc.
|
||||
Copyright (C) 1991, 1992, 1997, 1998 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -15,8 +15,8 @@
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
@@ -24,79 +24,105 @@
|
||||
#include "mountlist.h"
|
||||
|
||||
#ifdef STDC_HEADERS
|
||||
#include <stdlib.h>
|
||||
# include <stdlib.h>
|
||||
#else
|
||||
void free ();
|
||||
#endif
|
||||
#if defined(STDC_HEADERS) || defined(HAVE_STRING_H)
|
||||
#include <string.h>
|
||||
# include <string.h>
|
||||
#else
|
||||
#include <strings.h>
|
||||
# include <strings.h>
|
||||
#endif
|
||||
|
||||
#ifndef strstr
|
||||
char *strstr ();
|
||||
#endif
|
||||
char *xmalloc ();
|
||||
char *xrealloc ();
|
||||
char *xstrdup ();
|
||||
void error ();
|
||||
|
||||
#ifdef HAVE_SYS_PARAM_H
|
||||
#include <sys/param.h>
|
||||
#include <errno.h>
|
||||
#ifndef errno
|
||||
extern int errno;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_FCNTL_H
|
||||
# include <fcntl.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#if HAVE_SYS_PARAM_H
|
||||
# include <sys/param.h>
|
||||
#endif
|
||||
|
||||
#if defined (MOUNTED_GETFSSTAT) /* __alpha running OSF_1 */
|
||||
# include <sys/mount.h>
|
||||
# include <sys/fs_types.h>
|
||||
# include <sys/mount.h>
|
||||
# include <sys/fs_types.h>
|
||||
#endif /* MOUNTED_GETFSSTAT */
|
||||
|
||||
#ifdef MOUNTED_GETMNTENT1 /* 4.3BSD, SunOS, HP-UX, Dynix, Irix. */
|
||||
#include <mntent.h>
|
||||
#if !defined(MOUNTED)
|
||||
# include <mntent.h>
|
||||
# if !defined(MOUNTED)
|
||||
# if defined(MNT_MNTTAB) /* HP-UX. */
|
||||
# define MOUNTED MNT_MNTTAB
|
||||
# define MOUNTED MNT_MNTTAB
|
||||
# endif
|
||||
# if defined(MNTTABNAME) /* Dynix. */
|
||||
# define MOUNTED MNTTABNAME
|
||||
# define MOUNTED MNTTABNAME
|
||||
# endif
|
||||
#endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef MOUNTED_GETMNTINFO /* 4.4BSD. */
|
||||
#include <sys/mount.h>
|
||||
# include <sys/mount.h>
|
||||
#endif
|
||||
|
||||
#ifdef MOUNTED_GETMNT /* Ultrix. */
|
||||
#include <sys/mount.h>
|
||||
#include <sys/fs_types.h>
|
||||
# include <sys/mount.h>
|
||||
# include <sys/fs_types.h>
|
||||
#endif
|
||||
|
||||
#ifdef MOUNTED_FREAD /* SVR2. */
|
||||
#include <mnttab.h>
|
||||
# include <mnttab.h>
|
||||
#endif
|
||||
|
||||
#ifdef MOUNTED_FREAD_FSTYP /* SVR3. */
|
||||
#include <mnttab.h>
|
||||
#include <sys/fstyp.h>
|
||||
#include <sys/statfs.h>
|
||||
# include <mnttab.h>
|
||||
# include <sys/fstyp.h>
|
||||
# include <sys/statfs.h>
|
||||
#endif
|
||||
|
||||
#ifdef MOUNTED_LISTMNTENT
|
||||
#include <mntent.h>
|
||||
# include <mntent.h>
|
||||
#endif
|
||||
|
||||
#ifdef MOUNTED_GETMNTENT2 /* SVR4. */
|
||||
#include <sys/mnttab.h>
|
||||
# include <sys/mnttab.h>
|
||||
#endif
|
||||
|
||||
#ifdef MOUNTED_VMOUNT /* AIX. */
|
||||
#include <fshelp.h>
|
||||
#include <sys/vfs.h>
|
||||
# include <fshelp.h>
|
||||
# include <sys/vfs.h>
|
||||
#endif
|
||||
|
||||
#ifdef DOLPHIN
|
||||
/* So special that it's not worth putting this in autoconf. */
|
||||
#undef MOUNTED_FREAD_FSTYP
|
||||
#define MOUNTED_GETMNTTBL
|
||||
# undef MOUNTED_FREAD_FSTYP
|
||||
# define MOUNTED_GETMNTTBL
|
||||
#endif
|
||||
|
||||
#if HAVE_SYS_MNTENT_H
|
||||
/* This is to get MNTOPT_IGNORE on e.g. SVR4. */
|
||||
# include <sys/mntent.h>
|
||||
#endif
|
||||
|
||||
#if defined (MNTOPT_IGNORE) && defined (HAVE_HASMNTOPT)
|
||||
# define MNT_IGNORE(M) hasmntopt ((M), MNTOPT_IGNORE)
|
||||
#else
|
||||
# define MNT_IGNORE(M) 0
|
||||
#endif
|
||||
|
||||
#ifdef MOUNTED_GETMNTENT1 /* 4.3BSD, SunOS, HP-UX, Dynix, Irix. */
|
||||
@@ -127,101 +153,115 @@ xatoi (cp)
|
||||
}
|
||||
#endif /* MOUNTED_GETMNTENT1. */
|
||||
|
||||
#if defined (MOUNTED_GETMNTINFO) && !defined (__NetBSD__)
|
||||
#if MOUNTED_GETMNTINFO
|
||||
|
||||
# if ! HAVE_F_FSTYPENAME_IN_STATFS
|
||||
static char *
|
||||
fstype_to_string (t)
|
||||
short t;
|
||||
fstype_to_string (short t)
|
||||
{
|
||||
switch (t)
|
||||
{
|
||||
#ifdef MOUNT_PC
|
||||
# ifdef MOUNT_PC
|
||||
case MOUNT_PC:
|
||||
return "pc";
|
||||
#endif
|
||||
#ifdef MOUNT_MFS
|
||||
# endif
|
||||
# ifdef MOUNT_MFS
|
||||
case MOUNT_MFS:
|
||||
return "mfs";
|
||||
#endif
|
||||
#ifdef MOUNT_LO
|
||||
# endif
|
||||
# ifdef MOUNT_LO
|
||||
case MOUNT_LO:
|
||||
return "lo";
|
||||
#endif
|
||||
#ifdef MOUNT_TFS
|
||||
# endif
|
||||
# ifdef MOUNT_TFS
|
||||
case MOUNT_TFS:
|
||||
return "tfs";
|
||||
#endif
|
||||
#ifdef MOUNT_TMP
|
||||
# endif
|
||||
# ifdef MOUNT_TMP
|
||||
case MOUNT_TMP:
|
||||
return "tmp";
|
||||
#endif
|
||||
#ifdef MOUNT_UFS
|
||||
# endif
|
||||
# ifdef MOUNT_UFS
|
||||
case MOUNT_UFS:
|
||||
return "ufs" ;
|
||||
#endif
|
||||
#ifdef MOUNT_NFS
|
||||
# endif
|
||||
# ifdef MOUNT_NFS
|
||||
case MOUNT_NFS:
|
||||
return "nfs" ;
|
||||
#endif
|
||||
#ifdef MOUNT_MSDOS
|
||||
# endif
|
||||
# ifdef MOUNT_MSDOS
|
||||
case MOUNT_MSDOS:
|
||||
return "msdos" ;
|
||||
#endif
|
||||
#ifdef MOUNT_LFS
|
||||
# endif
|
||||
# ifdef MOUNT_LFS
|
||||
case MOUNT_LFS:
|
||||
return "lfs" ;
|
||||
#endif
|
||||
#ifdef MOUNT_LOFS
|
||||
# endif
|
||||
# ifdef MOUNT_LOFS
|
||||
case MOUNT_LOFS:
|
||||
return "lofs" ;
|
||||
#endif
|
||||
#ifdef MOUNT_FDESC
|
||||
# endif
|
||||
# ifdef MOUNT_FDESC
|
||||
case MOUNT_FDESC:
|
||||
return "fdesc" ;
|
||||
#endif
|
||||
#ifdef MOUNT_PORTAL
|
||||
# endif
|
||||
# ifdef MOUNT_PORTAL
|
||||
case MOUNT_PORTAL:
|
||||
return "portal" ;
|
||||
#endif
|
||||
#ifdef MOUNT_NULL
|
||||
# endif
|
||||
# ifdef MOUNT_NULL
|
||||
case MOUNT_NULL:
|
||||
return "null" ;
|
||||
#endif
|
||||
#ifdef MOUNT_UMAP
|
||||
# endif
|
||||
# ifdef MOUNT_UMAP
|
||||
case MOUNT_UMAP:
|
||||
return "umap" ;
|
||||
#endif
|
||||
#ifdef MOUNT_KERNFS
|
||||
# endif
|
||||
# ifdef MOUNT_KERNFS
|
||||
case MOUNT_KERNFS:
|
||||
return "kernfs" ;
|
||||
#endif
|
||||
#ifdef MOUNT_PROCFS
|
||||
# endif
|
||||
# ifdef MOUNT_PROCFS
|
||||
case MOUNT_PROCFS:
|
||||
return "procfs" ;
|
||||
#endif
|
||||
#ifdef MOUNT_AFS
|
||||
# endif
|
||||
# ifdef MOUNT_AFS
|
||||
case MOUNT_AFS:
|
||||
return "afs" ;
|
||||
#endif
|
||||
#ifdef MOUNT_CD9660
|
||||
# endif
|
||||
# ifdef MOUNT_CD9660
|
||||
case MOUNT_CD9660:
|
||||
return "cd9660" ;
|
||||
#endif
|
||||
#ifdef MOUNT_UNION
|
||||
# endif
|
||||
# ifdef MOUNT_UNION
|
||||
case MOUNT_UNION:
|
||||
return "union" ;
|
||||
#endif
|
||||
#ifdef MOUNT_DEVFS
|
||||
# endif
|
||||
# ifdef MOUNT_DEVFS
|
||||
case MOUNT_DEVFS:
|
||||
return "devfs" ;
|
||||
#endif
|
||||
#ifdef MOUNT_EXT2FS
|
||||
# endif
|
||||
# ifdef MOUNT_EXT2FS
|
||||
case MOUNT_EXT2FS:
|
||||
return "ext2fs" ;
|
||||
#endif
|
||||
# endif
|
||||
default:
|
||||
return "?";
|
||||
}
|
||||
}
|
||||
# endif /* ! HAVE_F_FSTYPENAME_IN_STATFS */
|
||||
|
||||
/* __NetBSD__ || BSD_NET2 || __OpenBSD__ */
|
||||
static char *
|
||||
fsp_to_string (const struct statfs *fsp)
|
||||
{
|
||||
# if defined HAVE_F_FSTYPENAME_IN_STATFS
|
||||
return xstrdup (fsp->f_fstypename);
|
||||
# else
|
||||
return fstype_to_string (fsp->f_type);
|
||||
# endif
|
||||
}
|
||||
|
||||
#endif /* MOUNTED_GETMNTINFO */
|
||||
|
||||
#ifdef MOUNTED_VMOUNT /* AIX. */
|
||||
@@ -264,7 +304,7 @@ read_filesystem_list (need_fs_type, all_fs)
|
||||
struct tabmntent *mntlist, *p;
|
||||
struct mntent *mnt;
|
||||
struct mount_entry *me;
|
||||
|
||||
|
||||
/* the third and fourth arguments could be used to filter mounts,
|
||||
but Crays doesn't seem to have any mounts that we want to
|
||||
remove. Specifically, automount create normal NFS mounts.
|
||||
@@ -345,11 +385,7 @@ read_filesystem_list (need_fs_type, all_fs)
|
||||
me = (struct mount_entry *) xmalloc (sizeof (struct mount_entry));
|
||||
me->me_devname = xstrdup (fsp->f_mntfromname);
|
||||
me->me_mountdir = xstrdup (fsp->f_mntonname);
|
||||
#ifdef __NetBSD__
|
||||
me->me_type = xstrdup (fsp->f_fstypename);
|
||||
#else
|
||||
me->me_type = fstype_to_string (fsp->f_type);
|
||||
#endif
|
||||
me->me_type = fsp_to_string (fsp);
|
||||
me->me_dev = (dev_t) -1; /* Magic; means not known yet. */
|
||||
me->me_next = NULL;
|
||||
|
||||
@@ -436,17 +472,17 @@ read_filesystem_list (need_fs_type, all_fs)
|
||||
while (fread (&mnt, sizeof mnt, 1, fp) > 0)
|
||||
{
|
||||
me = (struct mount_entry *) xmalloc (sizeof (struct mount_entry));
|
||||
#ifdef GETFSTYP /* SVR3. */
|
||||
# ifdef GETFSTYP /* SVR3. */
|
||||
me->me_devname = xstrdup (mnt.mt_dev);
|
||||
#else
|
||||
# else
|
||||
me->me_devname = xmalloc (strlen (mnt.mt_dev) + 6);
|
||||
strcpy (me->me_devname, "/dev/");
|
||||
strcpy (me->me_devname + 5, mnt.mt_dev);
|
||||
#endif
|
||||
# endif
|
||||
me->me_mountdir = xstrdup (mnt.mt_filsys);
|
||||
me->me_dev = (dev_t) -1; /* Magic; means not known yet. */
|
||||
me->me_type = "";
|
||||
#ifdef GETFSTYP /* SVR3. */
|
||||
# ifdef GETFSTYP /* SVR3. */
|
||||
if (need_fs_type)
|
||||
{
|
||||
struct statfs fsd;
|
||||
@@ -456,7 +492,7 @@ read_filesystem_list (need_fs_type, all_fs)
|
||||
&& sysfs (GETFSTYP, fsd.f_fstyp, typebuf) != -1)
|
||||
me->me_type = xstrdup (typebuf);
|
||||
}
|
||||
#endif
|
||||
# endif
|
||||
me->me_next = NULL;
|
||||
|
||||
/* Add to the linked list. */
|
||||
@@ -495,13 +531,46 @@ read_filesystem_list (need_fs_type, all_fs)
|
||||
char *table = MNTTAB;
|
||||
FILE *fp;
|
||||
int ret;
|
||||
int lockfd = -1;
|
||||
int fail = 0;
|
||||
|
||||
# if defined F_RDLCK && defined F_SETLKW
|
||||
/* MNTTAB_LOCK is a macro name of our own invention; it's not present in
|
||||
e.g. Solaris 2.6. If the SVR4 folks ever define a macro
|
||||
for this file name, we should use their macro name instead.
|
||||
(Why not just lock MNTTAB directly? We don't know.) */
|
||||
# ifndef MNTTAB_LOCK
|
||||
# define MNTTAB_LOCK "/etc/.mnttab.lock"
|
||||
# endif
|
||||
lockfd = open (MNTTAB_LOCK, O_RDONLY);
|
||||
if (0 <= lockfd)
|
||||
{
|
||||
struct flock flock;
|
||||
flock.l_type = F_RDLCK;
|
||||
flock.l_whence = SEEK_SET;
|
||||
flock.l_start = 0;
|
||||
flock.l_len = 0;
|
||||
while (fcntl (lockfd, F_SETLKW, &flock) == -1)
|
||||
if (errno != EINTR)
|
||||
return NULL;
|
||||
}
|
||||
# endif
|
||||
|
||||
fp = fopen (table, "r");
|
||||
if (fp == NULL)
|
||||
return NULL;
|
||||
{
|
||||
/* FIXME maybe: this close could clobber errno from fopen failure. */
|
||||
if (0 <= lockfd)
|
||||
close (lockfd);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
while ((ret = getmntent (fp, &mnt)) == 0)
|
||||
{
|
||||
/* Don't show automounted filesystems twice on e.g., Solaris. */
|
||||
if (!all_fs && MNT_IGNORE (&mnt))
|
||||
continue;
|
||||
|
||||
me = (struct mount_entry *) xmalloc (sizeof (struct mount_entry));
|
||||
me->me_devname = xstrdup (mnt.mnt_special);
|
||||
me->me_mountdir = xstrdup (mnt.mnt_mountp);
|
||||
@@ -515,8 +584,13 @@ read_filesystem_list (need_fs_type, all_fs)
|
||||
}
|
||||
|
||||
if (ret > 0)
|
||||
return NULL;
|
||||
if (fclose (fp) == EOF)
|
||||
fail = 1;
|
||||
if (fclose (fp) == EOF)
|
||||
fail = 1;
|
||||
if (0 <= lockfd && close (lockfd) != 0)
|
||||
fail = 1;
|
||||
|
||||
if (fail)
|
||||
return NULL;
|
||||
}
|
||||
#endif /* MOUNTED_GETMNTENT2. */
|
||||
|
||||
177
lib/obstack.c
177
lib/obstack.c
@@ -1,19 +1,23 @@
|
||||
/* obstack.c - subroutines used implicitly by object stack macros
|
||||
Copyright (C) 1988,89,90,91,92,93,94,96 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
This file is part of the GNU C Library. Its master source is NOT part of
|
||||
the C library, however. The master source lives in /gd/gnu/lib.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include "obstack.h"
|
||||
|
||||
@@ -52,7 +56,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
/* Determine default alignment. */
|
||||
struct fooalign {char x; double d;};
|
||||
#define DEFAULT_ALIGNMENT \
|
||||
((PTR_INT_TYPE) ((char *)&((struct fooalign *) 0)->d - (char *)0))
|
||||
((PTR_INT_TYPE) ((char *) &((struct fooalign *) 0)->d - (char *) 0))
|
||||
/* If malloc were really smart, it would round addresses to DEFAULT_ALIGNMENT.
|
||||
But in fact it might be less smart and round addresses to as much as
|
||||
DEFAULT_ROUNDING. So we prepare for it to do that. */
|
||||
@@ -67,6 +71,28 @@ union fooround {long x; double d;};
|
||||
#define COPYING_UNIT int
|
||||
#endif
|
||||
|
||||
|
||||
/* The functions allocating more room by calling `obstack_chunk_alloc'
|
||||
jump to the handler pointed to by `obstack_alloc_failed_handler'.
|
||||
This variable by default points to the internal function
|
||||
`print_and_abort'. */
|
||||
#if defined (__STDC__) && __STDC__
|
||||
static void print_and_abort (void);
|
||||
void (*obstack_alloc_failed_handler) (void) = print_and_abort;
|
||||
#else
|
||||
static void print_and_abort ();
|
||||
void (*obstack_alloc_failed_handler) () = print_and_abort;
|
||||
#endif
|
||||
|
||||
/* Exit value used when `print_and_abort' is used. */
|
||||
#if defined __GNU_LIBRARY__ || defined HAVE_STDLIB_H
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
#ifndef EXIT_FAILURE
|
||||
#define EXIT_FAILURE 1
|
||||
#endif
|
||||
int obstack_exit_failure = EXIT_FAILURE;
|
||||
|
||||
/* The non-GNU-C macros copy the obstack into this global variable
|
||||
to avoid multiple evaluation. */
|
||||
|
||||
@@ -78,6 +104,20 @@ struct obstack *_obstack;
|
||||
For free, do not use ?:, since some compilers, like the MIPS compilers,
|
||||
do not allow (expr) ? void : void. */
|
||||
|
||||
#if defined (__STDC__) && __STDC__
|
||||
#define CALL_CHUNKFUN(h, size) \
|
||||
(((h) -> use_extra_arg) \
|
||||
? (*(h)->chunkfun) ((h)->extra_arg, (size)) \
|
||||
: (*(struct _obstack_chunk *(*) (long)) (h)->chunkfun) ((size)))
|
||||
|
||||
#define CALL_FREEFUN(h, old_chunk) \
|
||||
do { \
|
||||
if ((h) -> use_extra_arg) \
|
||||
(*(h)->freefun) ((h)->extra_arg, (old_chunk)); \
|
||||
else \
|
||||
(*(void (*) (void *)) (h)->freefun) ((old_chunk)); \
|
||||
} while (0)
|
||||
#else
|
||||
#define CALL_CHUNKFUN(h, size) \
|
||||
(((h) -> use_extra_arg) \
|
||||
? (*(h)->chunkfun) ((h)->extra_arg, (size)) \
|
||||
@@ -90,6 +130,7 @@ struct obstack *_obstack;
|
||||
else \
|
||||
(*(void (*) ()) (h)->freefun) ((old_chunk)); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
|
||||
/* Initialize an obstack H for use. Specify chunk size SIZE (0 means default).
|
||||
@@ -106,10 +147,15 @@ _obstack_begin (h, size, alignment, chunkfun, freefun)
|
||||
struct obstack *h;
|
||||
int size;
|
||||
int alignment;
|
||||
#if defined (__STDC__) && __STDC__
|
||||
POINTER (*chunkfun) (long);
|
||||
void (*freefun) (void *);
|
||||
#else
|
||||
POINTER (*chunkfun) ();
|
||||
void (*freefun) ();
|
||||
#endif
|
||||
{
|
||||
register struct _obstack_chunk* chunk; /* points to new chunk */
|
||||
register struct _obstack_chunk *chunk; /* points to new chunk */
|
||||
|
||||
if (alignment == 0)
|
||||
alignment = DEFAULT_ALIGNMENT;
|
||||
@@ -130,25 +176,27 @@ _obstack_begin (h, size, alignment, chunkfun, freefun)
|
||||
size = 4096 - extra;
|
||||
}
|
||||
|
||||
#if defined (__STDC__) && __STDC__
|
||||
h->chunkfun = (struct _obstack_chunk * (*)(void *, long)) chunkfun;
|
||||
h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun;
|
||||
#else
|
||||
h->chunkfun = (struct _obstack_chunk * (*)()) chunkfun;
|
||||
h->freefun = freefun;
|
||||
#endif
|
||||
h->chunk_size = size;
|
||||
h->alignment_mask = alignment - 1;
|
||||
h->use_extra_arg = 0;
|
||||
|
||||
chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size);
|
||||
if (!chunk)
|
||||
{
|
||||
h->alloc_failed = 1;
|
||||
return 0;
|
||||
}
|
||||
h->alloc_failed = 0;
|
||||
(*obstack_alloc_failed_handler) ();
|
||||
h->next_free = h->object_base = chunk->contents;
|
||||
h->chunk_limit = chunk->limit
|
||||
= (char *) chunk + h->chunk_size;
|
||||
chunk->prev = 0;
|
||||
/* The initial chunk now contains no empty object. */
|
||||
h->maybe_empty_object = 0;
|
||||
h->alloc_failed = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -157,11 +205,16 @@ _obstack_begin_1 (h, size, alignment, chunkfun, freefun, arg)
|
||||
struct obstack *h;
|
||||
int size;
|
||||
int alignment;
|
||||
#if defined (__STDC__) && __STDC__
|
||||
POINTER (*chunkfun) (POINTER, long);
|
||||
void (*freefun) (POINTER, POINTER);
|
||||
#else
|
||||
POINTER (*chunkfun) ();
|
||||
void (*freefun) ();
|
||||
#endif
|
||||
POINTER arg;
|
||||
{
|
||||
register struct _obstack_chunk* chunk; /* points to new chunk */
|
||||
register struct _obstack_chunk *chunk; /* points to new chunk */
|
||||
|
||||
if (alignment == 0)
|
||||
alignment = DEFAULT_ALIGNMENT;
|
||||
@@ -182,8 +235,13 @@ _obstack_begin_1 (h, size, alignment, chunkfun, freefun, arg)
|
||||
size = 4096 - extra;
|
||||
}
|
||||
|
||||
#if defined(__STDC__) && __STDC__
|
||||
h->chunkfun = (struct _obstack_chunk * (*)(void *,long)) chunkfun;
|
||||
h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun;
|
||||
#else
|
||||
h->chunkfun = (struct _obstack_chunk * (*)()) chunkfun;
|
||||
h->freefun = freefun;
|
||||
#endif
|
||||
h->chunk_size = size;
|
||||
h->alignment_mask = alignment - 1;
|
||||
h->extra_arg = arg;
|
||||
@@ -191,17 +249,14 @@ _obstack_begin_1 (h, size, alignment, chunkfun, freefun, arg)
|
||||
|
||||
chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size);
|
||||
if (!chunk)
|
||||
{
|
||||
h->alloc_failed = 1;
|
||||
return 0;
|
||||
}
|
||||
h->alloc_failed = 0;
|
||||
(*obstack_alloc_failed_handler) ();
|
||||
h->next_free = h->object_base = chunk->contents;
|
||||
h->chunk_limit = chunk->limit
|
||||
= (char *) chunk + h->chunk_size;
|
||||
chunk->prev = 0;
|
||||
/* The initial chunk now contains no empty object. */
|
||||
h->maybe_empty_object = 0;
|
||||
h->alloc_failed = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -216,8 +271,8 @@ _obstack_newchunk (h, length)
|
||||
struct obstack *h;
|
||||
int length;
|
||||
{
|
||||
register struct _obstack_chunk* old_chunk = h->chunk;
|
||||
register struct _obstack_chunk* new_chunk;
|
||||
register struct _obstack_chunk *old_chunk = h->chunk;
|
||||
register struct _obstack_chunk *new_chunk;
|
||||
register long new_size;
|
||||
register int obj_size = h->next_free - h->object_base;
|
||||
register int i;
|
||||
@@ -231,11 +286,7 @@ _obstack_newchunk (h, length)
|
||||
/* Allocate and initialize the new chunk. */
|
||||
new_chunk = CALL_CHUNKFUN (h, new_size);
|
||||
if (!new_chunk)
|
||||
{
|
||||
h->alloc_failed = 1;
|
||||
return;
|
||||
}
|
||||
h->alloc_failed = 0;
|
||||
(*obstack_alloc_failed_handler) ();
|
||||
h->chunk = new_chunk;
|
||||
new_chunk->prev = old_chunk;
|
||||
new_chunk->limit = h->chunk_limit = (char *) new_chunk + new_size;
|
||||
@@ -290,14 +341,14 @@ _obstack_allocated_p (h, obj)
|
||||
struct obstack *h;
|
||||
POINTER obj;
|
||||
{
|
||||
register struct _obstack_chunk* lp; /* below addr of any objects in this chunk */
|
||||
register struct _obstack_chunk* plp; /* point to previous chunk if any */
|
||||
register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */
|
||||
register struct _obstack_chunk *plp; /* point to previous chunk if any */
|
||||
|
||||
lp = (h)->chunk;
|
||||
/* We use >= rather than > since the object cannot be exactly at
|
||||
the beginning of the chunk but might be an empty object exactly
|
||||
at the end of an adjacent chunk. */
|
||||
while (lp != 0 && ((POINTER)lp >= obj || (POINTER)(lp)->limit < obj))
|
||||
at the end of an adjacent chunk. */
|
||||
while (lp != 0 && ((POINTER) lp >= obj || (POINTER) (lp)->limit < obj))
|
||||
{
|
||||
plp = lp->prev;
|
||||
lp = plp;
|
||||
@@ -318,14 +369,14 @@ _obstack_free (h, obj)
|
||||
struct obstack *h;
|
||||
POINTER obj;
|
||||
{
|
||||
register struct _obstack_chunk* lp; /* below addr of any objects in this chunk */
|
||||
register struct _obstack_chunk* plp; /* point to previous chunk if any */
|
||||
register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */
|
||||
register struct _obstack_chunk *plp; /* point to previous chunk if any */
|
||||
|
||||
lp = h->chunk;
|
||||
/* We use >= because there cannot be an object at the beginning of a chunk.
|
||||
But there can be an empty object at that address
|
||||
at the end of another chunk. */
|
||||
while (lp != 0 && ((POINTER)lp >= obj || (POINTER)(lp)->limit < obj))
|
||||
while (lp != 0 && ((POINTER) lp >= obj || (POINTER) (lp)->limit < obj))
|
||||
{
|
||||
plp = lp->prev;
|
||||
CALL_FREEFUN (h, lp);
|
||||
@@ -336,7 +387,7 @@ _obstack_free (h, obj)
|
||||
}
|
||||
if (lp)
|
||||
{
|
||||
h->object_base = h->next_free = (char *)(obj);
|
||||
h->object_base = h->next_free = (char *) (obj);
|
||||
h->chunk_limit = lp->limit;
|
||||
h->chunk = lp;
|
||||
}
|
||||
@@ -352,14 +403,14 @@ obstack_free (h, obj)
|
||||
struct obstack *h;
|
||||
POINTER obj;
|
||||
{
|
||||
register struct _obstack_chunk* lp; /* below addr of any objects in this chunk */
|
||||
register struct _obstack_chunk* plp; /* point to previous chunk if any */
|
||||
register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */
|
||||
register struct _obstack_chunk *plp; /* point to previous chunk if any */
|
||||
|
||||
lp = h->chunk;
|
||||
/* We use >= because there cannot be an object at the beginning of a chunk.
|
||||
But there can be an empty object at that address
|
||||
at the end of another chunk. */
|
||||
while (lp != 0 && ((POINTER)lp >= obj || (POINTER)(lp)->limit < obj))
|
||||
while (lp != 0 && ((POINTER) lp >= obj || (POINTER) (lp)->limit < obj))
|
||||
{
|
||||
plp = lp->prev;
|
||||
CALL_FREEFUN (h, lp);
|
||||
@@ -370,7 +421,7 @@ obstack_free (h, obj)
|
||||
}
|
||||
if (lp)
|
||||
{
|
||||
h->object_base = h->next_free = (char *)(obj);
|
||||
h->object_base = h->next_free = (char *) (obj);
|
||||
h->chunk_limit = lp->limit;
|
||||
h->chunk = lp;
|
||||
}
|
||||
@@ -379,6 +430,39 @@ obstack_free (h, obj)
|
||||
abort ();
|
||||
}
|
||||
|
||||
int
|
||||
_obstack_memory_used (h)
|
||||
struct obstack *h;
|
||||
{
|
||||
register struct _obstack_chunk* lp;
|
||||
register int nbytes = 0;
|
||||
|
||||
for (lp = h->chunk; lp != 0; lp = lp->prev)
|
||||
{
|
||||
nbytes += lp->limit - (char *) lp;
|
||||
}
|
||||
return nbytes;
|
||||
}
|
||||
|
||||
/* Define the error handler. */
|
||||
#ifndef _
|
||||
# ifdef HAVE_LIBINTL_H
|
||||
# include <libintl.h>
|
||||
# ifndef _
|
||||
# define _(Str) gettext (Str)
|
||||
# endif
|
||||
# else
|
||||
# define _(Str) (Str)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
static void
|
||||
print_and_abort ()
|
||||
{
|
||||
fputs (_("memory exhausted\n"), stderr);
|
||||
exit (obstack_exit_failure);
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* These are now turned off because the applications do not use it
|
||||
and it uses bcopy via obstack_grow, which causes trouble on sysV. */
|
||||
@@ -417,6 +501,13 @@ int (obstack_room) (obstack)
|
||||
return obstack_room (obstack);
|
||||
}
|
||||
|
||||
int (obstack_make_room) (obstack, length)
|
||||
struct obstack *obstack;
|
||||
int length;
|
||||
{
|
||||
return obstack_make_room (obstack, length);
|
||||
}
|
||||
|
||||
void (obstack_grow) (obstack, pointer, length)
|
||||
struct obstack *obstack;
|
||||
POINTER pointer;
|
||||
|
||||
235
lib/obstack.h
235
lib/obstack.h
@@ -1,19 +1,25 @@
|
||||
/* obstack.h - object stack macros
|
||||
Copyright (C) 1988,89,90,91,92,93,94,96 Free Software Foundation, Inc.
|
||||
Copyright (C) 1988,89,90,91,92,93,94,96,97 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
the C library, however. The master source lives in /gd/gnu/lib.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
NOTE: The canonical source of this file is maintained with the GNU C Library.
|
||||
Bugs can be reported to bug-glibc@prep.ai.mit.edu.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
USA. */
|
||||
|
||||
/* Summary:
|
||||
|
||||
@@ -100,28 +106,23 @@ Summary:
|
||||
|
||||
/* Don't do the contents of this file more than once. */
|
||||
|
||||
#ifndef __OBSTACK_H__
|
||||
#define __OBSTACK_H__
|
||||
#ifndef _OBSTACK_H
|
||||
#define _OBSTACK_H 1
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#if !defined (HAVE_BCOPY) && defined (HAVE_MEMCPY) && !defined (bcopy)
|
||||
# define bcopy(from, to, len) memcpy ((to), (from), (len))
|
||||
#endif
|
||||
|
||||
|
||||
/* We use subtraction of (char *)0 instead of casting to int
|
||||
/* We use subtraction of (char *) 0 instead of casting to int
|
||||
because on word-addressable machines a simple cast to int
|
||||
may ignore the byte-within-word field of the pointer. */
|
||||
|
||||
#ifndef __PTR_TO_INT
|
||||
#define __PTR_TO_INT(P) ((P) - (char *)0)
|
||||
#define __PTR_TO_INT(P) ((P) - (char *) 0)
|
||||
#endif
|
||||
|
||||
#ifndef __INT_TO_PTR
|
||||
#define __INT_TO_PTR(P) ((P) + (char *)0)
|
||||
#define __INT_TO_PTR(P) ((P) + (char *) 0)
|
||||
#endif
|
||||
|
||||
/* We need the type of the resulting object. In ANSI C it is ptrdiff_t
|
||||
@@ -141,18 +142,23 @@ Summary:
|
||||
#include <stddef.h>
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifndef HAVE_PTRDIFF_T
|
||||
# define ptrdiff_t off_t
|
||||
#endif
|
||||
|
||||
#if defined (__STDC__) && __STDC__
|
||||
#define PTR_INT_TYPE ptrdiff_t
|
||||
#else
|
||||
#define PTR_INT_TYPE long
|
||||
#endif
|
||||
|
||||
#if defined (_LIBC) || defined (HAVE_STRING_H)
|
||||
#include <string.h>
|
||||
#define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N))
|
||||
#else
|
||||
#ifdef memcpy
|
||||
#define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N))
|
||||
#else
|
||||
#define _obstack_memcpy(To, From, N) bcopy ((From), (To), (N))
|
||||
#endif
|
||||
#endif
|
||||
|
||||
struct _obstack_chunk /* Lives at front of each chunk. */
|
||||
{
|
||||
char *limit; /* 1 past end of this chunk */
|
||||
@@ -163,7 +169,7 @@ struct _obstack_chunk /* Lives at front of each chunk. */
|
||||
struct obstack /* control current object in current chunk */
|
||||
{
|
||||
long chunk_size; /* preferred size to allocate chunks in */
|
||||
struct _obstack_chunk* chunk; /* address of current struct obstack_chunk */
|
||||
struct _obstack_chunk *chunk; /* address of current struct obstack_chunk */
|
||||
char *object_base; /* address of object we are building */
|
||||
char *next_free; /* where to add next char to current object */
|
||||
char *chunk_limit; /* address of char after current chunk */
|
||||
@@ -175,7 +181,7 @@ struct obstack /* control current object in current chunk */
|
||||
but having prototypes here quiets -Wstrict-prototypes. */
|
||||
struct _obstack_chunk *(*chunkfun) (void *, long);
|
||||
void (*freefun) (void *, struct _obstack_chunk *);
|
||||
void *extra_arg; /* first arg for chunk alloc/dealloc funcs */
|
||||
void *extra_arg; /* first arg for chunk alloc/dealloc funcs */
|
||||
#else
|
||||
struct _obstack_chunk *(*chunkfun) (); /* User's fcn to allocate a chunk. */
|
||||
void (*freefun) (); /* User's function to free a chunk. */
|
||||
@@ -186,7 +192,9 @@ struct obstack /* control current object in current chunk */
|
||||
chunk contains a zero-length object. This
|
||||
prevents freeing the chunk if we allocate
|
||||
a bigger chunk to replace it. */
|
||||
unsigned alloc_failed:1; /* chunk alloc func returned 0 */
|
||||
unsigned alloc_failed:1; /* No longer used, as we now call the failed
|
||||
handler on error, but retained for binary
|
||||
compatibility. */
|
||||
};
|
||||
|
||||
/* Declare the external functions we use; they are in obstack.c. */
|
||||
@@ -199,11 +207,13 @@ extern int _obstack_begin (struct obstack *, int, int,
|
||||
extern int _obstack_begin_1 (struct obstack *, int, int,
|
||||
void *(*) (void *, long),
|
||||
void (*) (void *, void *), void *);
|
||||
extern int _obstack_memory_used (struct obstack *);
|
||||
#else
|
||||
extern void _obstack_newchunk ();
|
||||
extern void _obstack_free ();
|
||||
extern int _obstack_begin ();
|
||||
extern int _obstack_begin_1 ();
|
||||
extern int _obstack_memory_used ();
|
||||
#endif
|
||||
|
||||
#if defined (__STDC__) && __STDC__
|
||||
@@ -234,6 +244,7 @@ void * obstack_finish (struct obstack *obstack);
|
||||
int obstack_object_size (struct obstack *obstack);
|
||||
|
||||
int obstack_room (struct obstack *obstack);
|
||||
void obstack_make_room (struct obstack *obstack, int size);
|
||||
void obstack_1grow_fast (struct obstack *obstack, int data_char);
|
||||
void obstack_ptr_grow_fast (struct obstack *obstack, void *data);
|
||||
void obstack_int_grow_fast (struct obstack *obstack, int data);
|
||||
@@ -243,17 +254,30 @@ void * obstack_base (struct obstack *obstack);
|
||||
void * obstack_next_free (struct obstack *obstack);
|
||||
int obstack_alignment_mask (struct obstack *obstack);
|
||||
int obstack_chunk_size (struct obstack *obstack);
|
||||
int obstack_memory_used (struct obstack *obstack);
|
||||
|
||||
#endif /* __STDC__ */
|
||||
|
||||
/* Non-ANSI C cannot really support alternative functions for these macros,
|
||||
so we do not declare them. */
|
||||
|
||||
/* Error handler called when `obstack_chunk_alloc' failed to allocate
|
||||
more memory. This can be set to a user defined function. The
|
||||
default action is to print a message and abort. */
|
||||
#if defined (__STDC__) && __STDC__
|
||||
extern void (*obstack_alloc_failed_handler) (void);
|
||||
#else
|
||||
extern void (*obstack_alloc_failed_handler) ();
|
||||
#endif
|
||||
|
||||
/* Exit value used when `print_and_abort' is used. */
|
||||
extern int obstack_exit_failure;
|
||||
|
||||
/* Pointer to beginning of object being allocated or to be allocated next.
|
||||
Note that this might not be the final address of the object
|
||||
because a new chunk might be needed to hold the final size. */
|
||||
|
||||
#define obstack_base(h) ((h)->alloc_failed ? 0 : (h)->object_base)
|
||||
#define obstack_base(h) ((h)->object_base)
|
||||
|
||||
/* Size for allocating ordinary chunks. */
|
||||
|
||||
@@ -261,7 +285,7 @@ int obstack_chunk_size (struct obstack *obstack);
|
||||
|
||||
/* Pointer to next byte not yet allocated in current chunk. */
|
||||
|
||||
#define obstack_next_free(h) ((h)->alloc_failed ? 0 : (h)->next_free)
|
||||
#define obstack_next_free(h) ((h)->next_free)
|
||||
|
||||
/* Mask specifying low bits that should be clear in address of an object. */
|
||||
|
||||
@@ -273,25 +297,26 @@ int obstack_chunk_size (struct obstack *obstack);
|
||||
|
||||
#define obstack_init(h) \
|
||||
_obstack_begin ((h), 0, 0, \
|
||||
(void *(*) (long)) obstack_chunk_alloc, (void (*) (void *)) obstack_chunk_free)
|
||||
(void *(*) (long)) obstack_chunk_alloc, (void (*) (void *)) obstack_chunk_free)
|
||||
|
||||
#define obstack_begin(h, size) \
|
||||
_obstack_begin ((h), (size), 0, \
|
||||
(void *(*) (long)) obstack_chunk_alloc, (void (*) (void *)) obstack_chunk_free)
|
||||
(void *(*) (long)) obstack_chunk_alloc, (void (*) (void *)) obstack_chunk_free)
|
||||
|
||||
#define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \
|
||||
_obstack_begin ((h), (size), (alignment), \
|
||||
(void *(*) (long)) (chunkfun), (void (*) (void *)) (freefun))
|
||||
(void *(*) (long)) (chunkfun), (void (*) (void *)) (freefun))
|
||||
|
||||
#define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \
|
||||
_obstack_begin_1 ((h), (size), (alignment), \
|
||||
(void *(*) (long)) (chunkfun), (void (*) (void *)) (freefun), (arg))
|
||||
(void *(*) (void *, long)) (chunkfun), \
|
||||
(void (*) (void *, void *)) (freefun), (arg))
|
||||
|
||||
#define obstack_chunkfun(h, newchunkfun) \
|
||||
((h) -> chunkfun = (struct _obstack_chunk *(*)(long)) (newchunkfun))
|
||||
((h) -> chunkfun = (struct _obstack_chunk *(*)(void *, long)) (newchunkfun))
|
||||
|
||||
#define obstack_freefun(h, newfreefun) \
|
||||
((h) -> freefun = (void (*)(void *)) (newfreefun))
|
||||
((h) -> freefun = (void (*)(void *, struct _obstack_chunk *)) (newfreefun))
|
||||
|
||||
#else
|
||||
|
||||
@@ -322,6 +347,8 @@ int obstack_chunk_size (struct obstack *obstack);
|
||||
#define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = achar)
|
||||
|
||||
#define obstack_blank_fast(h,n) ((h)->next_free += (n))
|
||||
|
||||
#define obstack_memory_used(h) _obstack_memory_used (h)
|
||||
|
||||
#if defined (__GNUC__) && defined (__STDC__) && __STDC__
|
||||
/* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and
|
||||
@@ -339,7 +366,6 @@ int obstack_chunk_size (struct obstack *obstack);
|
||||
#define obstack_object_size(OBSTACK) \
|
||||
__extension__ \
|
||||
({ struct obstack *__o = (OBSTACK); \
|
||||
__o->alloc_failed ? 0 : \
|
||||
(unsigned) (__o->next_free - __o->object_base); })
|
||||
|
||||
#define obstack_room(OBSTACK) \
|
||||
@@ -347,17 +373,27 @@ int obstack_chunk_size (struct obstack *obstack);
|
||||
({ struct obstack *__o = (OBSTACK); \
|
||||
(unsigned) (__o->chunk_limit - __o->next_free); })
|
||||
|
||||
#define obstack_make_room(OBSTACK,length) \
|
||||
__extension__ \
|
||||
({ struct obstack *__o = (OBSTACK); \
|
||||
int __len = (length); \
|
||||
if (__o->chunk_limit - __o->next_free < __len) \
|
||||
_obstack_newchunk (__o, __len); \
|
||||
(void) 0; })
|
||||
|
||||
#define obstack_empty_p(OBSTACK) \
|
||||
__extension__ \
|
||||
({ struct obstack *__o = (OBSTACK); \
|
||||
(__o->chunk->prev == 0 && __o->next_free - __o->chunk->contents == 0); })
|
||||
|
||||
#define obstack_grow(OBSTACK,where,length) \
|
||||
__extension__ \
|
||||
({ struct obstack *__o = (OBSTACK); \
|
||||
int __len = (length); \
|
||||
if (__o->next_free + __len > __o->chunk_limit) \
|
||||
_obstack_newchunk (__o, __len); \
|
||||
if (!__o->alloc_failed) \
|
||||
{ \
|
||||
bcopy ((char *) (where), __o->next_free, __len); \
|
||||
__o->next_free += __len; \
|
||||
} \
|
||||
_obstack_memcpy (__o->next_free, (char *) (where), __len); \
|
||||
__o->next_free += __len; \
|
||||
(void) 0; })
|
||||
|
||||
#define obstack_grow0(OBSTACK,where,length) \
|
||||
@@ -366,12 +402,9 @@ __extension__ \
|
||||
int __len = (length); \
|
||||
if (__o->next_free + __len + 1 > __o->chunk_limit) \
|
||||
_obstack_newchunk (__o, __len + 1); \
|
||||
if (!__o->alloc_failed) \
|
||||
{ \
|
||||
bcopy ((char *) (where), __o->next_free, __len); \
|
||||
__o->next_free += __len; \
|
||||
*(__o->next_free)++ = 0; \
|
||||
} \
|
||||
_obstack_memcpy (__o->next_free, (char *) (where), __len); \
|
||||
__o->next_free += __len; \
|
||||
*(__o->next_free)++ = 0; \
|
||||
(void) 0; })
|
||||
|
||||
#define obstack_1grow(OBSTACK,datum) \
|
||||
@@ -379,8 +412,7 @@ __extension__ \
|
||||
({ struct obstack *__o = (OBSTACK); \
|
||||
if (__o->next_free + 1 > __o->chunk_limit) \
|
||||
_obstack_newchunk (__o, 1); \
|
||||
if (!__o->alloc_failed) \
|
||||
*(__o->next_free)++ = (datum); \
|
||||
*(__o->next_free)++ = (datum); \
|
||||
(void) 0; })
|
||||
|
||||
/* These assume that the obstack alignment is good enough for pointers or ints,
|
||||
@@ -392,8 +424,7 @@ __extension__ \
|
||||
({ struct obstack *__o = (OBSTACK); \
|
||||
if (__o->next_free + sizeof (void *) > __o->chunk_limit) \
|
||||
_obstack_newchunk (__o, sizeof (void *)); \
|
||||
if (!__o->alloc_failed) \
|
||||
*((void **)__o->next_free)++ = ((void *)datum); \
|
||||
*((void **)__o->next_free)++ = ((void *)datum); \
|
||||
(void) 0; })
|
||||
|
||||
#define obstack_int_grow(OBSTACK,datum) \
|
||||
@@ -401,12 +432,11 @@ __extension__ \
|
||||
({ struct obstack *__o = (OBSTACK); \
|
||||
if (__o->next_free + sizeof (int) > __o->chunk_limit) \
|
||||
_obstack_newchunk (__o, sizeof (int)); \
|
||||
if (!__o->alloc_failed) \
|
||||
*((int *)__o->next_free)++ = ((int)datum); \
|
||||
*((int *)__o->next_free)++ = ((int)datum); \
|
||||
(void) 0; })
|
||||
|
||||
#define obstack_ptr_grow_fast(h,aptr) (*((void **)(h)->next_free)++ = (void *)aptr)
|
||||
#define obstack_int_grow_fast(h,aint) (*((int *)(h)->next_free)++ = (int)aint)
|
||||
#define obstack_ptr_grow_fast(h,aptr) (*((void **) (h)->next_free)++ = (void *)aptr)
|
||||
#define obstack_int_grow_fast(h,aint) (*((int *) (h)->next_free)++ = (int) aint)
|
||||
|
||||
#define obstack_blank(OBSTACK,length) \
|
||||
__extension__ \
|
||||
@@ -414,8 +444,7 @@ __extension__ \
|
||||
int __len = (length); \
|
||||
if (__o->chunk_limit - __o->next_free < __len) \
|
||||
_obstack_newchunk (__o, __len); \
|
||||
if (!__o->alloc_failed) \
|
||||
__o->next_free += __len; \
|
||||
__o->next_free += __len; \
|
||||
(void) 0; })
|
||||
|
||||
#define obstack_alloc(OBSTACK,length) \
|
||||
@@ -442,21 +471,16 @@ __extension__ \
|
||||
__extension__ \
|
||||
({ struct obstack *__o1 = (OBSTACK); \
|
||||
void *value; \
|
||||
if (__o1->alloc_failed) \
|
||||
value = 0; \
|
||||
else \
|
||||
{ \
|
||||
value = (void *) __o1->object_base; \
|
||||
if (__o1->next_free == value) \
|
||||
__o1->maybe_empty_object = 1; \
|
||||
__o1->next_free \
|
||||
= __INT_TO_PTR ((__PTR_TO_INT (__o1->next_free)+__o1->alignment_mask)\
|
||||
& ~ (__o1->alignment_mask)); \
|
||||
if (__o1->next_free - (char *)__o1->chunk \
|
||||
> __o1->chunk_limit - (char *)__o1->chunk) \
|
||||
__o1->next_free = __o1->chunk_limit; \
|
||||
__o1->object_base = __o1->next_free; \
|
||||
} \
|
||||
value = (void *) __o1->object_base; \
|
||||
if (__o1->next_free == value) \
|
||||
__o1->maybe_empty_object = 1; \
|
||||
__o1->next_free \
|
||||
= __INT_TO_PTR ((__PTR_TO_INT (__o1->next_free)+__o1->alignment_mask)\
|
||||
& ~ (__o1->alignment_mask)); \
|
||||
if (__o1->next_free - (char *)__o1->chunk \
|
||||
> __o1->chunk_limit - (char *)__o1->chunk) \
|
||||
__o1->next_free = __o1->chunk_limit; \
|
||||
__o1->object_base = __o1->next_free; \
|
||||
value; })
|
||||
|
||||
#define obstack_free(OBSTACK, OBJ) \
|
||||
@@ -470,61 +494,63 @@ __extension__ \
|
||||
#else /* not __GNUC__ or not __STDC__ */
|
||||
|
||||
#define obstack_object_size(h) \
|
||||
(unsigned) ((h)->alloc_failed ? 0 : (h)->next_free - (h)->object_base)
|
||||
(unsigned) ((h)->next_free - (h)->object_base)
|
||||
|
||||
#define obstack_room(h) \
|
||||
(unsigned) ((h)->chunk_limit - (h)->next_free)
|
||||
|
||||
#define obstack_empty_p(h) \
|
||||
((h)->chunk->prev == 0 && (h)->next_free - (h)->chunk->contents == 0)
|
||||
|
||||
/* Note that the call to _obstack_newchunk is enclosed in (..., 0)
|
||||
so that we can avoid having void expressions
|
||||
in the arms of the conditional expression.
|
||||
Casting the third operand to void was tried before,
|
||||
but some compilers won't accept it. */
|
||||
|
||||
#define obstack_make_room(h,length) \
|
||||
( (h)->temp = (length), \
|
||||
(((h)->next_free + (h)->temp > (h)->chunk_limit) \
|
||||
? (_obstack_newchunk ((h), (h)->temp), 0) : 0))
|
||||
|
||||
#define obstack_grow(h,where,length) \
|
||||
( (h)->temp = (length), \
|
||||
(((h)->next_free + (h)->temp > (h)->chunk_limit) \
|
||||
? (_obstack_newchunk ((h), (h)->temp), 0) : 0), \
|
||||
((h)->alloc_failed ? 0 : \
|
||||
(bcopy ((char *) (where), (h)->next_free, (h)->temp), \
|
||||
(h)->next_free += (h)->temp)))
|
||||
_obstack_memcpy ((h)->next_free, (char *) (where), (h)->temp), \
|
||||
(h)->next_free += (h)->temp)
|
||||
|
||||
#define obstack_grow0(h,where,length) \
|
||||
( (h)->temp = (length), \
|
||||
(((h)->next_free + (h)->temp + 1 > (h)->chunk_limit) \
|
||||
? (_obstack_newchunk ((h), (h)->temp + 1), 0) : 0), \
|
||||
((h)->alloc_failed ? 0 : \
|
||||
(bcopy ((char *) (where), (h)->next_free, (h)->temp), \
|
||||
_obstack_memcpy ((h)->next_free, (char *) (where), (h)->temp), \
|
||||
(h)->next_free += (h)->temp, \
|
||||
*((h)->next_free)++ = 0)))
|
||||
*((h)->next_free)++ = 0)
|
||||
|
||||
#define obstack_1grow(h,datum) \
|
||||
( (((h)->next_free + 1 > (h)->chunk_limit) \
|
||||
? (_obstack_newchunk ((h), 1), 0) : 0), \
|
||||
((h)->alloc_failed ? 0 : \
|
||||
(*((h)->next_free)++ = (datum))))
|
||||
(*((h)->next_free)++ = (datum)))
|
||||
|
||||
#define obstack_ptr_grow(h,datum) \
|
||||
( (((h)->next_free + sizeof (char *) > (h)->chunk_limit) \
|
||||
? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0), \
|
||||
((h)->alloc_failed ? 0 : \
|
||||
(*((char **)(((h)->next_free+=sizeof(char *))-sizeof(char *))) = ((char *)datum))))
|
||||
(*((char **) (((h)->next_free+=sizeof(char *))-sizeof(char *))) = ((char *) datum)))
|
||||
|
||||
#define obstack_int_grow(h,datum) \
|
||||
( (((h)->next_free + sizeof (int) > (h)->chunk_limit) \
|
||||
? (_obstack_newchunk ((h), sizeof (int)), 0) : 0), \
|
||||
((h)->alloc_failed ? 0 : \
|
||||
(*((int *)(((h)->next_free+=sizeof(int))-sizeof(int))) = ((int)datum))))
|
||||
(*((int *) (((h)->next_free+=sizeof(int))-sizeof(int))) = ((int) datum)))
|
||||
|
||||
#define obstack_ptr_grow_fast(h,aptr) (*((char **)(h)->next_free)++ = (char *)aptr)
|
||||
#define obstack_int_grow_fast(h,aint) (*((int *)(h)->next_free)++ = (int)aint)
|
||||
#define obstack_ptr_grow_fast(h,aptr) (*((char **) (h)->next_free)++ = (char *) aptr)
|
||||
#define obstack_int_grow_fast(h,aint) (*((int *) (h)->next_free)++ = (int) aint)
|
||||
|
||||
#define obstack_blank(h,length) \
|
||||
( (h)->temp = (length), \
|
||||
(((h)->chunk_limit - (h)->next_free < (h)->temp) \
|
||||
? (_obstack_newchunk ((h), (h)->temp), 0) : 0), \
|
||||
((h)->alloc_failed ? 0 : \
|
||||
((h)->next_free += (h)->temp)))
|
||||
((h)->next_free += (h)->temp))
|
||||
|
||||
#define obstack_alloc(h,length) \
|
||||
(obstack_blank ((h), (length)), obstack_finish ((h)))
|
||||
@@ -536,30 +562,29 @@ __extension__ \
|
||||
(obstack_grow0 ((h), (where), (length)), obstack_finish ((h)))
|
||||
|
||||
#define obstack_finish(h) \
|
||||
( (h)->alloc_failed ? 0 : \
|
||||
(((h)->next_free == (h)->object_base \
|
||||
( ((h)->next_free == (h)->object_base \
|
||||
? (((h)->maybe_empty_object = 1), 0) \
|
||||
: 0), \
|
||||
(h)->temp = __PTR_TO_INT ((h)->object_base), \
|
||||
(h)->next_free \
|
||||
= __INT_TO_PTR ((__PTR_TO_INT ((h)->next_free)+(h)->alignment_mask) \
|
||||
& ~ ((h)->alignment_mask)), \
|
||||
(((h)->next_free - (char *)(h)->chunk \
|
||||
> (h)->chunk_limit - (char *)(h)->chunk) \
|
||||
(((h)->next_free - (char *) (h)->chunk \
|
||||
> (h)->chunk_limit - (char *) (h)->chunk) \
|
||||
? ((h)->next_free = (h)->chunk_limit) : 0), \
|
||||
(h)->object_base = (h)->next_free, \
|
||||
__INT_TO_PTR ((h)->temp)))
|
||||
__INT_TO_PTR ((h)->temp))
|
||||
|
||||
#if defined (__STDC__) && __STDC__
|
||||
#define obstack_free(h,obj) \
|
||||
( (h)->temp = (char *)(obj) - (char *) (h)->chunk, \
|
||||
( (h)->temp = (char *) (obj) - (char *) (h)->chunk, \
|
||||
(((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\
|
||||
? (int) ((h)->next_free = (h)->object_base \
|
||||
= (h)->temp + (char *) (h)->chunk) \
|
||||
: (((obstack_free) ((h), (h)->temp + (char *) (h)->chunk), 0), 0)))
|
||||
#else
|
||||
#define obstack_free(h,obj) \
|
||||
( (h)->temp = (char *)(obj) - (char *) (h)->chunk, \
|
||||
( (h)->temp = (char *) (obj) - (char *) (h)->chunk, \
|
||||
(((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\
|
||||
? (int) ((h)->next_free = (h)->object_base \
|
||||
= (h)->temp + (char *) (h)->chunk) \
|
||||
@@ -568,4 +593,8 @@ __extension__ \
|
||||
|
||||
#endif /* not __GNUC__ or not __STDC__ */
|
||||
|
||||
#endif /* not __OBSTACK_H__ */
|
||||
#ifdef __cplusplus
|
||||
} /* C++ */
|
||||
#endif
|
||||
|
||||
#endif /* obstack.h */
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* path-concat.c -- concatenate two arbitrary pathnames
|
||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||
Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -17,12 +17,21 @@
|
||||
|
||||
/* Written by Jim Meyering. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_MEMPCPY
|
||||
# define mempcpy(D, S, N) ((void *) ((char *) memcpy (D, S, N) + (N)))
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#if HAVE_STRING_H
|
||||
# include <string.h>
|
||||
#endif
|
||||
#include <sys/types.h>
|
||||
|
||||
char *malloc ();
|
||||
char *stpcpy ();
|
||||
|
||||
/* Concatenate two pathname components, DIR and BASE, in newly-allocated
|
||||
storage and return the result. Return 0 if out of memory. Add a slash
|
||||
@@ -40,22 +49,24 @@ path_concat (dir, base, base_in_result)
|
||||
{
|
||||
char *p;
|
||||
char *p_concat;
|
||||
size_t base_len = strlen (base);
|
||||
size_t dir_len = strlen (dir);
|
||||
|
||||
p_concat = malloc (strlen (dir) + strlen (base) + 2);
|
||||
p_concat = malloc (dir_len + base_len + 2);
|
||||
if (!p_concat)
|
||||
return 0;
|
||||
|
||||
p = stpcpy (p_concat, dir);
|
||||
p = mempcpy (p_concat, dir, dir_len);
|
||||
|
||||
if (*(p - 1) == '/' && *base == '/')
|
||||
--p;
|
||||
else if (*(p - 1) != '/' && *base != '/')
|
||||
p = stpcpy (p, "/");
|
||||
*p++ = '/';
|
||||
|
||||
if (base_in_result)
|
||||
*base_in_result = p;
|
||||
|
||||
stpcpy (p, base);
|
||||
memcpy (p, base, base_len + 1);
|
||||
|
||||
return p_concat;
|
||||
}
|
||||
|
||||
@@ -1,9 +1,15 @@
|
||||
#if __STDC__
|
||||
# undef __P
|
||||
# define __P(args) args
|
||||
#else
|
||||
# define __P(args) ()
|
||||
#endif
|
||||
#if ! defined PATH_CONCAT_H_
|
||||
# define PATH_CONCAT_H_
|
||||
|
||||
# ifndef PARAMS
|
||||
# if defined PROTOTYPES || (defined __STDC__ && __STDC__)
|
||||
# define PARAMS(Args) Args
|
||||
# else
|
||||
# define PARAMS(Args) ()
|
||||
# endif
|
||||
# endif
|
||||
|
||||
char *
|
||||
path_concat __P ((const char *dir, const char *base, char **base_in_result));
|
||||
path_concat PARAMS ((const char *dir, const char *base, char **base_in_result));
|
||||
|
||||
#endif
|
||||
|
||||
48
lib/putenv.c
48
lib/putenv.c
@@ -1,32 +1,34 @@
|
||||
/* Copyright (C) 1991, 1994 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1991, 1994, 1997, 1998 Free Software Foundation, Inc.
|
||||
|
||||
NOTE: The canonical source of this file is maintained with the GNU C
|
||||
Library. Bugs can be reported to bug-glibc@prep.ai.mit.edu.
|
||||
|
||||
NOTE: The canonical source of this file is maintained with the GNU C Library.
|
||||
Bugs can be reported to bug-glibc@prep.ai.mit.edu.
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
/* Define-away any (possibly conflicting) prototype of putenv.
|
||||
Many systems omit the `const' attribute on the argument. */
|
||||
#define putenv _sys_putenv
|
||||
/* Disable the definition of putenv to rpl_putenv (from config.h) in this
|
||||
file. Otherwise, we'd get conflicting prototypes for rpl_putenv on
|
||||
systems like Irix 5.3. */
|
||||
#undef putenv
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined (__GNU_LIBRARY__) || defined (HAVE_STDLIB_H)
|
||||
# include <stdlib.h>
|
||||
@@ -38,8 +40,6 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#undef putenv
|
||||
|
||||
#if !defined (__GNU_LIBRARY__) && !defined (HAVE_STRCHR)
|
||||
# define strchr index
|
||||
#endif
|
||||
@@ -53,10 +53,14 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
extern char **environ;
|
||||
#endif
|
||||
|
||||
#ifndef NULL
|
||||
# define NULL 0
|
||||
#endif
|
||||
|
||||
|
||||
/* Put STRING, which is of the form "NAME=VALUE", in the environment. */
|
||||
int
|
||||
putenv (string)
|
||||
rpl_putenv (string)
|
||||
const char *string;
|
||||
{
|
||||
const char *const name_end = strchr (string, '=');
|
||||
|
||||
355
lib/quotearg.c
Normal file
355
lib/quotearg.c
Normal file
@@ -0,0 +1,355 @@
|
||||
/* quotearg.c - quote arguments for output
|
||||
Copyright (C) 1998 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* Written by Paul Eggert <eggert@twinsun.com> */
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <quotearg.h>
|
||||
#include <xalloc.h>
|
||||
|
||||
#include <ctype.h>
|
||||
#if defined (STDC_HEADERS) || (!defined (isascii) && !defined (HAVE_ISASCII))
|
||||
# define ISASCII(c) 1
|
||||
#else
|
||||
# define ISASCII(c) isascii (c)
|
||||
#endif
|
||||
#ifdef isgraph
|
||||
# define ISGRAPH(c) (ISASCII (c) && isgraph (c))
|
||||
#else
|
||||
# define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c))
|
||||
#endif
|
||||
|
||||
#if HAVE_LIMITS_H
|
||||
# include <limits.h>
|
||||
#endif
|
||||
#ifndef CHAR_BIT
|
||||
# define CHAR_BIT 8
|
||||
#endif
|
||||
#ifndef UCHAR_MAX
|
||||
# define UCHAR_MAX ((unsigned char) -1)
|
||||
#endif
|
||||
|
||||
#if HAVE_STDLIB_H
|
||||
# include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#if HAVE_STRING_H
|
||||
# include <string.h>
|
||||
#endif
|
||||
|
||||
#define INT_BITS (sizeof (int) * CHAR_BIT)
|
||||
|
||||
struct quoting_options
|
||||
{
|
||||
/* Basic quoting style. */
|
||||
enum quoting_style style;
|
||||
|
||||
/* Quote the chararacters indicated by this bit vector even if the
|
||||
quoting style would not normally require them to be quoted. */
|
||||
int quote_these_too[((UCHAR_MAX + 1) / INT_BITS
|
||||
+ ((UCHAR_MAX + 1) % INT_BITS != 0))];
|
||||
};
|
||||
|
||||
/* Names of quoting styles. */
|
||||
char const *const quoting_style_args[] =
|
||||
{
|
||||
"literal", "shell", "shell-always", "c", "escape", 0
|
||||
};
|
||||
|
||||
/* The default quoting options. */
|
||||
static struct quoting_options default_quoting_options;
|
||||
|
||||
/* Allocate a new set of quoting options, with contents initially identical
|
||||
to O if O is not null, or to the default if O is null.
|
||||
It is the caller's responsibility to free the result. */
|
||||
struct quoting_options *
|
||||
clone_quoting_options (struct quoting_options *o)
|
||||
{
|
||||
struct quoting_options *p
|
||||
= (struct quoting_options *) xmalloc (sizeof (struct quoting_options));
|
||||
*p = *(o ? o : &default_quoting_options);
|
||||
return p;
|
||||
}
|
||||
|
||||
/* Get the value of O's quoting style. If O is null, use the default. */
|
||||
enum quoting_style
|
||||
get_quoting_style (struct quoting_options *o)
|
||||
{
|
||||
return (o ? o : &default_quoting_options)->style;
|
||||
}
|
||||
|
||||
/* In O (or in the default if O is null),
|
||||
set the value of the quoting style to S. */
|
||||
void
|
||||
set_quoting_style (struct quoting_options *o, enum quoting_style s)
|
||||
{
|
||||
(o ? o : &default_quoting_options)->style = s;
|
||||
}
|
||||
|
||||
/* In O (or in the default if O is null),
|
||||
set the value of the quoting options for character C to I.
|
||||
Return the old value. Currently, the only values defined for I are
|
||||
0 (the default) and 1 (which means to quote the character even if
|
||||
it would not otherwise be quoted). */
|
||||
int
|
||||
set_char_quoting (struct quoting_options *o, char c, int i)
|
||||
{
|
||||
unsigned char uc = c;
|
||||
int *p = (o ? o : &default_quoting_options)->quote_these_too + uc / INT_BITS;
|
||||
int shift = uc % INT_BITS;
|
||||
int r = (*p >> shift) & 1;
|
||||
*p ^= ((i & 1) ^ r) << shift;
|
||||
return r;
|
||||
}
|
||||
|
||||
/* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
|
||||
argument ARG (of size ARGSIZE), using O to control quoting.
|
||||
If O is null, use the default.
|
||||
Terminate the output with a null character, and return the written
|
||||
size of the output, not counting the terminating null.
|
||||
If BUFFERSIZE is too small to store the output string, return the
|
||||
value that would have been returned had BUFFERSIZE been large enough.
|
||||
If ARGSIZE is -1, use the string length of the argument for ARGSIZE. */
|
||||
size_t
|
||||
quotearg_buffer (char *buffer, size_t buffersize,
|
||||
char const *arg, size_t argsize,
|
||||
struct quoting_options const *o)
|
||||
{
|
||||
unsigned char c;
|
||||
size_t i;
|
||||
size_t len;
|
||||
int quote_mark;
|
||||
struct quoting_options const *p = o ? o : &default_quoting_options;
|
||||
enum quoting_style quoting_style = p->style;
|
||||
#define STORE(c) \
|
||||
do \
|
||||
{ \
|
||||
if (len < buffersize) \
|
||||
buffer[len] = (c); \
|
||||
len++; \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
switch (quoting_style)
|
||||
{
|
||||
case shell_quoting_style:
|
||||
if (! (argsize == -1 ? arg[0] == '\0' : argsize == 0))
|
||||
{
|
||||
switch (arg[0])
|
||||
{
|
||||
case '#': case '~':
|
||||
break;
|
||||
|
||||
default:
|
||||
len = 0;
|
||||
for (i = 0; ; i++)
|
||||
{
|
||||
if (argsize == -1 ? arg[i] == '\0' : i == argsize)
|
||||
goto done;
|
||||
|
||||
c = arg[i];
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case '\t': case '\n': case ' ':
|
||||
case '!': /* special in csh */
|
||||
case '"': case '$': case '&': case '\'':
|
||||
case '(': case ')': case '*': case ';':
|
||||
case '<': case '>': case '?': case '[': case '\\':
|
||||
case '^': /* special in old /bin/sh, e.g. SunOS 4.1.4 */
|
||||
case '`': case '|':
|
||||
goto needs_quoting;
|
||||
}
|
||||
|
||||
if (p->quote_these_too[c / INT_BITS] & (1 << (c % INT_BITS)))
|
||||
goto needs_quoting;
|
||||
|
||||
STORE (c);
|
||||
}
|
||||
|
||||
needs_quoting:;
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* Fall through. */
|
||||
|
||||
case shell_always_quoting_style:
|
||||
quote_mark = '\'';
|
||||
break;
|
||||
|
||||
case c_quoting_style:
|
||||
quote_mark = '"';
|
||||
break;
|
||||
|
||||
default:
|
||||
quote_mark = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
len = 0;
|
||||
|
||||
if (quote_mark)
|
||||
STORE (quote_mark);
|
||||
|
||||
for (i = 0; ! (argsize == -1 ? arg[i] == '\0' : i == argsize); i++)
|
||||
{
|
||||
c = arg[i];
|
||||
|
||||
switch (quoting_style)
|
||||
{
|
||||
case literal_quoting_style:
|
||||
break;
|
||||
|
||||
case shell_quoting_style:
|
||||
case shell_always_quoting_style:
|
||||
if (c == '\'')
|
||||
{
|
||||
STORE ('\'');
|
||||
STORE ('\\');
|
||||
STORE ('\'');
|
||||
}
|
||||
break;
|
||||
|
||||
case c_quoting_style:
|
||||
case escape_quoting_style:
|
||||
switch (c)
|
||||
{
|
||||
case '?': /* Do not generate trigraphs. */
|
||||
case '\\': goto store_escape;
|
||||
/* Not all C compilers know what \a means. */
|
||||
case 7 : c = 'a'; goto store_escape;
|
||||
case '\b': c = 'b'; goto store_escape;
|
||||
case '\f': c = 'f'; goto store_escape;
|
||||
case '\n': c = 'n'; goto store_escape;
|
||||
case '\r': c = 'r'; goto store_escape;
|
||||
case '\t': c = 't'; goto store_escape;
|
||||
case '\v': c = 'v'; goto store_escape;
|
||||
|
||||
case ' ':
|
||||
if (quoting_style == escape_quoting_style)
|
||||
goto store_escape;
|
||||
break;
|
||||
|
||||
case '"':
|
||||
if (quoting_style == c_quoting_style)
|
||||
goto store_escape;
|
||||
break;
|
||||
|
||||
default:
|
||||
if (!ISGRAPH (c))
|
||||
{
|
||||
STORE ('\\');
|
||||
STORE ('0' + (c >> 6));
|
||||
STORE ('0' + ((c >> 3) & 3));
|
||||
c = '0' + (c & 3);
|
||||
goto store_c;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (! (p->quote_these_too[c / INT_BITS] & (1 << (c % INT_BITS))))
|
||||
goto store_c;
|
||||
|
||||
store_escape:
|
||||
STORE ('\\');
|
||||
}
|
||||
|
||||
store_c:
|
||||
STORE (c);
|
||||
}
|
||||
|
||||
if (quote_mark)
|
||||
STORE (quote_mark);
|
||||
|
||||
done:
|
||||
if (len < buffersize)
|
||||
buffer[len] = '\0';
|
||||
return len;
|
||||
}
|
||||
|
||||
/* Use storage slot N to return a quoted version of the string ARG.
|
||||
OPTIONS specifies the quoting options.
|
||||
The returned value points to static storage that can be
|
||||
reused by the next call to this function with the same value of N.
|
||||
N must be nonnegative. */
|
||||
static char *
|
||||
quotearg_n_options (int n, char const *arg, struct quoting_options *options)
|
||||
{
|
||||
static unsigned nslots;
|
||||
static struct slotvec
|
||||
{
|
||||
size_t size;
|
||||
char *val;
|
||||
} *slotvec;
|
||||
|
||||
if (nslots <= n)
|
||||
{
|
||||
int n1 = n + 1;
|
||||
size_t s = n1 * sizeof (struct slotvec);
|
||||
if (! (0 < n1 && n1 == s / sizeof (struct slotvec)))
|
||||
abort ();
|
||||
slotvec = (struct slotvec *) xrealloc (slotvec, s);
|
||||
memset (slotvec + nslots, 0, (n1 - nslots) * sizeof (struct slotvec));
|
||||
nslots = n;
|
||||
}
|
||||
|
||||
{
|
||||
size_t size = slotvec[n].size;
|
||||
char *val = slotvec[n].val;
|
||||
size_t qsize = quotearg_buffer (val, size, arg, (size_t) -1, options);
|
||||
|
||||
if (size <= qsize)
|
||||
{
|
||||
slotvec[n].size = size = qsize + 1;
|
||||
slotvec[n].val = val = xrealloc (val, size);
|
||||
quotearg_buffer (val, size, arg, (size_t) -1, options);
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
}
|
||||
|
||||
char *
|
||||
quotearg_n (int n, char const *arg)
|
||||
{
|
||||
return quotearg_n_options (n, arg, &default_quoting_options);
|
||||
}
|
||||
|
||||
char *
|
||||
quotearg (char const *arg)
|
||||
{
|
||||
return quotearg_n (0, arg);
|
||||
}
|
||||
|
||||
char *
|
||||
quotearg_char (char const *arg, char ch)
|
||||
{
|
||||
struct quoting_options options;
|
||||
options = default_quoting_options;
|
||||
set_char_quoting (&options, ch, 1);
|
||||
return quotearg_n_options (0, arg, &options);
|
||||
}
|
||||
|
||||
char *
|
||||
quotearg_colon (char const *arg)
|
||||
{
|
||||
return quotearg_char (arg, ':');
|
||||
}
|
||||
99
lib/quotearg.h
Normal file
99
lib/quotearg.h
Normal file
@@ -0,0 +1,99 @@
|
||||
/* quotearg.h - quote arguments for output
|
||||
Copyright (C) 1998 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* Written by Paul Eggert <eggert@twinsun.com> */
|
||||
|
||||
/* Basic quoting styles. */
|
||||
enum quoting_style
|
||||
{
|
||||
literal_quoting_style, /* --quoting-style=literal */
|
||||
shell_quoting_style, /* --quoting-style=shell */
|
||||
shell_always_quoting_style, /* --quoting-style=shell-always */
|
||||
c_quoting_style, /* --quoting-style=c */
|
||||
escape_quoting_style /* --quoting-style=escape */
|
||||
};
|
||||
|
||||
/* For now, --quoting-style=literal is the default, but
|
||||
this is planned to change to --quoting-style=shell in the future. */
|
||||
#ifndef DEFAULT_QUOTING_STYLE
|
||||
# define DEFAULT_QUOTING_STYLE literal_quoting_style
|
||||
#endif
|
||||
|
||||
/* Names of quoting styles. */
|
||||
extern char const *const quoting_style_args[];
|
||||
|
||||
struct quoting_options;
|
||||
|
||||
#ifndef PARAMS
|
||||
# if defined PROTOTYPES || defined __STDC__
|
||||
# define PARAMS(Args) Args
|
||||
# else
|
||||
# define PARAMS(Args) ()
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* The functions listed below set and use a hidden variable
|
||||
that contains the default quoting style options. */
|
||||
|
||||
/* Allocate a new set of quoting options, with contents initially identical
|
||||
to O if O is not null, or to the default if O is null.
|
||||
It is the caller's responsibility to free the result. */
|
||||
struct quoting_options *clone_quoting_options
|
||||
PARAMS ((struct quoting_options *o));
|
||||
|
||||
/* Get the value of O's quoting style. If O is null, use the default. */
|
||||
enum quoting_style get_quoting_style PARAMS ((struct quoting_options *o));
|
||||
|
||||
/* In O (or in the default if O is null),
|
||||
set the value of the quoting style to S. */
|
||||
void set_quoting_style PARAMS ((struct quoting_options *o,
|
||||
enum quoting_style s));
|
||||
|
||||
/* In O (or in the default if O is null),
|
||||
set the value of the quoting options for character C to I.
|
||||
Return the old value. Currently, the only values defined for I are
|
||||
0 (the default) and 1 (which means to quote the character even if
|
||||
it would not otherwise be quoted). */
|
||||
int set_char_quoting PARAMS ((struct quoting_options *o, char c, int i));
|
||||
|
||||
/* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
|
||||
argument ARG (of size ARGSIZE), using O to control quoting.
|
||||
If O is null, use the default.
|
||||
Terminate the output with a null character, and return the written
|
||||
size of the output, not counting the terminating null.
|
||||
If BUFFERSIZE is too small to store the output string, return the
|
||||
value that would have been returned had BUFFERSIZE been large enough.
|
||||
If ARGSIZE is -1, use the string length of the argument for ARGSIZE. */
|
||||
size_t quotearg_buffer PARAMS ((char *buffer, size_t buffersize,
|
||||
char const *arg, size_t argsize,
|
||||
struct quoting_options const *o));
|
||||
|
||||
/* Use storage slot N to return a quoted version of the string ARG.
|
||||
Use the default quoting options.
|
||||
The returned value points to static storage that can be
|
||||
reused by the next call to this function with the same value of N.
|
||||
N must be nonnegative. */
|
||||
char *quotearg_n PARAMS ((int n, char const *arg));
|
||||
|
||||
/* Equivalent to quotearg_n (ARG, 0). */
|
||||
char *quotearg PARAMS ((char const *arg));
|
||||
|
||||
/* Like quotearg (ARG), except also quote any instances of CH. */
|
||||
char *quotearg_char PARAMS ((char const *arg, char ch));
|
||||
|
||||
/* Equivalent to quotearg_char (ARG, ':'). */
|
||||
char *quotearg_colon PARAMS ((char const *arg));
|
||||
157
lib/readutmp.c
Normal file
157
lib/readutmp.c
Normal file
@@ -0,0 +1,157 @@
|
||||
/* GNU's read utmp module.
|
||||
Copyright (C) 92, 93, 94, 95, 96, 1997, 1998 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* Written by jla; revised by djm */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include <sys/stat.h>
|
||||
#if defined(STDC_HEADERS) || defined(HAVE_STRING_H)
|
||||
# include <string.h>
|
||||
#else
|
||||
# include <strings.h>
|
||||
#endif /* STDC_HEADERS || HAVE_STRING_H */
|
||||
|
||||
#include "readutmp.h"
|
||||
|
||||
char *xmalloc ();
|
||||
|
||||
/* Copy UT->ut_name into storage obtained from malloc. Then remove any
|
||||
trailing spaces from the copy, NUL terminate it, and return the copy. */
|
||||
|
||||
char *
|
||||
extract_trimmed_name (const STRUCT_UTMP *ut)
|
||||
{
|
||||
char *p, *trimmed_name;
|
||||
|
||||
trimmed_name = xmalloc (sizeof (ut->ut_name) + 1);
|
||||
strncpy (trimmed_name, ut->ut_name, sizeof (ut->ut_name));
|
||||
/* Append a trailing space character. Some systems pad names shorter than
|
||||
the maximum with spaces, others pad with NULs. Remove any spaces. */
|
||||
trimmed_name[sizeof (ut->ut_name)] = ' ';
|
||||
p = strchr (trimmed_name, ' ');
|
||||
if (p != NULL)
|
||||
*p = '\0';
|
||||
return trimmed_name;
|
||||
}
|
||||
|
||||
/* Read the utmp file FILENAME into *UTMP_BUF, set *N_ENTRIES to the
|
||||
number of entries read, and return zero. If there is any error,
|
||||
return non-zero and don't modify the parameters. */
|
||||
|
||||
#ifdef HAVE_UTMPNAME
|
||||
|
||||
int
|
||||
read_utmp (const char *filename, int *n_entries, STRUCT_UTMP **utmp_buf)
|
||||
{
|
||||
int count_utmp = 0;
|
||||
int n_read;
|
||||
STRUCT_UTMP *u;
|
||||
STRUCT_UTMP *uptr;
|
||||
STRUCT_UTMP *utmp_contents;
|
||||
|
||||
if (utmpname (filename))
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* FIXME: going through the list twice is wasteful. */
|
||||
|
||||
/* count the entries in utmp */
|
||||
setutent ();
|
||||
while ((u = getutent ()) != NULL)
|
||||
++count_utmp;
|
||||
|
||||
if (count_utmp == 0)
|
||||
return 0;
|
||||
|
||||
utmp_contents = (STRUCT_UTMP *) xmalloc (count_utmp * sizeof (STRUCT_UTMP));
|
||||
|
||||
/* read the entries in utmp */
|
||||
|
||||
/* FIXME: can this fail? */
|
||||
setutent ();
|
||||
|
||||
n_read = 0;
|
||||
uptr = utmp_contents;
|
||||
while ((u = getutent ()) != NULL)
|
||||
{
|
||||
++n_read;
|
||||
if (n_read > count_utmp)
|
||||
{
|
||||
STRUCT_UTMP *old_utmp_contents = utmp_contents;
|
||||
++count_utmp;
|
||||
utmp_contents = (STRUCT_UTMP *) xrealloc (utmp_contents,
|
||||
(count_utmp
|
||||
* sizeof (STRUCT_UTMP)));
|
||||
uptr = utmp_contents + (uptr - old_utmp_contents);
|
||||
}
|
||||
*uptr = *u;
|
||||
++uptr;
|
||||
}
|
||||
|
||||
if (n_read != count_utmp)
|
||||
utmp_contents = (STRUCT_UTMP *) xrealloc (utmp_contents,
|
||||
n_read * sizeof (STRUCT_UTMP));
|
||||
|
||||
/* FIXME: can this fail? */
|
||||
endutent ();
|
||||
|
||||
*n_entries = n_read;
|
||||
*utmp_buf = utmp_contents;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
int
|
||||
read_utmp (const char *filename, int *n_entries, STRUCT_UTMP **utmp_buf)
|
||||
{
|
||||
FILE *utmp;
|
||||
struct stat file_stats;
|
||||
size_t n_read;
|
||||
size_t size;
|
||||
STRUCT_UTMP *buf;
|
||||
|
||||
utmp = fopen (filename, "r");
|
||||
if (utmp == NULL)
|
||||
return 1;
|
||||
|
||||
fstat (fileno (utmp), &file_stats);
|
||||
size = file_stats.st_size;
|
||||
if (size > 0)
|
||||
buf = (STRUCT_UTMP *) xmalloc (size);
|
||||
else
|
||||
{
|
||||
fclose (utmp);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Use < instead of != in case the utmp just grew. */
|
||||
n_read = fread (buf, 1, size, utmp);
|
||||
if (ferror (utmp) || fclose (utmp) == EOF
|
||||
|| n_read < size)
|
||||
return 1;
|
||||
|
||||
*n_entries = size / sizeof (STRUCT_UTMP);
|
||||
*utmp_buf = buf;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* HAVE_UTMPNAME */
|
||||
93
lib/readutmp.h
Normal file
93
lib/readutmp.h
Normal file
@@ -0,0 +1,93 @@
|
||||
/* Declarations for GNU's read utmp module.
|
||||
Copyright (C) 92, 93, 94, 95, 96, 1997, 1998 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* Written by jla; revised by djm */
|
||||
|
||||
#ifndef __READUTMP_H__
|
||||
# define __READUTMP_H__
|
||||
|
||||
# ifndef PARAMS
|
||||
# if defined PROTOTYPES || (defined __STDC__ && __STDC__)
|
||||
# define PARAMS(Args) Args
|
||||
# else
|
||||
# define PARAMS(Args) ()
|
||||
# endif
|
||||
# endif
|
||||
|
||||
# include <stdio.h>
|
||||
# include <sys/types.h>
|
||||
|
||||
# ifdef HAVE_UTMPX_H
|
||||
# include <utmpx.h>
|
||||
# define UTMP_STRUCT_NAME utmpx
|
||||
# define UT_TIME_MEMBER(UT_PTR) ((UT_PTR)->ut_tv.tv_sec)
|
||||
# else
|
||||
# include <utmp.h>
|
||||
# define UTMP_STRUCT_NAME utmp
|
||||
# define UT_TIME_MEMBER(UT_PTR) ((UT_PTR)->ut_time)
|
||||
# endif
|
||||
|
||||
typedef struct UTMP_STRUCT_NAME STRUCT_UTMP;
|
||||
|
||||
# include <time.h>
|
||||
# ifdef HAVE_SYS_PARAM_H
|
||||
# include <sys/param.h>
|
||||
# endif
|
||||
|
||||
# include <errno.h>
|
||||
# ifndef errno
|
||||
extern int errno;
|
||||
# endif
|
||||
|
||||
# if !defined (UTMP_FILE) && defined (_PATH_UTMP)
|
||||
# define UTMP_FILE _PATH_UTMP
|
||||
# endif
|
||||
|
||||
# if !defined (WTMP_FILE) && defined (_PATH_WTMP)
|
||||
# define WTMP_FILE _PATH_WTMP
|
||||
# endif
|
||||
|
||||
# ifdef UTMPX_FILE /* Solaris, SysVr4 */
|
||||
# undef UTMP_FILE
|
||||
# define UTMP_FILE UTMPX_FILE
|
||||
# endif
|
||||
|
||||
# ifdef WTMPX_FILE /* Solaris, SysVr4 */
|
||||
# undef WTMP_FILE
|
||||
# define WTMP_FILE WTMPX_FILE
|
||||
# endif
|
||||
|
||||
# ifndef UTMP_FILE
|
||||
# define UTMP_FILE "/etc/utmp"
|
||||
# endif
|
||||
|
||||
# ifndef WTMP_FILE
|
||||
# define WTMP_FILE "/etc/wtmp"
|
||||
# endif
|
||||
|
||||
# undef PARAMS
|
||||
# if defined (__STDC__) && __STDC__
|
||||
# define PARAMS(Args) Args
|
||||
# else
|
||||
# define PARAMS(Args) ()
|
||||
# endif
|
||||
|
||||
extern char *extract_trimmed_name PARAMS ((const STRUCT_UTMP *ut));
|
||||
extern int read_utmp PARAMS ((const char *filename,
|
||||
int *n_entries, STRUCT_UTMP **utmp_buf));
|
||||
|
||||
#endif /* __READUTMP_H__ */
|
||||
44
lib/realloc.c
Normal file
44
lib/realloc.c
Normal file
@@ -0,0 +1,44 @@
|
||||
/* Work around bug on some systems where realloc (NULL, 0) fails.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* written by Jim Meyering */
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
#undef realloc
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
char *malloc ();
|
||||
char *realloc ();
|
||||
|
||||
/* Change the size of an allocated block of memory P to N bytes,
|
||||
with error checking. If N is zero, change it to 1. If P is NULL,
|
||||
use malloc. */
|
||||
|
||||
char *
|
||||
rpl_realloc (p, n)
|
||||
char *p;
|
||||
size_t n;
|
||||
{
|
||||
if (n == 0)
|
||||
n = 1;
|
||||
if (p == 0)
|
||||
return malloc (n);
|
||||
return realloc (p, n);
|
||||
}
|
||||
4317
lib/regex.c
4317
lib/regex.c
File diff suppressed because it is too large
Load Diff
101
lib/regex.h
101
lib/regex.h
@@ -1,12 +1,15 @@
|
||||
/* Definitions for data structures and routines for the regular
|
||||
expression library, version 0.12.
|
||||
Copyright (C) 1985,89,90,91,92,93,95,96,97 Free Software Foundation, Inc.
|
||||
|
||||
Copyright (C) 1985, 89, 90, 91, 92, 93, 95 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
NOTE: The canonical source of this file is maintained with the GNU C Library.
|
||||
Bugs can be reported to bug-glibc@prep.ai.mit.edu.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
@@ -14,32 +17,44 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
USA. */
|
||||
|
||||
#ifndef __REGEXP_LIBRARY_H__
|
||||
#define __REGEXP_LIBRARY_H__
|
||||
#ifndef _REGEX_H
|
||||
#define _REGEX_H 1
|
||||
|
||||
/* Allow the use in C++ code. */
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* POSIX says that <sys/types.h> must be included (by the caller) before
|
||||
<regex.h>. */
|
||||
|
||||
#if !defined (_POSIX_C_SOURCE) && !defined (_POSIX_SOURCE) && defined (VMS)
|
||||
#if !defined _POSIX_C_SOURCE && !defined _POSIX_SOURCE && defined VMS
|
||||
/* VMS doesn't have `size_t' in <sys/types.h>, even though POSIX says it
|
||||
should be there. */
|
||||
#include <stddef.h>
|
||||
# include <stddef.h>
|
||||
#endif
|
||||
|
||||
/* The following two types have to be signed and unsigned integer type
|
||||
wide enough to hold a value of a pointer. For most ANSI compilers
|
||||
ptrdiff_t and size_t should be likely OK. Still size of these two
|
||||
types is 2 for Microsoft C. Ugh... */
|
||||
typedef long int s_reg_t;
|
||||
typedef unsigned long int active_reg_t;
|
||||
|
||||
/* The following bits are used to determine the regexp syntax we
|
||||
recognize. The set/not-set meanings are chosen so that Emacs syntax
|
||||
remains the value 0. The bits are given in alphabetical order, and
|
||||
the definitions shifted by one from the previous bit; thus, when we
|
||||
add or remove a bit, only one other definition need change. */
|
||||
typedef unsigned reg_syntax_t;
|
||||
typedef unsigned long int reg_syntax_t;
|
||||
|
||||
/* If this bit is not set, then \ inside a bracket expression is literal.
|
||||
If set, then such a \ quotes the following character. */
|
||||
#define RE_BACKSLASH_ESCAPE_IN_LISTS (1)
|
||||
#define RE_BACKSLASH_ESCAPE_IN_LISTS ((unsigned long int) 1)
|
||||
|
||||
/* If this bit is not set, then + and ? are operators, and \+ and \? are
|
||||
literals.
|
||||
@@ -134,6 +149,18 @@ typedef unsigned reg_syntax_t;
|
||||
without further backtracking. */
|
||||
#define RE_NO_POSIX_BACKTRACKING (RE_UNMATCHED_RIGHT_PAREN_ORD << 1)
|
||||
|
||||
/* If this bit is set, do not process the GNU regex operators.
|
||||
If not set, then the GNU regex operators are recognized. */
|
||||
#define RE_NO_GNU_OPS (RE_NO_POSIX_BACKTRACKING << 1)
|
||||
|
||||
/* If this bit is set, turn on internal regex debugging.
|
||||
If not set, and debugging was on, turn it off.
|
||||
This only works if regex.c is compiled -DDEBUG.
|
||||
We define this bit always, so that all that's needed to turn on
|
||||
debugging is to recompile regex.c; the calling code can always have
|
||||
this bit set, and it won't affect anything in the normal case. */
|
||||
#define RE_DEBUG (RE_NO_GNU_OPS << 1)
|
||||
|
||||
/* This global variable defines the particular regexp syntax to use (for
|
||||
some interfaces). When a regexp is compiled, the syntax used is
|
||||
stored in the pattern buffer, so changing this does not affect
|
||||
@@ -147,13 +174,19 @@ extern reg_syntax_t re_syntax_options;
|
||||
#define RE_SYNTAX_EMACS 0
|
||||
|
||||
#define RE_SYNTAX_AWK \
|
||||
(RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL \
|
||||
| RE_NO_BK_PARENS | RE_NO_BK_REFS \
|
||||
| RE_NO_BK_VBAR | RE_NO_EMPTY_RANGES \
|
||||
| RE_UNMATCHED_RIGHT_PAREN_ORD)
|
||||
(RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL \
|
||||
| RE_NO_BK_PARENS | RE_NO_BK_REFS \
|
||||
| RE_NO_BK_VBAR | RE_NO_EMPTY_RANGES \
|
||||
| RE_DOT_NEWLINE | RE_CONTEXT_INDEP_ANCHORS \
|
||||
| RE_UNMATCHED_RIGHT_PAREN_ORD | RE_NO_GNU_OPS)
|
||||
|
||||
#define RE_SYNTAX_GNU_AWK \
|
||||
((RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DEBUG) \
|
||||
& ~(RE_DOT_NOT_NULL | RE_INTERVALS | RE_CONTEXT_INDEP_OPS))
|
||||
|
||||
#define RE_SYNTAX_POSIX_AWK \
|
||||
(RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS)
|
||||
(RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS \
|
||||
| RE_INTERVALS | RE_NO_GNU_OPS)
|
||||
|
||||
#define RE_SYNTAX_GREP \
|
||||
(RE_BK_PLUS_QM | RE_CHAR_CLASSES \
|
||||
@@ -207,9 +240,10 @@ extern reg_syntax_t re_syntax_options;
|
||||
(erroneously) define this in other header files, but we want our
|
||||
value, so remove any previous define. */
|
||||
#ifdef RE_DUP_MAX
|
||||
#undef RE_DUP_MAX
|
||||
# undef RE_DUP_MAX
|
||||
#endif
|
||||
#define RE_DUP_MAX ((1 << 15) - 1)
|
||||
/* If sizeof(int) == 2, then ((1 << 15) - 1) overflows. */
|
||||
#define RE_DUP_MAX (0x7fff)
|
||||
|
||||
|
||||
/* POSIX `cflags' bits (i.e., information for `regcomp'). */
|
||||
@@ -249,6 +283,10 @@ extern reg_syntax_t re_syntax_options;
|
||||
`re_error_msg' table in regex.c. */
|
||||
typedef enum
|
||||
{
|
||||
#if (_XOPEN_SOURCE - 0) == 500
|
||||
REG_NOSYS = -1, /* This will never happen for this implementation. */
|
||||
#endif
|
||||
|
||||
REG_NOERROR = 0, /* Success. */
|
||||
REG_NOMATCH, /* Didn't find a match (for regexec). */
|
||||
|
||||
@@ -280,7 +318,7 @@ typedef enum
|
||||
private to the regex routines. */
|
||||
|
||||
#ifndef RE_TRANSLATE_TYPE
|
||||
#define RE_TRANSLATE_TYPE char *
|
||||
# define RE_TRANSLATE_TYPE char *
|
||||
#endif
|
||||
|
||||
struct re_pattern_buffer
|
||||
@@ -292,10 +330,10 @@ struct re_pattern_buffer
|
||||
unsigned char *buffer;
|
||||
|
||||
/* Number of bytes to which `buffer' points. */
|
||||
unsigned long allocated;
|
||||
unsigned long int allocated;
|
||||
|
||||
/* Number of bytes actually used in `buffer'. */
|
||||
unsigned long used;
|
||||
unsigned long int used;
|
||||
|
||||
/* Syntax setting with which the pattern was compiled. */
|
||||
reg_syntax_t syntax;
|
||||
@@ -371,7 +409,7 @@ struct re_registers
|
||||
`re_match_2' returns information about at least this many registers
|
||||
the first time a `regs' structure is passed. */
|
||||
#ifndef RE_NREGS
|
||||
#define RE_NREGS 30
|
||||
# define RE_NREGS 30
|
||||
#endif
|
||||
|
||||
|
||||
@@ -394,11 +432,11 @@ typedef struct
|
||||
|
||||
#if __STDC__
|
||||
|
||||
#define _RE_ARGS(args) args
|
||||
# define _RE_ARGS(args) args
|
||||
|
||||
#else /* not __STDC__ */
|
||||
|
||||
#define _RE_ARGS(args) ()
|
||||
# define _RE_ARGS(args) ()
|
||||
|
||||
#endif /* not __STDC__ */
|
||||
|
||||
@@ -410,7 +448,7 @@ extern reg_syntax_t re_set_syntax _RE_ARGS ((reg_syntax_t syntax));
|
||||
and syntax given by the global `re_syntax_options', into the buffer
|
||||
BUFFER. Return NULL if successful, and an error string if not. */
|
||||
extern const char *re_compile_pattern
|
||||
_RE_ARGS ((const char *pattern, int length,
|
||||
_RE_ARGS ((const char *pattern, size_t length,
|
||||
struct re_pattern_buffer *buffer));
|
||||
|
||||
|
||||
@@ -469,9 +507,11 @@ extern void re_set_registers
|
||||
unsigned num_regs, regoff_t *starts, regoff_t *ends));
|
||||
|
||||
#ifdef _REGEX_RE_COMP
|
||||
# ifndef _CRAY
|
||||
/* 4.2 bsd compatibility. */
|
||||
extern char *re_comp _RE_ARGS ((const char *));
|
||||
extern int re_exec _RE_ARGS ((const char *));
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* POSIX compatibility. */
|
||||
@@ -484,7 +524,12 @@ extern size_t regerror
|
||||
size_t errbuf_size));
|
||||
extern void regfree _RE_ARGS ((regex_t *preg));
|
||||
|
||||
#endif /* not __REGEXP_LIBRARY_H__ */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* C++ */
|
||||
|
||||
#endif /* regex.h */
|
||||
|
||||
/*
|
||||
Local variables:
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
/* rpmatch - determine whether string value is affirmation or negative
|
||||
response according to current locale's data
|
||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||
/* Determine whether string value is affirmation or negative response
|
||||
according to current locale's data.
|
||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
@@ -30,7 +30,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
#ifdef WITH_REGEX
|
||||
#if WITH_REGEX
|
||||
# include <regex.h>
|
||||
#else
|
||||
# include <rx.h>
|
||||
|
||||
4
lib/rx.c
4
lib/rx.c
@@ -14,8 +14,8 @@ for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with this software; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA
|
||||
02139, USA. */
|
||||
write to the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* NOTE!!! AIX is so losing it requires this to be the first thing in the
|
||||
* file.
|
||||
|
||||
4
lib/rx.h
4
lib/rx.h
@@ -17,8 +17,8 @@ for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with this software; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA
|
||||
02139, USA. */
|
||||
write to the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
/* t. lord Wed Sep 23 18:20:57 1992 */
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* safe-read.c -- an interface to read that retries after interrupts
|
||||
Copyright (C) 1993, 1994 Free Software Foundation, Inc.
|
||||
Copyright (C) 1993, 1994, 1998 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -31,17 +31,16 @@
|
||||
extern int errno;
|
||||
#endif
|
||||
|
||||
#include "safe-read.h"
|
||||
|
||||
/* Read LEN bytes at PTR from descriptor DESC, retrying if interrupted.
|
||||
Return the actual number of bytes read, zero for EOF, or negative
|
||||
for an error. */
|
||||
|
||||
int
|
||||
safe_read (desc, ptr, len)
|
||||
int desc;
|
||||
char *ptr;
|
||||
int len;
|
||||
ssize_t
|
||||
safe_read (int desc, char *ptr, size_t len)
|
||||
{
|
||||
int n_chars;
|
||||
ssize_t n_chars;
|
||||
|
||||
if (len <= 0)
|
||||
return len;
|
||||
|
||||
10
lib/safe-read.h
Normal file
10
lib/safe-read.h
Normal file
@@ -0,0 +1,10 @@
|
||||
#ifndef PARAMS
|
||||
# if defined PROTOTYPES || (defined __STDC__ && __STDC__)
|
||||
# define PARAMS(Args) Args
|
||||
# else
|
||||
# define PARAMS(Args) ()
|
||||
# endif
|
||||
#endif
|
||||
|
||||
ssize_t
|
||||
safe_read PARAMS ((int desc, char *ptr, size_t len));
|
||||
@@ -1,5 +1,5 @@
|
||||
/* save-cwd.c -- Save and restore current working directory.
|
||||
Copyright (C) 1995 Free Software Foundation, Inc.
|
||||
Copyright (C) 1995, 1997, 1998 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
/* Written by Jim Meyering <meyering@na-net.ornl.gov>. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#if HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
@@ -27,25 +27,25 @@
|
||||
# include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#if HAVE_UNISTD_H
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_FCNTL_H
|
||||
#if HAVE_FCNTL_H
|
||||
# include <fcntl.h>
|
||||
#else
|
||||
# include <sys/file.h>
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
# ifndef errno
|
||||
#ifndef errno
|
||||
extern int errno;
|
||||
#endif
|
||||
|
||||
#include "save-cwd.h"
|
||||
#include "error.h"
|
||||
|
||||
char *xgetcwd __P((void));
|
||||
char *xgetcwd PARAMS ((void));
|
||||
|
||||
/* Record the location of the current working directory in CWD so that
|
||||
the program may change to other directories and later use restore_cwd
|
||||
@@ -67,7 +67,7 @@ save_cwd (cwd)
|
||||
|
||||
if (have_working_fchdir)
|
||||
{
|
||||
#ifdef HAVE_FCHDIR
|
||||
#if HAVE_FCHDIR
|
||||
cwd->desc = open (".", O_RDONLY);
|
||||
if (cwd->desc < 0)
|
||||
{
|
||||
@@ -96,7 +96,7 @@ save_cwd (cwd)
|
||||
}
|
||||
# endif /* __sun__ || sun */
|
||||
#else
|
||||
#define fchdir(x) (abort (), 0)
|
||||
# define fchdir(x) (abort (), 0)
|
||||
have_working_fchdir = 0;
|
||||
#endif
|
||||
}
|
||||
@@ -152,4 +152,3 @@ free_cwd (cwd)
|
||||
if (cwd->name)
|
||||
free (cwd->name);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#ifndef SAVE_CWD_H
|
||||
#define SAVE_CWD_H 1
|
||||
# define SAVE_CWD_H 1
|
||||
|
||||
struct saved_cwd
|
||||
{
|
||||
@@ -7,17 +7,17 @@ struct saved_cwd
|
||||
char *name;
|
||||
};
|
||||
|
||||
#ifndef __P
|
||||
#if defined (__GNUC__) || (defined (__STDC__) && __STDC__)
|
||||
#define __P(args) args
|
||||
#else
|
||||
#define __P(args) ()
|
||||
#endif /* GCC. */
|
||||
#endif /* Not __P. */
|
||||
# ifndef PARAMS
|
||||
# if defined PROTOTYPES || (defined __STDC__ && __STDC__)
|
||||
# define PARAMS(Args) Args
|
||||
# else
|
||||
# define PARAMS(Args) ()
|
||||
# endif
|
||||
# endif
|
||||
|
||||
int save_cwd __P((struct saved_cwd *cwd));
|
||||
int restore_cwd __P((const struct saved_cwd *cwd, const char *dest,
|
||||
const char *from));
|
||||
void free_cwd __P((struct saved_cwd *cwd));
|
||||
int save_cwd PARAMS ((struct saved_cwd *cwd));
|
||||
int restore_cwd PARAMS ((const struct saved_cwd *cwd, const char *dest,
|
||||
const char *from));
|
||||
void free_cwd PARAMS ((struct saved_cwd *cwd));
|
||||
|
||||
#endif /* SAVE_CWD_H */
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* savedir.c -- save the list of files in a directory in a string
|
||||
Copyright (C) 1990 Free Software Foundation, Inc.
|
||||
Copyright (C) 1990, 1997, 1998 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -17,14 +17,14 @@
|
||||
|
||||
/* Written by David MacKenzie <djm@gnu.ai.mit.edu>. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#if HAVE_UNISTD_H
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#if HAVE_DIRENT_H
|
||||
@@ -46,23 +46,27 @@
|
||||
|
||||
#ifdef CLOSEDIR_VOID
|
||||
/* Fake a return value. */
|
||||
#define CLOSEDIR(d) (closedir (d), 0)
|
||||
# define CLOSEDIR(d) (closedir (d), 0)
|
||||
#else
|
||||
#define CLOSEDIR(d) closedir (d)
|
||||
# define CLOSEDIR(d) closedir (d)
|
||||
#endif
|
||||
|
||||
#ifdef STDC_HEADERS
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
# include <stdlib.h>
|
||||
# include <string.h>
|
||||
#else
|
||||
char *malloc ();
|
||||
char *realloc ();
|
||||
#endif
|
||||
#ifndef NULL
|
||||
#define NULL 0
|
||||
# define NULL 0
|
||||
#endif
|
||||
|
||||
#ifndef stpcpy
|
||||
char *stpcpy ();
|
||||
#endif
|
||||
|
||||
#include "savedir.h"
|
||||
|
||||
/* Return a freshly allocated string containing the filenames
|
||||
in directory DIR, separated by '\0' characters;
|
||||
@@ -73,8 +77,8 @@ char *stpcpy ();
|
||||
|
||||
char *
|
||||
savedir (dir, name_size)
|
||||
char *dir;
|
||||
unsigned name_size;
|
||||
const char *dir;
|
||||
unsigned int name_size;
|
||||
{
|
||||
DIR *dirp;
|
||||
struct dirent *dp;
|
||||
|
||||
15
lib/savedir.h
Normal file
15
lib/savedir.h
Normal file
@@ -0,0 +1,15 @@
|
||||
#if !defined SAVEDIR_H_
|
||||
# define SAVEDIR_H_
|
||||
|
||||
# ifndef PARAMS
|
||||
# if defined PROTOTYPES || (defined __STDC__ && __STDC__)
|
||||
# define PARAMS(Args) Args
|
||||
# else
|
||||
# define PARAMS(Args) ()
|
||||
# endif
|
||||
# endif
|
||||
|
||||
char *
|
||||
savedir PARAMS ((const char *dir, unsigned int name_size));
|
||||
|
||||
#endif
|
||||
56
lib/stat.c
Normal file
56
lib/stat.c
Normal file
@@ -0,0 +1,56 @@
|
||||
/* Work around the bug in some systems whereby stat succeeds when
|
||||
given the zero-length file name argument. The stat from SunOS4.1.4
|
||||
has this bug.
|
||||
Copyright (C) 1997, 1998 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* written by Jim Meyering */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* Disable the definition of stat to rpl_stat (from config.h) in this
|
||||
file. Otherwise, we'd get conflicting prototypes for rpl_stat on
|
||||
most systems. */
|
||||
#undef stat
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <errno.h>
|
||||
#ifndef errno
|
||||
extern int errno;
|
||||
#endif
|
||||
|
||||
/* This is a wrapper for stat(2).
|
||||
If FILE is the empty string, fail with errno == ENOENT.
|
||||
Otherwise, return the result of calling the real stat.
|
||||
|
||||
This works around the bug in some systems whereby stat succeeds when
|
||||
given the zero-length file name argument. The stat from SunOS4.1.4
|
||||
has this bug. */
|
||||
|
||||
int
|
||||
rpl_stat (file, sbuf)
|
||||
const char *file;
|
||||
struct stat *sbuf;
|
||||
{
|
||||
if (file && *file == 0)
|
||||
{
|
||||
errno = ENOENT;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return stat (file, sbuf);
|
||||
}
|
||||
56
lib/stpcpy.c
56
lib/stpcpy.c
@@ -1,32 +1,52 @@
|
||||
/* stpcpy.c -- copy a string and return pointer to end of new string
|
||||
Copyright (C) 1989, 1990 Free Software Foundation.
|
||||
Copyright (C) 1992, 1995, 1997, 1998 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
NOTE: The canonical source of this file is maintained with the GNU C Library.
|
||||
Bugs can be reported to bug-glibc@prep.ai.mit.edu.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
USA. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
/* Copy SRC to DEST, returning the address of the terminating '\0' in DEST. */
|
||||
#include <string.h>
|
||||
|
||||
#undef __stpcpy
|
||||
#undef stpcpy
|
||||
|
||||
#ifndef weak_alias
|
||||
# define __stpcpy stpcpy
|
||||
#endif
|
||||
|
||||
/* Copy SRC to DEST, returning the address of the terminating '\0' in DEST. */
|
||||
char *
|
||||
stpcpy (dest, src)
|
||||
__stpcpy (dest, src)
|
||||
char *dest;
|
||||
const char *src;
|
||||
{
|
||||
while ((*dest++ = *src++) != '\0')
|
||||
/* Do nothing. */ ;
|
||||
return dest - 1;
|
||||
register char *d = dest;
|
||||
register const char *s = src;
|
||||
|
||||
do
|
||||
*d++ = *s;
|
||||
while (*s++ != '\0');
|
||||
|
||||
return d - 1;
|
||||
}
|
||||
#ifdef weak_alias
|
||||
weak_alias (__stpcpy, stpcpy)
|
||||
#endif
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
/* Copyright (C) 1991 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1991, 1994, 1996, 1997 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
NOTE: The canonical source of this file is maintained with the GNU C Library.
|
||||
Bugs can be reported to bug-glibc@prep.ai.mit.edu.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
@@ -11,14 +14,15 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
USA. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STRING_H
|
||||
#if defined _LIBC || HAVE_STRING_H
|
||||
# include <string.h>
|
||||
#else
|
||||
# include <strings.h>
|
||||
@@ -27,14 +31,16 @@
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Return the length of the maximum inital segment of S
|
||||
#undef strcspn
|
||||
|
||||
/* Return the length of the maximum initial segment of S
|
||||
which contains no characters from REJECT. */
|
||||
int
|
||||
strcspn (s, reject)
|
||||
register char *s;
|
||||
register char *reject;
|
||||
const char *s;
|
||||
const char *reject;
|
||||
{
|
||||
register int count = 0;
|
||||
int count = 0;
|
||||
|
||||
while (*s != '\0')
|
||||
if (strchr (reject, *s++) == 0)
|
||||
|
||||
10
lib/strdup.c
10
lib/strdup.c
@@ -1,5 +1,5 @@
|
||||
/* strdup.c -- return a newly allocated copy of a string
|
||||
Copyright (C) 1990 Free Software Foundation, Inc.
|
||||
Copyright (C) 1990, 1998 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -15,13 +15,13 @@
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#ifdef STDC_HEADERS
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
# include <string.h>
|
||||
# include <stdlib.h>
|
||||
#else
|
||||
char *malloc ();
|
||||
char *strcpy ();
|
||||
|
||||
298
lib/strftime.c
298
lib/strftime.c
@@ -1,7 +1,7 @@
|
||||
/* Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1991,92,93,94,95,96,97,98 Free Software Foundation, Inc.
|
||||
|
||||
NOTE: The canonical source of this file is maintained with the GNU C
|
||||
Library. Bugs can be reported to bug-glibc@prep.ai.mit.edu.
|
||||
NOTE: The canonical source of this file is maintained with the GNU C Library.
|
||||
Bugs can be reported to bug-glibc@prep.ai.mit.edu.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
@@ -14,13 +14,19 @@
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
USA. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
/* Some systems need this in order to declare localtime_r properly. */
|
||||
#ifndef _REENTRANT
|
||||
# define _REENTRANT 1
|
||||
#endif
|
||||
|
||||
#ifdef _LIBC
|
||||
# define HAVE_LIMITS_H 1
|
||||
# define HAVE_MBLEN 1
|
||||
@@ -32,10 +38,13 @@
|
||||
# define HAVE_TZSET 1
|
||||
# define MULTIBYTE_IS_FORMAT_SAFE 1
|
||||
# define STDC_HEADERS 1
|
||||
# include <ansidecl.h>
|
||||
# include "../locale/localeinfo.h"
|
||||
#endif
|
||||
|
||||
#if defined emacs && !defined HAVE_BCOPY
|
||||
# define HAVE_MEMCPY 1
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h> /* Some systems define `time_t' here. */
|
||||
|
||||
@@ -82,7 +91,17 @@ extern char *tzname[];
|
||||
# include <stdlib.h>
|
||||
# include <string.h>
|
||||
#else
|
||||
# define memcpy(d, s, n) bcopy ((s), (d), (n))
|
||||
# ifndef HAVE_MEMCPY
|
||||
# define memcpy(d, s, n) bcopy ((s), (d), (n))
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef _LIBC
|
||||
# define MEMPCPY(d, s, n) __mempcpy (d, s, n)
|
||||
#else
|
||||
# ifndef HAVE_MEMPCPY
|
||||
# define MEMPCPY(d, s, n) ((void *) ((char *) memcpy (d, s, n) + (n)))
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef __P
|
||||
@@ -132,14 +151,14 @@ extern char *tzname[];
|
||||
#ifdef _LIBC
|
||||
# define gmtime_r __gmtime_r
|
||||
# define localtime_r __localtime_r
|
||||
extern int __tz_compute __P ((time_t timer, const struct tm *tm));
|
||||
# define tzname __tzname
|
||||
# define tzset __tzset
|
||||
#else
|
||||
# if ! HAVE_LOCALTIME_R
|
||||
# if ! HAVE_TM_GMTOFF
|
||||
/* Approximate gmtime_r as best we can in its absence. */
|
||||
# define gmtime_r my_gmtime_r
|
||||
# undef gmtime_r
|
||||
# define gmtime_r my_gmtime_r
|
||||
static struct tm *gmtime_r __P ((const time_t *, struct tm *));
|
||||
static struct tm *
|
||||
gmtime_r (t, tp)
|
||||
@@ -155,7 +174,8 @@ gmtime_r (t, tp)
|
||||
# endif /* ! HAVE_TM_GMTOFF */
|
||||
|
||||
/* Approximate localtime_r as best we can in its absence. */
|
||||
# define localtime_r my_localtime_r
|
||||
# undef localtime_r
|
||||
# define localtime_r my_ftime_localtime_r
|
||||
static struct tm *localtime_r __P ((const time_t *, struct tm *));
|
||||
static struct tm *
|
||||
localtime_r (t, tp)
|
||||
@@ -169,32 +189,50 @@ localtime_r (t, tp)
|
||||
return tp;
|
||||
}
|
||||
# endif /* ! HAVE_LOCALTIME_R */
|
||||
#endif /* ! defined (_LIBC) */
|
||||
#endif /* ! defined _LIBC */
|
||||
|
||||
|
||||
#if !defined (memset) && !defined (HAVE_MEMSET) && !defined (_LIBC)
|
||||
#if !defined memset && !defined HAVE_MEMSET && !defined _LIBC
|
||||
/* Some systems lack the `memset' function and we don't want to
|
||||
introduce additional dependencies. */
|
||||
static const char spaces[16] = " ";
|
||||
/* The SGI compiler reportedly barfs on the trailing null
|
||||
if we use a string constant as the initializer. 28 June 1997, rms. */
|
||||
static const char spaces[16] = /* " " */
|
||||
{ ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ' };
|
||||
static const char zeroes[16] = /* "0000000000000000" */
|
||||
{ '0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0' };
|
||||
|
||||
# define memset_space(P, Len) \
|
||||
do { \
|
||||
int _len = (Len); \
|
||||
\
|
||||
\
|
||||
do \
|
||||
{ \
|
||||
int _this = _len > 16 ? 16 : _len; \
|
||||
memcpy ((P), spaces, _this); \
|
||||
(P) += _this; \
|
||||
(P) = MEMPCPY ((P), spaces, _this); \
|
||||
_len -= _this; \
|
||||
} \
|
||||
while (_len > 0); \
|
||||
} while (0)
|
||||
|
||||
# define memset_zero(P, Len) \
|
||||
do { \
|
||||
int _len = (Len); \
|
||||
\
|
||||
do \
|
||||
{ \
|
||||
int _this = _len > 16 ? 16 : _len; \
|
||||
(P) = MEMPCPY ((P), zeroes, _this); \
|
||||
_len -= _this; \
|
||||
} \
|
||||
while (_len > 0); \
|
||||
} while (0)
|
||||
#else
|
||||
# define memset_space(P, Len) memset ((P), ' ', (Len))
|
||||
# define memset_space(P, Len) (memset ((P), ' ', (Len)), (P) += (Len))
|
||||
# define memset_zero(P, Len) (memset ((P), '0', (Len)), (P) += (Len))
|
||||
#endif
|
||||
|
||||
#define add(n, f) \
|
||||
#define add(n, f) \
|
||||
do \
|
||||
{ \
|
||||
int _n = (n); \
|
||||
@@ -205,14 +243,19 @@ static const char spaces[16] = " ";
|
||||
if (p) \
|
||||
{ \
|
||||
if (_delta > 0) \
|
||||
memset_space (p, _delta); \
|
||||
{ \
|
||||
if (pad == '0') \
|
||||
memset_zero (p, _delta); \
|
||||
else \
|
||||
memset_space (p, _delta); \
|
||||
} \
|
||||
f; \
|
||||
p += _n; \
|
||||
} \
|
||||
i += _incr; \
|
||||
} while (0)
|
||||
|
||||
#define cpy(n, s) \
|
||||
#define cpy(n, s) \
|
||||
add ((n), \
|
||||
if (to_lowcase) \
|
||||
memcpy_lowcase (p, (s), _n); \
|
||||
@@ -245,7 +288,7 @@ memcpy_lowcase (dest, src, len)
|
||||
size_t len;
|
||||
{
|
||||
while (len-- > 0)
|
||||
dest[len] = TOLOWER (src[len]);
|
||||
dest[len] = TOLOWER ((unsigned char) src[len]);
|
||||
return dest;
|
||||
}
|
||||
|
||||
@@ -258,13 +301,15 @@ memcpy_uppcase (dest, src, len)
|
||||
size_t len;
|
||||
{
|
||||
while (len-- > 0)
|
||||
dest[len] = TOUPPER (src[len]);
|
||||
dest[len] = TOUPPER ((unsigned char) src[len]);
|
||||
return dest;
|
||||
}
|
||||
|
||||
|
||||
#if ! HAVE_TM_GMTOFF
|
||||
/* Yield the difference between *A and *B,
|
||||
measured in seconds, ignoring leap seconds. */
|
||||
# define tm_diff ftime_tm_diff
|
||||
static int tm_diff __P ((const struct tm *, const struct tm *));
|
||||
static int
|
||||
tm_diff (a, b)
|
||||
@@ -301,7 +346,7 @@ tm_diff (a, b)
|
||||
#define YDAY_MINIMUM (-366)
|
||||
static int iso_week_days __P ((int, int));
|
||||
#ifdef __GNUC__
|
||||
inline
|
||||
__inline__
|
||||
#endif
|
||||
static int
|
||||
iso_week_days (yday, wday)
|
||||
@@ -316,7 +361,7 @@ iso_week_days (yday, wday)
|
||||
}
|
||||
|
||||
|
||||
#ifndef _NL_CURRENT
|
||||
#if !(defined _NL_CURRENT || HAVE_STRFTIME)
|
||||
static char const weekday_name[][10] =
|
||||
{
|
||||
"Sunday", "Monday", "Tuesday", "Wednesday",
|
||||
@@ -329,6 +374,43 @@ static char const month_name[][10] =
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef emacs
|
||||
# define my_strftime emacs_strftime
|
||||
/* Emacs 20.2 uses `-Dstrftime=emacs_strftime' when compiling,
|
||||
because that's how strftime used to be configured.
|
||||
Undo this, since it gets in the way of accessing the underlying strftime,
|
||||
which is needed for things like %Ec in Solaris.
|
||||
The following two lines can be removed once Emacs stops compiling with
|
||||
`-Dstrftime=emacs_strftime'. */
|
||||
# undef strftime
|
||||
size_t strftime __P ((char *, size_t, const char *, const struct tm *));
|
||||
#else
|
||||
# define my_strftime strftime
|
||||
#endif
|
||||
|
||||
#if !defined _LIBC && HAVE_TZNAME && HAVE_TZSET
|
||||
/* Solaris 2.5 tzset sometimes modifies the storage returned by localtime.
|
||||
Work around this bug by copying *tp before it might be munged. */
|
||||
size_t _strftime_copytm __P ((char *, size_t, const char *,
|
||||
const struct tm *));
|
||||
size_t
|
||||
my_strftime (s, maxsize, format, tp)
|
||||
char *s;
|
||||
size_t maxsize;
|
||||
const char *format;
|
||||
const struct tm *tp;
|
||||
{
|
||||
struct tm tmcopy;
|
||||
tmcopy = *tp;
|
||||
return _strftime_copytm (s, maxsize, format, &tmcopy);
|
||||
}
|
||||
# undef my_strftime
|
||||
# define my_strftime(S, Maxsize, Format, Tp) \
|
||||
_strftime_copytm (S, Maxsize, Format, Tp)
|
||||
#endif
|
||||
|
||||
|
||||
/* Write information from TP into S according to the format
|
||||
string FORMAT, writing no more that MAXSIZE characters
|
||||
(including the terminating '\0') and returning number of
|
||||
@@ -336,7 +418,7 @@ static char const month_name[][10] =
|
||||
anywhere, so to determine how many characters would be
|
||||
written, use NULL for S and (size_t) UINT_MAX for MAXSIZE. */
|
||||
size_t
|
||||
strftime (s, maxsize, format, tp)
|
||||
my_strftime (s, maxsize, format, tp)
|
||||
char *s;
|
||||
size_t maxsize;
|
||||
const char *format;
|
||||
@@ -354,6 +436,7 @@ strftime (s, maxsize, format, tp)
|
||||
size_t am_len = strlen (a_month);
|
||||
size_t ap_len = strlen (ampm);
|
||||
#else
|
||||
# if !HAVE_STRFTIME
|
||||
const char *const f_wkday = weekday_name[tp->tm_wday];
|
||||
const char *const f_month = month_name[tp->tm_mon];
|
||||
const char *const a_wkday = f_wkday;
|
||||
@@ -362,9 +445,12 @@ strftime (s, maxsize, format, tp)
|
||||
size_t aw_len = 3;
|
||||
size_t am_len = 3;
|
||||
size_t ap_len = 2;
|
||||
# endif
|
||||
#endif
|
||||
#if defined _NL_CURRENT || !HAVE_STRFTIME
|
||||
size_t wkday_len = strlen (f_wkday);
|
||||
size_t month_len = strlen (f_month);
|
||||
#endif
|
||||
const char *zone;
|
||||
size_t zonelen;
|
||||
size_t i = 0;
|
||||
@@ -372,15 +458,13 @@ strftime (s, maxsize, format, tp)
|
||||
const char *f;
|
||||
|
||||
zone = NULL;
|
||||
#if !defined _LIBC && HAVE_TM_ZONE
|
||||
/* XXX We have some problems here. First, the string pointed to by
|
||||
tm_zone is dynamically allocated while loading the zone data. But
|
||||
when another zone is loaded since the information in TP were
|
||||
computed this would be a stale pointer.
|
||||
The second problem is the POSIX test suite which assumes setting
|
||||
#if HAVE_TM_ZONE
|
||||
/* The POSIX test suite assumes that setting
|
||||
the environment variable TZ to a new value before calling strftime()
|
||||
will influence the result (the %Z format) even if the information in
|
||||
TP is computed with a totally different time zone. --drepper@gnu */
|
||||
TP is computed with a totally different time zone.
|
||||
This is bogus: though POSIX allows bad behavior like this,
|
||||
POSIX does not require it. Do the right thing instead. */
|
||||
zone = (const char *) tp->tm_zone;
|
||||
#endif
|
||||
#if HAVE_TZNAME
|
||||
@@ -406,7 +490,7 @@ strftime (s, maxsize, format, tp)
|
||||
|
||||
for (f = format; *f != '\0'; ++f)
|
||||
{
|
||||
int pad; /* Padding for number ('-', '_', or 0). */
|
||||
int pad = 0; /* Padding for number ('-', '_', or 0). */
|
||||
int modifier; /* Field modifier ('E', 'O', or 0). */
|
||||
int digits; /* Max digits for numeric format. */
|
||||
int number_value; /* Numeric value to be printed. */
|
||||
@@ -419,6 +503,8 @@ strftime (s, maxsize, format, tp)
|
||||
int width = -1;
|
||||
int to_lowcase = 0;
|
||||
int to_uppcase = 0;
|
||||
int change_case = 0;
|
||||
int format_char;
|
||||
|
||||
#if DO_MULTIBYTE
|
||||
|
||||
@@ -494,7 +580,6 @@ strftime (s, maxsize, format, tp)
|
||||
#endif /* ! DO_MULTIBYTE */
|
||||
|
||||
/* Check for flags that can modify a format. */
|
||||
pad = 0;
|
||||
while (1)
|
||||
{
|
||||
switch (*++f)
|
||||
@@ -510,6 +595,9 @@ strftime (s, maxsize, format, tp)
|
||||
case '^':
|
||||
to_uppcase = 1;
|
||||
continue;
|
||||
case '#':
|
||||
change_case = 1;
|
||||
continue;
|
||||
|
||||
default:
|
||||
break;
|
||||
@@ -544,12 +632,15 @@ strftime (s, maxsize, format, tp)
|
||||
}
|
||||
|
||||
/* Now do the specified format. */
|
||||
switch (*f)
|
||||
format_char = *f;
|
||||
switch (format_char)
|
||||
{
|
||||
#define DO_NUMBER(d, v) \
|
||||
digits = d; number_value = v; goto do_number
|
||||
digits = width == -1 ? d : width; \
|
||||
number_value = v; goto do_number
|
||||
#define DO_NUMBER_SPACEPAD(d, v) \
|
||||
digits = d; number_value = v; goto do_number_spacepad
|
||||
digits = width == -1 ? d : width; \
|
||||
number_value = v; goto do_number_spacepad
|
||||
|
||||
case '%':
|
||||
if (modifier != 0)
|
||||
@@ -560,27 +651,58 @@ strftime (s, maxsize, format, tp)
|
||||
case 'a':
|
||||
if (modifier != 0)
|
||||
goto bad_format;
|
||||
if (change_case)
|
||||
{
|
||||
to_uppcase = 1;
|
||||
to_lowcase = 0;
|
||||
}
|
||||
#if defined _NL_CURRENT || !HAVE_STRFTIME
|
||||
cpy (aw_len, a_wkday);
|
||||
break;
|
||||
#else
|
||||
goto underlying_strftime;
|
||||
#endif
|
||||
|
||||
case 'A':
|
||||
if (modifier != 0)
|
||||
goto bad_format;
|
||||
if (change_case)
|
||||
{
|
||||
to_uppcase = 1;
|
||||
to_lowcase = 0;
|
||||
}
|
||||
#if defined _NL_CURRENT || !HAVE_STRFTIME
|
||||
cpy (wkday_len, f_wkday);
|
||||
break;
|
||||
#else
|
||||
goto underlying_strftime;
|
||||
#endif
|
||||
|
||||
case 'b':
|
||||
case 'h': /* POSIX.2 extension. */
|
||||
if (modifier != 0)
|
||||
goto bad_format;
|
||||
#if defined _NL_CURRENT || !HAVE_STRFTIME
|
||||
cpy (am_len, a_month);
|
||||
break;
|
||||
#else
|
||||
goto underlying_strftime;
|
||||
#endif
|
||||
|
||||
case 'B':
|
||||
if (modifier != 0)
|
||||
goto bad_format;
|
||||
if (change_case)
|
||||
{
|
||||
to_uppcase = 1;
|
||||
to_lowcase = 0;
|
||||
}
|
||||
#if defined _NL_CURRENT || !HAVE_STRFTIME
|
||||
cpy (month_len, f_month);
|
||||
break;
|
||||
#else
|
||||
goto underlying_strftime;
|
||||
#endif
|
||||
|
||||
case 'c':
|
||||
if (modifier == 'O')
|
||||
@@ -590,32 +712,58 @@ strftime (s, maxsize, format, tp)
|
||||
&& *(subfmt = _NL_CURRENT (LC_TIME, ERA_D_T_FMT)) != '\0'))
|
||||
subfmt = _NL_CURRENT (LC_TIME, D_T_FMT);
|
||||
#else
|
||||
# if HAVE_STRFTIME
|
||||
goto underlying_strftime;
|
||||
# else
|
||||
subfmt = "%a %b %e %H:%M:%S %Y";
|
||||
# endif
|
||||
#endif
|
||||
|
||||
subformat:
|
||||
{
|
||||
char *old_start = p;
|
||||
size_t len = strftime (NULL, maxsize - i, subfmt, tp);
|
||||
size_t len = my_strftime (NULL, maxsize - i, subfmt, tp);
|
||||
if (len == 0 && *subfmt)
|
||||
return 0;
|
||||
add (len, strftime (p, maxsize - i, subfmt, tp));
|
||||
add (len, my_strftime (p, maxsize - i, subfmt, tp));
|
||||
|
||||
if (to_uppcase)
|
||||
while (old_start < p)
|
||||
{
|
||||
*old_start = TOUPPER (*old_start);
|
||||
*old_start = TOUPPER ((unsigned char) *old_start);
|
||||
++old_start;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
#if HAVE_STRFTIME && ! (defined _NL_CURRENT && HAVE_STRUCT_ERA_ENTRY)
|
||||
underlying_strftime:
|
||||
{
|
||||
/* The relevant information is available only via the
|
||||
underlying strftime implementation, so use that. */
|
||||
char ufmt[4];
|
||||
char *u = ufmt;
|
||||
char ubuf[1024]; /* enough for any single format in practice */
|
||||
size_t len;
|
||||
*u++ = '%';
|
||||
if (modifier != 0)
|
||||
*u++ = modifier;
|
||||
*u++ = format_char;
|
||||
*u = '\0';
|
||||
len = strftime (ubuf, sizeof ubuf, ufmt, tp);
|
||||
if (len == 0)
|
||||
return 0;
|
||||
cpy (len, ubuf);
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
case 'C': /* POSIX.2 extension. */
|
||||
if (modifier == 'O')
|
||||
goto bad_format;
|
||||
#if HAVE_STRUCT_ERA_ENTRY
|
||||
if (modifier == 'E')
|
||||
{
|
||||
#if HAVE_STRUCT_ERA_ENTRY
|
||||
struct era_entry *era = _nl_get_era_entry (tp);
|
||||
if (era)
|
||||
{
|
||||
@@ -623,8 +771,13 @@ strftime (s, maxsize, format, tp)
|
||||
cpy (len, era->name_fmt);
|
||||
break;
|
||||
}
|
||||
}
|
||||
#else
|
||||
# if HAVE_STRFTIME
|
||||
goto underlying_strftime;
|
||||
# endif
|
||||
#endif
|
||||
}
|
||||
|
||||
{
|
||||
int year = tp->tm_year + TM_YEAR_BASE;
|
||||
DO_NUMBER (1, year / 100 - (year % 100 < 0));
|
||||
@@ -638,8 +791,13 @@ strftime (s, maxsize, format, tp)
|
||||
&& *(subfmt = _NL_CURRENT (LC_TIME, ERA_D_FMT)) != '\0'))
|
||||
subfmt = _NL_CURRENT (LC_TIME, D_FMT);
|
||||
goto subformat;
|
||||
#endif
|
||||
#else
|
||||
# if HAVE_STRFTIME
|
||||
goto underlying_strftime;
|
||||
# else
|
||||
/* Fall through. */
|
||||
# endif
|
||||
#endif
|
||||
case 'D': /* POSIX.2 extension. */
|
||||
if (modifier != 0)
|
||||
goto bad_format;
|
||||
@@ -669,9 +827,9 @@ strftime (s, maxsize, format, tp)
|
||||
do_number:
|
||||
/* Format the number according to the MODIFIER flag. */
|
||||
|
||||
#ifdef _NL_CURRENT
|
||||
if (modifier == 'O' && 0 <= number_value)
|
||||
{
|
||||
#ifdef _NL_CURRENT
|
||||
/* Get the locale specific alternate representation of
|
||||
the number NUMBER_VALUE. If none exist NULL is returned. */
|
||||
const char *cp = _nl_get_alt_digit (number_value);
|
||||
@@ -685,8 +843,12 @@ strftime (s, maxsize, format, tp)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
# if HAVE_STRFTIME
|
||||
goto underlying_strftime;
|
||||
# endif
|
||||
#endif
|
||||
}
|
||||
{
|
||||
unsigned int u = number_value;
|
||||
|
||||
@@ -727,6 +889,11 @@ strftime (s, maxsize, format, tp)
|
||||
cpy (buf + sizeof (buf) - bufp, bufp);
|
||||
break;
|
||||
|
||||
case 'F':
|
||||
if (modifier != 0)
|
||||
goto bad_format;
|
||||
subfmt = "%Y-%m-%d";
|
||||
goto subformat;
|
||||
|
||||
case 'H':
|
||||
if (modifier == 'E')
|
||||
@@ -776,11 +943,23 @@ strftime (s, maxsize, format, tp)
|
||||
|
||||
case 'P':
|
||||
to_lowcase = 1;
|
||||
#if !defined _NL_CURRENT && HAVE_STRFTIME
|
||||
format_char = 'p';
|
||||
#endif
|
||||
/* FALLTHROUGH */
|
||||
|
||||
case 'p':
|
||||
if (change_case)
|
||||
{
|
||||
to_uppcase = 0;
|
||||
to_lowcase = 1;
|
||||
}
|
||||
#if defined _NL_CURRENT || !HAVE_STRFTIME
|
||||
cpy (ap_len, ampm);
|
||||
break;
|
||||
#else
|
||||
goto underlying_strftime;
|
||||
#endif
|
||||
|
||||
case 'R': /* GNU extension. */
|
||||
subfmt = "%H:%M";
|
||||
@@ -846,8 +1025,13 @@ strftime (s, maxsize, format, tp)
|
||||
&& *(subfmt = _NL_CURRENT (LC_TIME, ERA_T_FMT)) != '\0'))
|
||||
subfmt = _NL_CURRENT (LC_TIME, T_FMT);
|
||||
goto subformat;
|
||||
#endif
|
||||
#else
|
||||
# if HAVE_STRFTIME
|
||||
goto underlying_strftime;
|
||||
# else
|
||||
/* Fall through. */
|
||||
# endif
|
||||
#endif
|
||||
case 'T': /* POSIX.2 extension. */
|
||||
subfmt = "%H:%M:%S";
|
||||
goto subformat;
|
||||
@@ -856,6 +1040,7 @@ strftime (s, maxsize, format, tp)
|
||||
add (1, *p = '\t');
|
||||
break;
|
||||
|
||||
case 'f':
|
||||
case 'u': /* POSIX.2 extension. */
|
||||
DO_NUMBER (1, (tp->tm_wday - 1 + 7) % 7 + 1);
|
||||
|
||||
@@ -919,26 +1104,30 @@ strftime (s, maxsize, format, tp)
|
||||
DO_NUMBER (1, tp->tm_wday);
|
||||
|
||||
case 'Y':
|
||||
#if HAVE_STRUCT_ERA_ENTRY
|
||||
if (modifier == 'E')
|
||||
{
|
||||
#if HAVE_STRUCT_ERA_ENTRY
|
||||
struct era_entry *era = _nl_get_era_entry (tp);
|
||||
if (era)
|
||||
{
|
||||
subfmt = strchr (era->name_fmt, '\0') + 1;
|
||||
goto subformat;
|
||||
}
|
||||
}
|
||||
#else
|
||||
# if HAVE_STRFTIME
|
||||
goto underlying_strftime;
|
||||
# endif
|
||||
#endif
|
||||
}
|
||||
if (modifier == 'O')
|
||||
goto bad_format;
|
||||
else
|
||||
DO_NUMBER (1, tp->tm_year + TM_YEAR_BASE);
|
||||
|
||||
case 'y':
|
||||
#if HAVE_STRUCT_ERA_ENTRY
|
||||
if (modifier == 'E')
|
||||
{
|
||||
#if HAVE_STRUCT_ERA_ENTRY
|
||||
struct era_entry *era = _nl_get_era_entry (tp);
|
||||
if (era)
|
||||
{
|
||||
@@ -946,11 +1135,20 @@ strftime (s, maxsize, format, tp)
|
||||
DO_NUMBER (1, (era->offset
|
||||
+ (era->direction == '-' ? -delta : delta)));
|
||||
}
|
||||
}
|
||||
#else
|
||||
# if HAVE_STRFTIME
|
||||
goto underlying_strftime;
|
||||
# endif
|
||||
#endif
|
||||
}
|
||||
DO_NUMBER (2, (tp->tm_year % 100 + 100) % 100);
|
||||
|
||||
case 'Z':
|
||||
if (change_case)
|
||||
{
|
||||
to_uppcase = 0;
|
||||
to_lowcase = 1;
|
||||
}
|
||||
cpy (zonelen, zone);
|
||||
break;
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user