Compare commits

...

205 Commits

Author SHA1 Message Date
axel
13a7269378 Bump version number
darcs-hash:20060422101024-ac50b-8cfc71d94572187d8d3a6ce890beee0a0225a09a.gz
2006-04-22 20:10:24 +10:00
axel
fd2644ce49 Tweaks to a few error messages (Thanks to Philip Ganchev)
darcs-hash:20060422100630-ac50b-18cef1e493321e8ad0cf65982dc1748965d02630.gz
2006-04-22 20:06:30 +10:00
axel
508de57459 Change setup to avoid invalid directories and warnings, also revert directory checking for fish_*_path, it makes sense to add non-empty directories to these
darcs-hash:20060421150558-ac50b-90aff08f81b3d280badba4cc14fb6a0897c39f9e.gz
2006-04-22 01:05:58 +10:00
axel
de2405b35a Add more descriptive error messages when trying to use variables in command names
darcs-hash:20060421142939-ac50b-d1809fa4687706b433d1d0a5e0a0c9d791de510f.gz
2006-04-22 00:29:39 +10:00
axel
a7f977836a Expand the switch/case documentation
darcs-hash:20060421083529-ac50b-f287424c0cc9377085b49492453d35a5512cbc90.gz
2006-04-21 18:35:29 +10:00
axel
f59e4a88c6 If PATH is unset, use a default value
darcs-hash:20060420183502-ac50b-8e746ae4ed00c354712cf61e57e0a187aa40a4fa.gz
2006-04-21 04:35:02 +10:00
axel
c755bd0358 Only allow real directories in PATH, CDPATH, etc. If user tries to use ':' instead of arrays, give a friendly pointer on how to use arrays
darcs-hash:20060420182944-ac50b-fbb5dc63c2a4d3fe3bde92ad7699b1cad972dd0f.gz
2006-04-21 04:29:44 +10:00
axel
536523ffd7 Minor comment and documentation edits
darcs-hash:20060420150206-ac50b-c5c91053ee37a6c3f763287c42b430cdc99bb45b.gz
2006-04-21 01:02:06 +10:00
axel
ca82fc2f03 Add missing documentation for the read builtin
darcs-hash:20060420150124-ac50b-71a94cea3fedb0265af71718022e54e42567d69e.gz
2006-04-21 01:01:24 +10:00
axel
d1411c42d6 Minor edits to Makefile. A mistyped .PHONY was corrected, a few stray .o files are now properly removed by make clean, and the dependency list has been updated
darcs-hash:20060420150028-ac50b-b3b6b04023f1c039d167e5f67c89cbbaa6bd0cdc.gz
2006-04-21 01:00:28 +10:00
axel
9d770af5f4 Earlier history in non-interactive mode bugfix contained a new bug causing fish to crash if read is not used in non-interactive mode
darcs-hash:20060419234211-ac50b-886a33e96cb3f95e9b2c632f03eb3b2b20a560fd.gz
2006-04-20 09:42:11 +10:00
axel
d1ff6a323a Bump version number
darcs-hash:20060419124513-ac50b-f0c4bacee786ca9e147a86004aa90f5a09c04b34.gz
2006-04-19 22:45:13 +10:00
axel
112ea1759a Minor code cleanup
darcs-hash:20060419124315-ac50b-e7e9cafe6850e1fe805bad82278d15c2de327f5d.gz
2006-04-19 22:43:15 +10:00
axel
76bafbef2a Make the read builtin accept 0 parameters and drop the input instead of showing an error message
darcs-hash:20060419100830-ac50b-50f96925481bb29ad840fb12240ef9b9b86d18c4.gz
2006-04-19 20:08:30 +10:00
axel
1947ec88f1 Remove minor memory leak on init
darcs-hash:20060419095818-ac50b-d2146525feba5f00d224bce920ab40cc023e390d.gz
2006-04-19 19:58:18 +10:00
axel
d0956f1e43 Use libc implementations of wcslcpy and wcslcat if they exist. Move internal implementations to fallback.c.
darcs-hash:20060419095628-ac50b-0e94e4205306bb99bb9dea72eec43b442520bf1b.gz
2006-04-19 19:56:28 +10:00
axel
6996c7718e Always init history on startup, to avoid destorying history multiple times when reading interactively in a non-interactive script
darcs-hash:20060419095502-ac50b-abf2fe39cf9c027bdbc69d78fe858e946f7c81f2.gz
2006-04-19 19:55:02 +10:00
axel
45d56d8e05 Drop all calls to wcsncpy
darcs-hash:20060413121851-ac50b-1f479b96b3aa1050a30e9ee0ed27cc107ce2bc45.gz
2006-04-13 22:18:51 +10:00
axel
53295d38b7 Change var_entry_t struct to be ANSI C compliant (Wastes a few hundred bytes)
darcs-hash:20060410160109-ac50b-fa8b097722f06aee5fb09095e89f6b39ff90d44b.gz
2006-04-11 02:01:09 +10:00
axel
bd9c843fd1 Add warning when trying to change read-only variable
darcs-hash:20060410153626-ac50b-700ff7687647b8aab47ba79d759d1739cbe60425.gz
2006-04-11 01:36:26 +10:00
axel
f812b9b26c Fix bug in type command causing type -f to return true even when no file was found
darcs-hash:20060410143201-ac50b-4d8a70cd9721edcddaf11324f0b575d3f8cbace8.gz
2006-04-11 00:32:01 +10:00
axel
52851a3ba4 Quote Doxygen test in configure script to remove warning - thanks to Ray Hammond for the report and the fix
darcs-hash:20060410141909-ac50b-f310b7e326ce28ae8a3bbc1a3c1d247511f3d860.gz
2006-04-11 00:19:09 +10:00
axel
b1bf115fa2 Bump version number
darcs-hash:20060408143210-ac50b-0a143a45d0510e67a75024b802a1ca677480e4c0.gz
2006-04-09 00:32:10 +10:00
axel
0f25ef365d Tiny documentation edits
darcs-hash:20060408143134-ac50b-eae8cf585d3801b51bba415955ef2aacf98baeb2.gz
2006-04-09 00:31:34 +10:00
axel
55ea4b6fc0 Documentation additions
darcs-hash:20060405132928-ac50b-d551c31d04426c75c756d513e02e34b91bfc4ad6.gz
2006-04-05 23:29:28 +10:00
axel
5ef8cccf21 Mention in the license section that fish includes the glibc wcstok implementation as a fallback for libc implementations lacking wcstok
darcs-hash:20060405125956-ac50b-9e5b51d94676868365878387cd8c7e14a1684348.gz
2006-04-05 22:59:56 +10:00
axel
5613d96001 Do not call autoconf in Makefile, since configure will automatically reconfigure itself if configure.ac has changed
darcs-hash:20060405124918-ac50b-0f45ddc7759383d930e0473a281f092566570210.gz
2006-04-05 22:49:18 +10:00
axel
5d9ba8c1a2 Delete some commented code and tweak a few comments
darcs-hash:20060405124825-ac50b-8242b2a9c788cf147f864329797b2e24a7040f0b.gz
2006-04-05 22:48:25 +10:00
axel
0de232bf54 Do not return to the shell until all processes of a job have finished (Previous behaviour was to return once the last job had exited, and could cause e.g. the jobs builtin to print out the job responsible for repainting the titlebar). Also validate that jobs have not completed in various places where the job list is examined
darcs-hash:20060404112722-ac50b-4b6a55ce7c57d39213cdd0ed0f581795a72859b7.gz
2006-04-04 21:27:22 +10:00
axel
db5b887824 PPC fix by James Vega, fixing an issue with a variable named putc, which clashed with the putc macro
darcs-hash:20060403150422-ac50b-78d5db541cb1f41bfea55deac7578c0df73605bd.gz
2006-04-04 01:04:22 +10:00
axel
634bdb8b3b Release 1.21.3
darcs-hash:20060402111721-ac50b-f5df9a3a3154a9bb37f4fcc6db3d4f44d12830ce.gz
2006-04-02 21:17:21 +10:00
axel
9c579a37bb Swedish translation checkin
darcs-hash:20060402111659-ac50b-c23841e44c3de1cc4db9c2897fff59faf820c3d9.gz
2006-04-02 21:16:59 +10:00
axel
1502acd83e Add tar and dist Makefile targets
darcs-hash:20060402111622-ac50b-8ac169b0f05fd68c1c8a375ae60049422e3fad47.gz
2006-04-02 21:16:22 +10:00
axel
ef3430f669 Add Makefile rules for regenerating Makefile, configure script, etc. when needed
darcs-hash:20060402111525-ac50b-533e15f7ab5d63c2f8258b5a5ae8adc5bafd9221.gz
2006-04-02 21:15:25 +10:00
axel
01af64cf1f Add missing space in shellscript for building rpms
darcs-hash:20060331165626-ac50b-922778808ac54955cf6b1a43e4ae5e2264ac6ae1.gz
2006-04-01 02:56:26 +10:00
axel
349f52a1a5 Telnet completions from Sean Higgins
darcs-hash:20060331165554-ac50b-5b0300d89ac2b2fbc6bc4bfcf228572fdce2e284.gz
2006-04-01 02:55:54 +10:00
axel
850aa1963f Change rpm .spec file so it will work both on systems that install X headers in /usr/include and /usr/X11R6/include
darcs-hash:20060329213330-ac50b-b478b18ae9aeb070ade5176c9813ffb74ac7006e.gz
2006-03-30 07:33:30 +10:00
axel
185d0c3c1c Minor edits in configure.ac
darcs-hash:20060329213124-ac50b-8d25a34d621d698425b54e032238a2fe89d4a031.gz
2006-03-30 07:31:24 +10:00
axel
3656443b1f Update section about compilers in INSTALL file to reflect that fish is known to work with ICC
darcs-hash:20060329213031-ac50b-34ca7b4f2ba557faf7d1ad17bde194b1a1f0acce.gz
2006-03-30 07:30:31 +10:00
axel
6748b9699f Make parser_is_block public
darcs-hash:20060329212942-ac50b-ad8334532a719152766b4b530474616b78564f24.gz
2006-03-30 07:29:42 +10:00
axel
dc91d7aec4 Further improvements to build system wrt detection of compiler and libc features and prototypes, as discussed with James Antill on mailin list
darcs-hash:20060329002500-ac50b-e7618e476ea69802bd2cb0076244f49a0f178df7.gz
2006-03-29 10:25:00 +10:00
axel
13a51ba4c2 Fix warnings from ICC
darcs-hash:20060329001450-ac50b-9c3fe4f7ca14a077997c421616c07dde03b48c6d.gz
2006-03-29 10:14:50 +10:00
axel
749dad1309 Fix wildcarding bug where ? at end of wildcard could match 0 characters
darcs-hash:20060328180916-ac50b-6f77d936a1e46e411a12ca96fd9ad3bb844d321b.gz
2006-03-29 04:09:16 +10:00
axel
7a07d7c188 Add hint on how to fix missing rpm-build when trying make rpm
darcs-hash:20060326175237-ac50b-703940a231be96991d5d94c451b12f7c4e6f649f.gz
2006-03-27 03:52:37 +10:00
axel
53c95abfb2 Change how a few pointer are supplied to functions, removes warnings about breaking aliasing rules
darcs-hash:20060326112339-ac50b-eb135567f6a6183e5dbc310c093d2139ecc8fa4b.gz
2006-03-26 21:23:39 +10:00
axel
7fd2ae4ffd Third try on correct fallback headers - re-add the checks to only include prototypes for functions which are known to be missing, and also add any compiler directives which may help in adding additional prototypes in the system headers (separate patch)
darcs-hash:20060325162103-ac50b-18f5074838a1c304c3d013378b7fa4e66b544cd9.gz
2006-03-26 02:21:03 +10:00
axel
717ac3f7fe Remove gcc-specific cflags from makefile. Add them in the configure file, but only if the compiler is gcc.
darcs-hash:20060325161848-ac50b-23919c1d23bbc5eed81fd709b95802ea2d4e8f52.gz
2006-03-26 02:18:48 +10:00
axel
50fa7234ea Fix completion describtion bug causing filesizes below 1024 bytes to be reported as 0 bytes on big-endian systems
darcs-hash:20060322001712-ac50b-1a42b3dcb868161f13d45d80d16aeb119f6ec9cd.gz
2006-03-22 10:17:12 +10:00
axel
80b4055eab Add support for the -n switch to skip execution of any commands
darcs-hash:20060318010459-ac50b-9d9e5c489e0e4df2159d8c1d0ff952d42e2a2a82.gz
2006-03-18 11:04:59 +10:00
axel
94b7c8d5e6 Don't call the type function when defining the _ function, as this will cause a recursive dependency
darcs-hash:20060317132356-ac50b-4b3b0b6ec3f2e82649c74cc358f1505bf202bbd4.gz
2006-03-17 23:23:56 +10:00
axel
580ec26885 Minor code tweak in type function, and add a missing newline to an output string
darcs-hash:20060317132256-ac50b-87c066ec3aba2eded333ecbf2198de001c313570.gz
2006-03-17 23:22:56 +10:00
axel
6ba5d80a20 Cleanup after patch conflict
darcs-hash:20060314002216-ac50b-c5b2b0d677f45818d2496f00fb9cfc774460397e.gz
2006-03-14 10:22:16 +10:00
axel
d58b9de63b Use 'type -f' instead of 'which' to test for presense of command, since the latter does not set the exit status correctly on all platforms
darcs-hash:20060314002127-ac50b-6ed726bdcc9e3a7a9608a904c382973799dc73ef.gz
2006-03-14 10:21:27 +10:00
npilon
99a93b5add Fish PATH Fix
Moved PATH detection code to the start of share/fish.

darcs-hash:20060313190724-c90d9-8e2e80910041e91b48d68154e9d8180d04689463.gz
2006-03-14 05:07:24 +10:00
npilon
de50539c02 gettext detection fix
The current method of gettext detection is broken on (at least) OS X and Solaris, where which always returns successfully. This method seems to work on Linux, OS X, and Solaris.

darcs-hash:20060313014458-c90d9-8b169581a8632b6a47c61310ef3c976abd67d8e0.gz
2006-03-13 11:44:58 +10:00
npilon
04cf08b93b xargs completion fix
Added a missing -d to a couple of xargs completions.

darcs-hash:20060313014433-c90d9-b7c6e444ecea0ed2e75304bd9663d20ea55df0ff.gz
2006-03-13 11:44:33 +10:00
npilon
2c5b52eb6c OS X Compilation Fix
Tweak to fallback.h to make it compile under OS X. As shipped with fish 1.21.2, this causes a lot of warnings and then dies.

darcs-hash:20060313014333-c90d9-de59932f81dd6debbfb48225893983df485df12b.gz
2006-03-13 11:43:33 +10:00
axel
dd8150d98d Minor comment and documentation changes
darcs-hash:20060314000914-ac50b-63c49a59804f51c4dd19de574db41298b1ef67c5.gz
2006-03-14 10:09:14 +10:00
axel
99662d7711 Move typedef of tputs_arg_t from common.h to fallback.h
darcs-hash:20060314000801-ac50b-466d5b90d9a1bea0e55c8657748edf6663edd06f.gz
2006-03-14 10:08:01 +10:00
axel
5f3ad87a98 Make the type builtin not rely on the exit status of the which command
darcs-hash:20060314000641-ac50b-cc92a519b6c8981a50aea0f25f407dfe2b5f51dc.gz
2006-03-14 10:06:41 +10:00
axel
83d05f9170 Move to end of current token on completion
darcs-hash:20060311115612-ac50b-70f15c50b6cb8ad89d84ae6c8a3ffc4b7551223b.gz
2006-03-11 21:56:12 +10:00
axel
0d56818664 Fix bad return status in read builtin
darcs-hash:20060310195100-ac50b-2b7d94510661d901fd804074e6cf03e926dddc79.gz
2006-03-11 05:51:00 +10:00
axel
5b0cd5a911 Changes in quoting of backslashes lead to minor bug in awk script for munging command descriptions
darcs-hash:20060310142808-ac50b-75e4be2daa924e4a565b1a11f69068340022c367.gz
2006-03-11 00:28:08 +10:00
axel
102b99a17b Add further checks to unicode_start to see that the command exists
darcs-hash:20060310135129-ac50b-8345a137b73e91084ad82cba06413580e3ca87e7.gz
2006-03-10 23:51:29 +10:00
axel
6222d00ffc Add minor comment about error handling to configure.ac
darcs-hash:20060310135024-ac50b-dd496725134db7eb3b55e7358a37eec481043b3e.gz
2006-03-10 23:50:24 +10:00
axel
73370f5f39 Avoid extended regexps in grep, they are not portable
darcs-hash:20060310134350-ac50b-7138e53ed815986ccb78e909f50c9939382a1e89.gz
2006-03-10 23:43:50 +10:00
axel
883ce6e440 Adapt key_reader to changes in buildfiles
darcs-hash:20060310134317-ac50b-14691f97a817f52f663679797e69f60419ec5d03.gz
2006-03-10 23:43:17 +10:00
axel
f320f5f710 Move LANG init back to /etc where it belongs. IT was temporarily moved earlier to do some translations at init time, but that is no longer needed
darcs-hash:20060310134039-ac50b-e826176a9d574b26235013384963f2dd7e9e9457.gz
2006-03-10 23:40:39 +10:00
axel
32b531667a Fix bug that causing terminal corruption if a job is put under job control before running in interactive mode. This is fixed by doing more inits at startup (but only slightly more)
darcs-hash:20060310133809-ac50b-d31cd7bab1a3a58de2833f73735817a3d0b3ed7d.gz
2006-03-10 23:38:09 +10:00
axel
c47dae77a4 Bump version number
darcs-hash:20060309120008-ac50b-071e0ba004f208993cc09f1494dcae7b8be17a25.gz
2006-03-09 22:00:08 +10:00
axel
53160d134e Swedish translation additions (incomplete)
darcs-hash:20060309115938-ac50b-ad4fa762e70fcf3116f8db52a0740f92c3367c3e.gz
2006-03-09 21:59:38 +10:00
axel
619defd748 Update todo list
darcs-hash:20060309115916-ac50b-da0ad8d0b29088c9d9daff4ec0c856289d8dd93d.gz
2006-03-09 21:59:16 +10:00
axel
40db2b3c2a Further comment clarification on -fno-optimize-sibling
darcs-hash:20060309115638-ac50b-e6a67c4061bd576a8de261d46b85d984fd926b0c.gz
2006-03-09 21:56:38 +10:00
axel
b05ccee0f0 Remove extra spaces in descriptions for a few completions
darcs-hash:20060309115250-ac50b-c0c30e25f9d3e4b9390924a5a5686ad5dc159882.gz
2006-03-09 21:52:50 +10:00
axel
d722fa59ca Add completions for cdrecord, patch and xargs
darcs-hash:20060306232645-ac50b-89f38afaa1ae3106c18fc55acc75fc0dd702bd9a.gz
2006-03-07 09:26:45 +10:00
axel
60065614bd Updates to the swedish translation
darcs-hash:20060306231504-ac50b-93579475d50f2d643676a0b93d520fcbd9ffabdf.gz
2006-03-07 09:15:04 +10:00
axel
05b39a9bdb Drop the -fno-strict-aliasing flag for GCC in Makefile.in, since it dealt with type punning using anonymous unions, which fish doesn't have anymore
darcs-hash:20060306184924-ac50b-cfcb9fff791a1fc6d8d18961cf760c13829b5707.gz
2006-03-07 04:49:24 +10:00
axel
91ab644173 Add support for \\ in quoted strings
darcs-hash:20060306015012-ac50b-a510764b624d1e4416d134f5b92532e046a6125b.gz
2006-03-06 11:50:12 +10:00
axel
083fcd6491 Remove fish_tests when doing make clean. This patch has been applied before, but must have gotten lost along the way.
darcs-hash:20060305212706-ac50b-751e88e86e03b94a18566ce02a0808697298d3bf.gz
2006-03-06 07:27:06 +10:00
axel
7e9e7d77d1 Add output message when uninstalling legacy fish version
darcs-hash:20060305212630-ac50b-8ff128370f83ef6d12a1f3941a7fd6f73852dbc3.gz
2006-03-06 07:26:30 +10:00
axel
66ee644130 Make the functions for setting default values use gobal values if universal variables are broken
darcs-hash:20060305212601-ac50b-075bc6976435e5bd86151603cb8f0fc634c542bb.gz
2006-03-06 07:26:01 +10:00
axel
c20b8982bc Always define prototypes in fallback.h, so that if the prototypes are missing in the libc headers, things will still work
darcs-hash:20060305212513-ac50b-11820bbcc4193d8588246848161909baf3726edf.gz
2006-03-06 07:25:13 +10:00
axel
15bb8f712d Add missing includes
darcs-hash:20060305212411-ac50b-4d672d98dd57914be7906e756e5e59e15bb02570.gz
2006-03-06 07:24:11 +10:00
axel
d48e9ef8b1 Some compiler flag tweaks, and elaborated comments on compiler flags use
darcs-hash:20060305212330-ac50b-f37c3f5464545965c1b4ace9282622111f8783a9.gz
2006-03-06 07:23:30 +10:00
axel
acd28b5dc4 Re-add accidantally removed HAVE_GETTEXT substitution
darcs-hash:20060302134541-ac50b-c3b8feb5e7838dac62465b08f809c16408473da3.gz
2006-03-02 23:45:41 +10:00
axel
1fe4863039 Automatically rerun autoconf inside configure when needed
darcs-hash:20060302134444-ac50b-3fc88b85997b1839989e786db63ce6d44dbff2a8.gz
2006-03-02 23:44:44 +10:00
axel
d347da963b Add documentation about indirect variable expansion
darcs-hash:20060302115108-ac50b-6803fad305e1caff02b33ab31bec869ac05a018e.gz
2006-03-02 21:51:08 +10:00
axel
930bb9c6d1 Remove warning for missing history value - it is not a bug
darcs-hash:20060302113314-ac50b-65bd93a0e31e5ac69167ecc84346fa44d55dec71.gz
2006-03-02 21:33:14 +10:00
axel
676c3ed505 Small edit in common.c
darcs-hash:20060302113142-ac50b-33e3e91e0ae1787784fde100c9c0878cdd2ed45f.gz
2006-03-02 21:31:42 +10:00
axel
2d3588fa51 Add two newlines to german translation
darcs-hash:20060302113055-ac50b-56d31b568f3174e3808d7d06f0fbd398d47e1270.gz
2006-03-02 21:30:55 +10:00
axel
4835945c09 Add missing includes in fallback.c
darcs-hash:20060302113029-ac50b-cd2416c2a687beade622aae6ca0e87afd52195d8.gz
2006-03-02 21:30:29 +10:00
axel
82bff9f407 Unbreak fwprintf autoconf check cpp symbols
darcs-hash:20060302112917-ac50b-29d524dc3df09ad9a6e88669e6c20f46677ec2ee.gz
2006-03-02 21:29:17 +10:00
axel
3b6d8756ea Fix various uses of the GNUism of allowing backslash escapes in the second half of a sed regexp substitution
darcs-hash:20060302112808-ac50b-46cdf8e99f8f6e8cab0d54f32cf4e4d309775aa1.gz
2006-03-02 21:28:08 +10:00
axel
d1bb30afae Better commenting in configure.ac
darcs-hash:20060302014729-ac50b-fba9ec3e24abb387bc63effbc86dd9177a9b95f0.gz
2006-03-02 11:47:29 +10:00
axel
7a1d64637d Add additional -I includes to both CFLAGS and CPPFLAGS
darcs-hash:20060302013016-ac50b-38373bd0c6fd64189e4f87a90171cfa716ecf11e.gz
2006-03-02 11:30:16 +10:00
axel
5f85d27671 Add an autoconf test to verify that fwprintf doesn't crash to avoid non-working fish on DragonFlyBSD
darcs-hash:20060302012858-ac50b-df97c2a1b4770473d2724222c51abe7110715813.gz
2006-03-02 11:28:58 +10:00
axel
5d828b5fcf Remove correct files when using make distclean
darcs-hash:20060302012654-ac50b-e441be3287ca2a14d11fc8491a45407e72b6598a.gz
2006-03-02 11:26:54 +10:00
axel
c2f6c6c1d2 Do gettext translation of descriptions just-in-time internally in fish
darcs-hash:20060301165347-ac50b-3df9feec60dd9860e0988396d10b550a501f6802.gz
2006-03-02 02:53:47 +10:00
axel
7726cffdab Update to latest config.sub and config.guess versions
darcs-hash:20060301162821-ac50b-508c855d9be360cdd4cb46fe9c4a6b2f0414ab65.gz
2006-03-02 02:28:21 +10:00
axel
3570013496 Use correct objects list when building mimedb
darcs-hash:20060301012818-ac50b-aa2429ac2b7a0af4d91e4b59038e345115a6350f.gz
2006-03-01 11:28:18 +10:00
axel
2401a163fe Move all fallbacks for standard and not-so-standard unix functions to fallback.c, in order to have a one-stop place to look for such functions
darcs-hash:20060228131716-ac50b-0832193dbcaf7191dcb24456dc40f2e861a1382e.gz
2006-02-28 23:17:16 +10:00
axel
e8d802c5e1 Bump version number to 1.21.1
darcs-hash:20060225112956-ac50b-d54565f84c9082c32bf0110163ab495778a9c347.gz
2006-02-25 21:29:56 +10:00
axel
dca4167de6 Fix broken function/completion paths, sent by Sean Higgins
darcs-hash:20060225112911-ac50b-c1aa4f172f4aae5d725230ccba43cdc1fce924f5.gz
2006-02-25 21:29:11 +10:00
axel
6d0b6e5de5 Bump version number to 1.21.0
darcs-hash:20060225022220-ac50b-27a71eef149c0caa5336d425f24686ce152dcad1.gz
2006-02-25 12:22:20 +10:00
axel
fd6bf06f15 Various minor edits
darcs-hash:20060225022139-ac50b-9ef43f88e2266978e9b39038a6a5087ff1305509.gz
2006-02-25 12:21:39 +10:00
axel
d2e11ea61d Fix crash bug on invalid input to fish_pager
darcs-hash:20060224184050-ac50b-da122d893fa0e2aabbd48058c696e2815c4657ca.gz
2006-02-25 04:40:50 +10:00
axel
dad2b93d1e Add functiopn prototype completions for valgrind --alloc-fn
darcs-hash:20060224135618-ac50b-bcd2fa57593f6a5c9f41b9513ac25f859baf1659.gz
2006-02-24 23:56:18 +10:00
axel
1075ca69b0 Switch to standard syntax for octal escapes
darcs-hash:20060224121829-ac50b-8e19f27857378e6456ae08269721138bd60f3464.gz
2006-02-24 22:18:29 +10:00
axel
e29f5c5474 Add an FAQ section to the documentation, and remove a few seactions of the manual containing introductory material on fish which was no longer accurate
darcs-hash:20060224011446-ac50b-e9246e23dbf725a3e2488f7831b1c7420cdd42db.gz
2006-02-24 11:14:46 +10:00
axel
22bfa6638a Update of the makefile on how to handle the directory hierarchy transition
darcs-hash:20060223153556-ac50b-4af8c2376a37c28f056b7fef37db3fb371a3e899.gz
2006-02-24 01:35:56 +10:00
axel
1a48941f6b Protect against double-free of the process argument list
darcs-hash:20060222175107-ac50b-87c36439e2ec2f8be652db1595dad9a09e20f36c.gz
2006-02-23 03:51:07 +10:00
axel
68e0c94dbb Do not unescape strings from completion callouts. Why was this done before?
darcs-hash:20060222174716-ac50b-218c6896918e5cf8047ea6291a8cde44061d0b57.gz
2006-02-23 03:47:16 +10:00
axel
ca04fc745d Add some input validation code to various functions
darcs-hash:20060222154152-ac50b-608032284165f099beecd1cd4f7c6bb2b45df432.gz
2006-02-23 01:41:52 +10:00
axel
3afead1827 Documentation clarification for the cd builtin
darcs-hash:20060222142137-ac50b-cc9200ed23fa5796a56dc4ee3dde1ff7e8768fc3.gz
2006-02-23 00:21:37 +10:00
axel
0ea69dab7b Drop unuses error counter for string conversions
darcs-hash:20060222142042-ac50b-25f2e050c680071ccec6989e477f6db5904a2713.gz
2006-02-23 00:20:42 +10:00
axel
a4a025b786 Allow multiple slashes in a wildcard to be used as a single directory separator
darcs-hash:20060221154738-ac50b-e4b35d3604d8e39d3aff7b8da38617272bd6e89e.gz
2006-02-22 01:47:38 +10:00
axel
328c3a39a1 Move _ shellscript function to it's own file
darcs-hash:20060221153701-ac50b-05cecdac1221e0abc709d9e9c1799faa7986fa78.gz
2006-02-22 01:37:01 +10:00
axel
5aa019a0b5 Fix off-by-one error resulting in truncated output from wcsndup fallback and halloc_wcsndup
darcs-hash:20060221144642-ac50b-9dcd77238bc4bd740bbda6e15ded793fad44c363.gz
2006-02-22 00:46:42 +10:00
axel
92aa99104a Fix rare accidental ellipsisizing of strings that will actually fit in fish_pager
darcs-hash:20060221103435-ac50b-f46a08e29e7860886a357bc1c5d314b594793e68.gz
2006-02-21 20:34:35 +10:00
axel
6b544bc3c2 API documentation, code style cleanup, etc.
darcs-hash:20060220131146-ac50b-6ec3664e5e3eaefa2296a93d39014058df37fdf2.gz
2006-02-20 23:11:46 +10:00
axel
ea0005e16d Move code for setting ls and grep colors to function definition files
darcs-hash:20060220130203-ac50b-feb426f6450a0bbd17cb9dacdca94d4d5b72c113.gz
2006-02-20 23:02:03 +10:00
axel
6901ad361d Make fish continue parsing/executing a file if a command is not found
darcs-hash:20060220125524-ac50b-1f85e530cbbcb45988254c75cd45c11395c5cd27.gz
2006-02-20 22:55:24 +10:00
axel
b21cccf5f0 A flag got reversed, causing children to execute even if an IO redirection failed
darcs-hash:20060220014036-ac50b-43156940397e0535cfa9dd7e88d61e4ca4bab13b.gz
2006-02-20 11:40:36 +10:00
axel
7740035d14 Remove some ancient debug messages, drop two warnings, add some braces and other minor code tweaks
darcs-hash:20060219181932-ac50b-2d032e7a64257a6ca0db078ea9c81ae04a01120f.gz
2006-02-20 04:19:32 +10:00
axel
7dc3934997 Use variable name as index for tables when autoloading functions and completions in order to better handle changes on path variable values
darcs-hash:20060219170116-ac50b-8f617c6f8960660e6227827914dc910a78655c13.gz
2006-02-20 03:01:16 +10:00
axel
845e15876c Minor edits, additional comments, etc.
darcs-hash:20060219015438-ac50b-b6346876460912f3c27d1bb4287aeab962260ab6.gz
2006-02-19 11:54:38 +10:00
axel
c4e7a7992f Fix bug causing fish to occasionally reset line number for error reporting
darcs-hash:20060219011702-ac50b-c72b1f5ae56d3757c3fbfca002f1bc33c36a7660.gz
2006-02-19 11:17:02 +10:00
axel
43ab84397b Make sure that command specific completions can handle input strings with wildcards reasonably well
darcs-hash:20060219011432-ac50b-89a73a3d414f2dbd8a213b851fcb1c494e022eae.gz
2006-02-19 11:14:32 +10:00
axel
0840c9248f Give more detail in an error message
darcs-hash:20060218024346-ac50b-f26f6ef107fffa398b6ff61baff81914b998940a.gz
2006-02-18 12:43:46 +10:00
axel
dd79d75504 Move a few shellscript bits around
darcs-hash:20060218024145-ac50b-207ca782808ea8968cb38253c7bc2563350f38b2.gz
2006-02-18 12:41:45 +10:00
axel
7073f0b58b Change translation file offsets in swedish translation, needed to avoid darcs hang
darcs-hash:20060218023559-ac50b-bf6f5802b7ab810a3a8167f92358c085e3f02401.gz
2006-02-18 12:35:59 +10:00
axel
15916bfbdc Update build dependencies
darcs-hash:20060218023432-ac50b-9cfdc633f4b6834dea4324f429b1decca6d9e110.gz
2006-02-18 12:34:32 +10:00
axel
228fdbef5a Use the right sources for generating translation strings
darcs-hash:20060218023332-ac50b-5a2cec156ad5c49d052f17cf14fd14e72e0aa137.gz
2006-02-18 12:33:32 +10:00
axel
7f7f8fb156 Fix broken call to source /fish/fish on startup
darcs-hash:20060217223236-ac50b-384ea2549a2bbf445842700e693f5edc8bf72023.gz
2006-02-18 08:32:36 +10:00
axel
2ae9735858 Add the LGPL license to the license section of the documentation - xdgmime is released under this license. Also add a few rulers, and make some other minor edits to the license section.
darcs-hash:20060217222051-ac50b-8fc2e6d4e32d0f7f67cde8ff475ec0e16f72ffa1.gz
2006-02-18 08:20:51 +10:00
axel
8ac1688c89 Allow backslash-escaping of newlines
darcs-hash:20060217164119-ac50b-6efd2491fb7f504ad26ca35b2a7421d24c61ec63.gz
2006-02-18 02:41:19 +10:00
axel
9cd2dbc9e7 Remove note about problem with ancient fish version
darcs-hash:20060217125341-ac50b-8f4dc873c8b7146cfdae00b62a139c0643e4156e.gz
2006-02-17 22:53:41 +10:00
axel
a74055bc33 Proper ordering on paths for dynamic loading - user stuff should override sysadmin stuff should overrtide default stuff
darcs-hash:20060217125318-ac50b-f74103958cf01103b351227ae561703ac96ebe95.gz
2006-02-17 22:53:18 +10:00
axel
e1d0b9370e Minor edits in parse_util.c
darcs-hash:20060217125205-ac50b-f3cd1572eec966581730ee1983d06b64caac566f.gz
2006-02-17 22:52:05 +10:00
axel
5dfa28059e Remove dropped fish_function.fish from Makefile
darcs-hash:20060217103540-ac50b-5ea95b93bd93512100e652e2cd8146d4f2fdbf58.gz
2006-02-17 20:35:40 +10:00
axel
7ead45d899 More missing files
darcs-hash:20060217103214-ac50b-f0f65a28d574e6a7258148fd1162677be287e99c.gz
2006-02-17 20:32:14 +10:00
axel
5c9ac72c19 Add missing files
darcs-hash:20060217103018-ac50b-9097f60908d06d89f235d969719fe654117b423e.gz
2006-02-17 20:30:18 +10:00
axel
343cafef34 Redo installation file structure, move lots of things to $PREFIX/share/fish
darcs-hash:20060217101339-ac50b-d93d2c620a4b7f75f05ff461a6edbee001da7613.gz
2006-02-17 20:13:39 +10:00
axel
95a01f3c8f Use plgin support in output.c to make buffered pager output - noticably faster printing in many situations
darcs-hash:20060216142159-ac50b-2c31025be7d12fcc32f4ba352b59ea4cc3cc1387.gz
2006-02-17 00:21:59 +10:00
axel
cfa367f14c Finish support for plugging in a new output function for output.c
darcs-hash:20060216142100-ac50b-06db798debb56c7640f7ffec0bc32c8ca7b013e5.gz
2006-02-17 00:21:00 +10:00
axel
94cae410f3 Move the move_cursor and writeb functions to output.c, and make the output function used by output.c configurable
darcs-hash:20060216134025-ac50b-360d4816ee2c3f2ffdc8e5660502cb97b31d699e.gz
2006-02-16 23:40:25 +10:00
axel
cc69afc4fe Fix bug in fish causing occasionally incorrect signal handlers
darcs-hash:20060216133632-ac50b-f24c049830f9c6deca50aca640189ad3f87b630a.gz
2006-02-16 23:36:32 +10:00
axel
777a559e12 Use env to work around path issues on the shebang line for the seq fallback implementation
darcs-hash:20060216121617-ac50b-6c7e34329a5ca8f3cd6756f1860fa10693db21e4.gz
2006-02-16 22:16:17 +10:00
axel
0427ccbb55 Fix invalid destruction order on exit
darcs-hash:20060215222513-ac50b-f3b489568e4bad3532c36f9c66a3c0d61352cd5b.gz
2006-02-16 08:25:13 +10:00
axel
f9a4699147 Add swedish translation of function descriptions
darcs-hash:20060215180031-ac50b-f21e471c178610b7a2912f82b3d46b46f76d350c.gz
2006-02-16 04:00:31 +10:00
axel
e6e287ae1f Make function descriptions for dynamically loaded functions translatable
darcs-hash:20060215175925-ac50b-5dc52c615650779771a6c4a3c5d006b72dbca67d.gz
2006-02-16 03:59:25 +10:00
axel
143602e5f6 Minor edits
darcs-hash:20060215024900-ac50b-51863879c32660d9787db706c34fef10aa4c30c2.gz
2006-02-15 12:49:00 +10:00
axel
1c2d3583e7 Drop fuction from man completion file, already lives in it's own file
darcs-hash:20060215024822-ac50b-dbb1e3769f0b3101f634d4bf5f5e530aacc1dfda.gz
2006-02-15 12:48:22 +10:00
axel
e58110da2c Reset list of loaded completion files when running complete_destroy. Otherwise completions will not get propely loaded on language changes.
darcs-hash:20060215024644-ac50b-d259cdac14dccb55309a4702683f1b881636e9ac.gz
2006-02-15 12:46:44 +10:00
axel
0d1683edc8 Add missing function prototype in parse_util.h
darcs-hash:20060215022415-ac50b-a6510213a3559c7bd6b944bbe87c739faaef4792.gz
2006-02-15 12:24:15 +10:00
axel
c94b9e504d Remove the rather stupid -y option for complete, which loads another commands completions. Mostly the same results can be had with fewer bugs and corner cases vy using the new dynamically loaded functions.
darcs-hash:20060215022228-ac50b-85614ed684f73460d43543a579ff2c7e7914efeb.gz
2006-02-15 12:22:28 +10:00
axel
8be3bf3e5d Add support for checking current filename and current line nuber to status builtin
darcs-hash:20060214195747-ac50b-77b6aba42c99da4f79ea500c47cc00bba12ec663.gz
2006-02-15 05:57:47 +10:00
axel
3e165297ce Add support for sending arguments whenusing the source builtin
darcs-hash:20060214195636-ac50b-511c211368103df6923d63cef99ce20a88d31be3.gz
2006-02-15 05:56:36 +10:00
axel
7ac922def6 Fix timestap checking bug when autoloading scripts
darcs-hash:20060214195517-ac50b-3d084f351c5d1f4f11afb4fc1c706c843de98da1.gz
2006-02-15 05:55:17 +10:00
axel
f12127c775 Add missing translation string
darcs-hash:20060214114804-ac50b-1ce10e7613ebec38a283cd6f6f8ad08397cec529.gz
2006-02-14 21:48:04 +10:00
axel
73d84fe136 Escape semicolons and other chars that have syntactic meaning in various shell command situations
darcs-hash:20060214114739-ac50b-17616bf01a0504041c0d29ee9428abd8a9f9ad3a.gz
2006-02-14 21:47:39 +10:00
axel
c595448f9c Add missing #define, needed by new fish_pager code
darcs-hash:20060214114631-ac50b-39756b670fd0ab1f5a6bd067ba2ff3f9d6f82fc2.gz
2006-02-14 21:46:31 +10:00
axel
5a2aeb1511 Swedish translation checkin
darcs-hash:20060214113926-ac50b-86926878d127405be8a3acd8cf9ac36a56ea432e.gz
2006-02-14 21:39:26 +10:00
axel
5fb9d9aa38 Fix clash in usage of unicode private use area
darcs-hash:20060214113514-ac50b-5160e3b7ac9401a7ef198121d39e33225df4b766.gz
2006-02-14 21:35:14 +10:00
axel
8258961c29 Fix minor display bugs and a memory leak in fish_pager
darcs-hash:20060214113347-ac50b-302a7da47f9c07af3acc9a2dcc5c8007127fc3a2.gz
2006-02-14 21:33:47 +10:00
axel
0dab94a54c Group multiple switches with common description together when printing completions
darcs-hash:20060214000823-ac50b-2bde1ac964baf12a515d763a076434757ac9fd21.gz
2006-02-14 10:08:23 +10:00
axel
3097f71abd Initial checkin of german translation
darcs-hash:20060213215118-ac50b-7981b89adff210e5b53cc18cdc0ad6f1c865cd83.gz
2006-02-14 07:51:18 +10:00
axel
ea5e1b70db Fix memory leak and missing error check in dynamic function lookup
darcs-hash:20060213214416-ac50b-2bd8532aed600c06234e6fce500c737fcb415a5c.gz
2006-02-14 07:44:16 +10:00
axel
6b393d35a9 Spelling fixes from HJB
darcs-hash:20060213213659-ac50b-024e99d5c3a56d1c7308bf5cc291e032aa65bc0e.gz
2006-02-14 07:36:59 +10:00
axel
a5dde6021c Change a few chars to be long
darcs-hash:20060213111023-ac50b-5ad5ddf9beb72117fc1dc81c048a83e5480bc510.gz
2006-02-13 21:10:23 +10:00
axel
a015472739 Remova a few calls to free that are handled by halloc now
darcs-hash:20060213110929-ac50b-95bba1b70840ef16e45f3876c5d0521a51b90561.gz
2006-02-13 21:09:29 +10:00
axel
6affa4452b Check for translation strings in function files
darcs-hash:20060212222406-ac50b-10424c1daeb9e81054c87bbf8f7839da72cb05bb.gz
2006-02-13 08:24:06 +10:00
axel
7ebfa380dd Variable used for filenmae length was accidentally set to static
darcs-hash:20060212222313-ac50b-1893f4fbe52a8c72ebc8332b1e575c1b8a2b31d5.gz
2006-02-13 08:23:13 +10:00
axel
370336e7c7 Fix various minor misses in moving of shellscript functions
darcs-hash:20060212222205-ac50b-d7bccc4c1e1dd752ca40560e81309bb37bb4dca8.gz
2006-02-13 08:22:05 +10:00
axel
bad4269dc9 Remove trailing periods from descriptions
darcs-hash:20060212221918-ac50b-d2310f6a166b585b242a9b548b1d1f890cac2e03.gz
2006-02-13 08:19:18 +10:00
axel
effe6f47a3 Minor hallocifications
darcs-hash:20060212190301-ac50b-c15b9a8c6c2897189c4343946d9bd115eefb4972.gz
2006-02-13 05:03:01 +10:00
axel
7eb3a5a17d Allow backslash of quotes within quotes
darcs-hash:20060212161331-ac50b-c25affaa4b18e1654dab3d08debafa95017009ea.gz
2006-02-13 02:13:31 +10:00
axel
b6cd723eb7 Fix a few compiler warnings, add halloc debug output on exit if HALLOC_DEBUG is defined and other minor tweaks
darcs-hash:20060212131846-ac50b-128685d1c043697768be70631c736567544abf2c.gz
2006-02-12 23:18:46 +10:00
axel
a2cd8c8a8d Move a few more shellscript functions to their own files
darcs-hash:20060212131421-ac50b-861f8941af76cf9a1e6fb7da2ac7f33795fab272.gz
2006-02-12 23:14:21 +10:00
axel
3b03bd6a10 Check if curses-string 'flash_screen' is set before using it in fish_pager
darcs-hash:20060212131253-ac50b-39c03e4223e66230c9c76a59bc95eeadc38637c9.gz
2006-02-12 23:12:53 +10:00
Nicholas Pilon
6caff2d85d svn completions
Command-line completions for svn. This includes some tweaks to the cvs completions file, to move a common function out into fish_complete.fish.

darcs-hash:20060210004314-494f2-c12a77084499cbc4216e8c5603ae4fadfb6b384c.gz
2006-02-10 10:43:14 +10:00
axel
eeaa241be8 Optimizations of how variable expansion implementation
darcs-hash:20060212112930-ac50b-9b8bb640ef1a5bd14230ecd276167a80d6d986c9.gz
2006-02-12 21:29:30 +10:00
axel
8fdb4d2a17 Define fish_function_path at the top of the first init file to improve preformance (each non-existing variable causes a universal variable barrier)
darcs-hash:20060212112349-ac50b-51956f701d11ae897c560617e4b476fb51b576c7.gz
2006-02-12 21:23:49 +10:00
axel
7c7f744b4c Add %o, %x and %X formats to *wprintf fallback implemnentation
darcs-hash:20060212112030-ac50b-1e3153c25dca3d2e12a8eb0e65da29bf70fa0d2e.gz
2006-02-12 21:20:30 +10:00
axel
5718ea41df Add comment in manual about array base index
darcs-hash:20060211001546-ac50b-cebbcd5ca6709c8370433abf366c0aa318ec48ec.gz
2006-02-11 10:15:46 +10:00
axel
20c83ba605 Optimize the halloc implementation so that mutiple calls to halloc can be satisfied by a single malloc, also add wcsdup and wcsndup workalikes using halloc
darcs-hash:20060211001317-ac50b-c9cf234c334b4d697fe1251c21013c8ec7f7b0a1.gz
2006-02-11 10:13:17 +10:00
axel
e9e32f980b Re-add check for presense of ncurses.h header file
darcs-hash:20060211001050-ac50b-434f0d6ea015325f75f27aaebbc54d4b81f18a2c.gz
2006-02-11 10:10:50 +10:00
axel
4b2cc49aaa Registered wrong string with halloc in expand_one, causing potential crash.
darcs-hash:20060210003539-ac50b-523cbc848435b7f2b4239cc83da897cc65c00c1c.gz
2006-02-10 10:35:39 +10:00
axel
28f65c07b0 Use consistent quoting in wgetopt
darcs-hash:20060209215120-ac50b-4dda64a6791be33b6493899714485d55372ca8ea.gz
2006-02-10 07:51:20 +10:00
axel
18279c3867 make sure fish_tests is deleted on make clean
darcs-hash:20060209215101-ac50b-48d6e4ffa276e55e0ab896040a7070294061a4ce.gz
2006-02-10 07:51:01 +10:00
axel
d1c9bca2e9 Another halloc:ification of fish. Halloc has been extended to allow registering function calls, this has allowed the creation of halloc-handled arraylists, stringbuffers, etc. More job parsing halloc-ification has reduced the error handling code to only a shadow of it's former self
darcs-hash:20060209155020-ac50b-e119c5293ce2368e252cfc01b98ab7c629fdd678.gz
2006-02-10 01:50:20 +10:00
axel
49973b85da Add source documentation for functions in parse_util.h
darcs-hash:20060208184737-ac50b-e86de902a966621501eea1b706b181bcda91fb61.gz
2006-02-09 04:47:37 +10:00
axel
47373c4f68 Fix bug where recursive function loading crashed fish
darcs-hash:20060208184437-ac50b-c6b2001fbab07ac9561ba7aa941fbab0d93d7cd7.gz
2006-02-09 04:44:37 +10:00
axel
cbf1dbaa2e Add missing fish_tests file to make clean
darcs-hash:20060208180342-ac50b-a4cf2411534c8c1bd3db335152d4615f951529c8.gz
2006-02-09 04:03:42 +10:00
axel
fdaa79416a Make sure dynamically loaded functions are completable, even if they have not yet been loaded
darcs-hash:20060208173718-ac50b-40c93b82f3b8a717d220642e22c4b4005d8871d0.gz
2006-02-09 03:37:18 +10:00
axel
7c3700c190 Fix crash bug caused by trying to free halloc:ed memory
darcs-hash:20060208153904-ac50b-f8b3d2aadb12fa1e6aca0c4ca7a6046a09a0450d.gz
2006-02-09 01:39:04 +10:00
axel
a0e1f9113e Do not use CDPATH when completing arguments starting with a '.'
darcs-hash:20060208152909-ac50b-650092242a4d9454db6cf4d73858c137040db4c5.gz
2006-02-09 01:29:09 +10:00
axel
133b682793 New wreaddir function, wide character version of readdir
darcs-hash:20060208145847-ac50b-0e250edb67dd095e90054ed55f88a2638ba9b02a.gz
2006-02-09 00:58:47 +10:00
axel
824f4ee566 Make the __fish_describe_command function strip spaces and newlines
darcs-hash:20060208102236-ac50b-6df5b077a09eda9180a1405305e12fd15967eb31.gz
2006-02-08 20:22:36 +10:00
axel
1cb9b65744 Fis function signature for a few functions in parser.c
darcs-hash:20060208102203-ac50b-5e81c6580302ca3a1cee0d03f179b5d75ff61be3.gz
2006-02-08 20:22:03 +10:00
axel
35dde5de15 Move more functions to autoload
darcs-hash:20060208102043-ac50b-4e26615523a6b9528c2ea4768f41ad1b2e1c4a0f.gz
2006-02-08 20:20:43 +10:00
Nicholas Pilon
4d9bb19467 cvs completions
Better completions for cvs. Covers most flags in the manual, except for some for history that I couldn't write good descriptions for. Descriptions could probably use some tweaking, but the basic structure should be much better than what we had before.

darcs-hash:20060208023146-494f2-bea009421c161257f09c0f53c52ab1ee116fc3dc.gz
2006-02-08 12:31:46 +10:00
axel
2555353161 Make 'exit' work in even handlers
darcs-hash:20060208092429-ac50b-f88534a423dc194fdb6453d66b5d4cc7733e54fb.gz
2006-02-08 19:24:29 +10:00
axel
73a9c8bcb8 Autoloaded functions
darcs-hash:20060208092005-ac50b-8e784f79a4e158c8c15b553fad85002dccc7bd03.gz
2006-02-08 19:20:05 +10:00
Nicholas Pilon
47b652c76e Awk Indent Fix
Indented the awk script for command description.

darcs-hash:20060208004201-494f2-2f08b1b7999c690bd1815b6c1702529c932b364d.gz
2006-02-08 10:42:01 +10:00
404 changed files with 24615 additions and 11796 deletions

13
INSTALL
View File

@@ -2,11 +2,12 @@
Known issues
============
Fish currently requires a semi-modern GCC version to
compile. Specifically, GCC 2.95.* won't compile fish, but GCC 3.23
should work. Fish has not been coded with an C99- or GNU-specific
features in mind, so it is hoped that it should be possible to make
fish work with other compilers. Patches are welcome.
Fish is developed using GCC, with the goal of using only C89 language
features. Fish does, however use the *wprintf family of functions,
which are new to the C99 standrard. It is not unlikely that any given
release contains a few GCC:isms, but ICC 9.0.030 has been found to
produce working binaries. GCC 2.95.* won't compile fish, but GCC 3.2.3
is known to work. Patches to fix any remaining GNU:isms are welcome.
Older versions of Doxygen has bugs in the man-page generation which
cause the builtin help to render incorrectly. Doxygen 1.2.14 is known
@@ -52,7 +53,7 @@ Local install procedure
=======================
If you have downloaded the darcs repository of fish, you need to run
autoconf first.
autoconf to generate the configure script.
To install fish in your own home directory (typically as non-root),
type:

View File

@@ -36,8 +36,7 @@
CC := @CC@
INSTALL:=@INSTALL@
# Compiler flags
CFLAGS:=@CFLAGS@ -Wall -std=gnu99 -fno-strict-aliasing
CFLAGS:=@CFLAGS@
CPPFLAGS=@CPPFLAGS@
LDFLAGS:= @LIBS@ @LDFLAGS@
@@ -48,53 +47,53 @@ datadir = @datadir@
bindir = @bindir@
mandir = @mandir@
sysconfdir = @sysconfdir@
fishdir = @fishdir@
fishfile = @fishfile@
fishinputfile = @fishinputfile@
docdir = @docdir@
#Init files to install
INIT_DIR_INSTALL = init/fish_interactive.fish init/fish_function.fish init/fish_complete.fish
#etc files to install
ETC_DIR_INSTALL = etc/fish_interactive.fish
# Set to 1 if we have gettext
HAVE_GETTEXT=@HAVE_GETTEXT@
CORE_OBJS := util.o common.o halloc.o halloc_util.o fallback.o
# All objects used by fish, that are compiled from an ordinary .c file
# using an ordinary .h file.
COMMON_OBJS := function.o builtin.o common.o complete.o env.o exec.o \
COMMON_OBJS := function.o builtin.o complete.o env.o exec.o \
expand.o highlight.o history.o kill.o parser.o proc.o reader.o \
sanity.o tokenizer.o util.o wildcard.o wgetopt.o wutil.o input.o \
sanity.o tokenizer.o wildcard.o wgetopt.o wutil.o input.o \
output.o intern.o env_universal.o env_universal_common.o \
input_common.o event.o signal.o io.o translate.o parse_util.o \
halloc.o
$(CORE_OBJS)
# builtin_help.h exists, but builtin_help.c is autogenerated
COMMON_OBJS_WITH_HEADER := builtin_help.o
# main.c exists, but main.h does not, etc.
COMMON_OBJS_WITH_CODE := builtin_set.o builtin_commandline.o \
builtin_ulimit.c builtin_complete.o
builtin_ulimit.o builtin_complete.o
# All objects that the system needs to build fish
FISH_OBJS := $(COMMON_OBJS) $(COMMON_OBJS_WITH_CODE) \
$(COMMON_OBJS_WITH_HEADER) main.o
# All objects that the system needs to build fish_pager
FISH_PAGER_OBJS := fish_pager.o common.o output.o util.o wutil.o \
FISH_PAGER_OBJS := fish_pager.o output.o wutil.o \
tokenizer.o input_common.o env_universal.o env_universal_common.o \
translate.o halloc.o
translate.o $(CORE_OBJS)
# All objects that the system needs to build fish_tests
FISH_TESTS_OBJS := $(COMMON_OBJS) $(COMMON_OBJS_WITH_CODE) \
$(COMMON_OBJS_WITH_HEADER) fish_tests.o
# All objects that the system needs to build fishd
FISHD_OBJS := fishd.o env_universal_common.o common.o util.o wutil.o \
doc_src/fishd.o halloc.o
FISHD_OBJS := fishd.o env_universal_common.o wutil.o \
doc_src/fishd.o $(CORE_OBJS)
# All objects needed to build mimedb
MIME_OBJS := mimedb.o xdgmimealias.o xdgmime.o xdgmimeglob.o \
xdgmimeint.o xdgmimemagic.o xdgmimeparent.o wutil.o halloc.o
MIME_OBJS := mimedb.o xdgmimealias.o xdgmime.o xdgmimeglob.o \
xdgmimeint.o xdgmimemagic.o xdgmimeparent.o wutil.o $(CORE_OBJS)
#
# Files containing documentation for builtins. Should be listed
@@ -160,16 +159,22 @@ MAIN_DIR_FILES := Doxyfile Doxyfile.user Makefile.in configure \
user_doc.head.html xsel-0.9.6.tar ChangeLog config.sub \
config.guess fish_tests.c main.c fish_pager.c fishd.c seq.in
# Files in ./init/
INIT_DIR_FILES :=init/fish.in init/fish_complete.fish.in \
init/fish_function.fish init/fish_inputrc \
init/fish_interactive.fish.in
# Files in ./etc/
ETC_DIR_FILES :=etc/fish.in etc/fish_inputrc \
etc/fish_interactive.fish.in
# Files in ./share/
SHARE_DIR_FILES :=share/fish.in
# Files in ./tests/
TESTS_DIR_FILES := $(TEST_IN) $(TEST_IN:.in=.out) $(TEST_IN:.in=.err) \
$(TEST_IN:.in=.status) tests/test.fish tests/gen_output.fish
COMPLETIONS_DIR_FILES := $(wildcard init/completions/*.fish)
# Files in ./share/completions/
COMPLETIONS_DIR_FILES := $(wildcard share/completions/*.fish)
# Files in ./share/functions/
FUNCTIONS_DIR_FILES := $(wildcard share/functions/*.fish)
# Programs to build
PROGRAMS:=fish set_color @XSEL@ @SEQ_FALLBACK@ mimedb count fish_pager fishd
@@ -192,8 +197,14 @@ all: $(PROGRAMS) user_doc
@echo Use \'make install\' to install fish.
.PHONY: all
configure: configure.ac
./config.status --recheck
Makefile: Makefile.in configure
./config.status
debug:
make fish CFLAGS="-O0 -Wno-unused -Werror -g -Wall -std=gnu99 -fno-strict-aliasing"
make fish CFLAGS="@CFLAGS@ -O0 -Wno-unused -Werror -g"
.PHONY: debug
# User documentation, describing the features of the fish shell.
@@ -262,10 +273,10 @@ doc.h:$(BUILTIN_DOC_SRC) $(CMD_DOC_SRC) doc_src/doc.hdr
fi
# Create a template translation object
messages.pot: *.c *.h init/*.in init/*.fish init/completions/*.fish seq
messages.pot: *.c *.h etc/*.in share/fish share/completions/*.fish share/functions/*.fish seq
if test $(HAVE_GETTEXT) = 1;then \
xgettext -k_ -kN_ -kcomplete_desc *.c *.h -o messages.pot; \
if ! xgettext -j -k_ -LShell init/*.in init/*.fish init/completions/*.fish seq -o messages.pot; then \
xgettext -k_ -kN_ *.c *.h -o messages.pot; \
if ! xgettext -j -k_ -kN_ -LShell etc/*.in share/fish share/completions/*.fish share/functions/*.fish seq -o messages.pot; then \
echo "Your xgettext version is too old to build the messages.pot file"\
rm messages.pot\
false;\
@@ -333,27 +344,56 @@ builtin_help.c: $(BUILTIN_DOC_HDR) doc_src/count.doxygen gen_hdr2 gen_hdr.sh bui
./gen_hdr.sh $*.doxygen >>$@
echo ");" >>$@
echo "}" >>$@
#man -- doc_src/builtin_doc/man/man1/`basename $@ .c`.1 | cat -s | ./gen_hdr2 >>$@
#
# The build rules for installing/uninstalling
# The build rules for installing/uninstalling fish
#
install: all install-translations
# Check for an incompatible installed fish version, and fail with an
# error if found
check-uninstall:
if test -f $(DESTDIR)$(sysconfdir)/fish.d/fish_function.fish -o -f $(DESTDIR)$(sysconfdir)/fish.d/fish_complete.fish; then \
echo;\
echo ERROR;\
echo;\
echo An older fish installation using an incompatible filesystem hierarchy was detected;\
echo You must uninstall this fish version before installing proceeding;\
echo type \'make uninstall-legacy\' to uninstall these files,;\
echo or type \'make force-install\' to force installation.;\
echo The latter may result in a broken installation.;\
echo;\
false;\
fi;
.PHONY: check-uninstall
# Try to install after checking for incompatible installed versions
install: all check-uninstall install-force
.PHONY: install
# Force installation, even in presense of incompatible previous
# version
install-force: all install-translations
$(INSTALL) -m 755 -d $(DESTDIR)$(bindir)
for i in $(PROGRAMS); do\
$(INSTALL) -m 755 $$i $(DESTDIR)$(bindir) ; \
done;
$(INSTALL) -m 755 -d $(DESTDIR)$(sysconfdir)$(fishdir)
$(INSTALL) -m 755 -d $(DESTDIR)$(sysconfdir)$(fishdir)/completions
$(INSTALL) -m 644 init/fish $(DESTDIR)$(sysconfdir)$(fishfile)
for i in $(INIT_DIR_INSTALL); do \
$(INSTALL) -m 644 $$i $(DESTDIR)$(sysconfdir)$(fishdir); \
$(INSTALL) -m 755 -d $(DESTDIR)$(sysconfdir)/fish.d
$(INSTALL) -m 755 -d $(DESTDIR)$(datadir)/fish
$(INSTALL) -m 755 -d $(DESTDIR)$(datadir)/fish/completions
$(INSTALL) -m 755 -d $(DESTDIR)$(datadir)/fish/functions
$(INSTALL) -m 644 etc/fish $(DESTDIR)$(sysconfdir)/fish
$(INSTALL) -m 644 share/fish $(DESTDIR)$(datadir)/fish
for i in $(ETC_DIR_INSTALL); do \
$(INSTALL) -m 644 $$i $(DESTDIR)$(sysconfdir)/fish.d; \
done;
for i in $(COMPLETIONS_DIR_FILES); do \
$(INSTALL) -m 644 $$i $(DESTDIR)$(sysconfdir)$(fishdir)/completions/; \
$(INSTALL) -m 644 $$i $(DESTDIR)$(datadir)/fish/completions/; \
done;
$(INSTALL) -m 644 init/fish_inputrc $(DESTDIR)$(sysconfdir)$(fishinputfile);
for i in $(FUNCTIONS_DIR_FILES); do \
$(INSTALL) -m 644 $$i $(DESTDIR)$(datadir)/fish/functions/; \
done;
$(INSTALL) -m 644 etc/fish_inputrc $(DESTDIR)$(sysconfdir)/fish_inputrc;
$(INSTALL) -m 755 -d $(DESTDIR)$(docdir)
for i in user_doc/html/* ChangeLog; do \
if test -f $$i; then \
@@ -372,22 +412,50 @@ install: all install-translations
@echo \* use the command \'chsh -s $(DESTDIR)$(bindir)/fish\'.
@echo
@echo Have fun!
.PHONY: install
.PHONY: install-force
# Uninstall this fish version
uninstall: uninstall-translations
for i in $(PROGRAMS); do \
rm -f $(DESTDIR)$(bindir)/$$i; \
done;
rm -f $(DESTDIR)$(bindir)/xsel
rm -f $(DESTDIR)$(sysconfdir)$(fishfile)
rm -f $(DESTDIR)$(sysconfdir)$(fishinputfile)
rm -r $(DESTDIR)$(sysconfdir)$(fishdir)
rm -r $(DESTDIR)$(docdir)
for i in fish.1* @XSEL_MAN@ mimedb.1* fishd.1* set_color.1* count.1*; do \
rm $(DESTDIR)$(mandir)/man1/$$i; \
rm -f $(DESTDIR)$(sysconfdir)/fish
rm -f $(DESTDIR)$(sysconfdir)/fish_inputrc
if test -d $(DESTDIR)$(datadir)/fish; then \
rm -r $(DESTDIR)$(datadir)/fish; \
fi
if test -d $(DESTDIR)$(docdir); then \
rm -r $(DESTDIR)$(docdir);\
fi
for i in fish.1 @XSEL_MAN@ mimedb.1 fishd.1 set_color.1 count.1; do \
rm -f $(DESTDIR)$(mandir)/man1/$$i*; \
done;
.PHONY: uninstall
# Uninstall older fish release. This is not the default uninstall
# since there is a slight chance that it removes a file put in place by
# the sysadmin.
uninstall-legacy: uninstall
rm -f $(DESTDIR)$(sysconfdir)/fish.d/fish_interactive.fish
rm -f $(DESTDIR)$(sysconfdir)/fish.d/fish_complete.fish
rm -f $(DESTDIR)$(sysconfdir)/fish.d/fish_function.fish
if test -d $(DESTDIR)$(sysconfdir)/fish.d/completions; then \
for i in $(COMPLETIONS_DIR_FILES); do \
basename=`basename $$i`; \
if test -f $(DESTDIR)$(sysconfdir)/fish.d/completions/$$basename; then \
rm $(DESTDIR)$(sysconfdir)/fish.d/completions/$$basename; \
fi; \
done; \
fi;
rmdir $(DESTDIR)$(sysconfdir)/fish.d/completions; true
rmdir $(DESTDIR)$(sysconfdir)/fish.d; true
@echo The previous fish installation has been removed.
.PHONY: uninstall-legacy
install-translations: $(TRANSLATIONS)
if test $(HAVE_GETTEXT) = 1; then \
for i in $(TRANSLATIONS); do \
@@ -395,13 +463,13 @@ install-translations: $(TRANSLATIONS)
$(INSTALL) -m 644 $$i $(DESTDIR)$(datadir)/locale/`basename $$i .gmo`/LC_MESSAGES/fish.mo; \
echo $(DESTDIR)$(datadir)/locale/`basename $$i .gmo`/LC_MESSAGES/fish.mo;\
done; \
fi
fi;
.PHONY: install-translations
uninstall-translations:
if test $(HAVE_GETTEXT) = 1; then \
for i in $(TRANSLATIONS_SRC); do \
rm -f $(DESTDIR)$(datadir)/locale/`basename $$i .po`/LC_MESSAGES/fish.mo; \
rm -f $(DESTDIR)$(datadir)/locale/*/LC_MESSAGES/fish.mo; \
done; \
fi
.PHONY: uninstall-translations
@@ -423,25 +491,26 @@ fish_tests: $(FISH_TESTS_OBJS)
$(CC) $(FISH_TESTS_OBJS) $(LDFLAGS) -o $@
mimedb: $(MIME_OBJS) util.o common.o doc_src/mimedb.c
$(CC) ${MIME_OBJS} util.o common.o doc_src/mimedb.c $(LDFLAGS) -o $@
mimedb: $(MIME_OBJS) doc_src/mimedb.o
$(CC) ${MIME_OBJS} doc_src/mimedb.o $(LDFLAGS) -o $@
set_color: set_color.o doc_src/set_color.c
$(CC) set_color.o doc_src/set_color.c $(LDFLAGS) -o $@
set_color: set_color.o doc_src/set_color.o
$(CC) set_color.o doc_src/set_color.o $(LDFLAGS) -o $@
# Test program for the tokenizer library
tokenizer_test: tokenizer.c tokenizer.h util.o wutil.o common.o
$(CC) ${CFLAGS} tokenizer.c util.o wutil.o common.o -D TOKENIZER_TEST $(LDFLAGS) -o $@
# Neat little program to show output from terminal
key_reader: key_reader.o input_common.o common.o env_universal.o env_universal_common.o util.o wutil.o
$(CC) key_reader.o input_common.o common.o env_universal.o env_universal_common.o util.o wutil.o $(LDFLAGS) -o $@
key_reader: key_reader.o input_common.o $(CORE_OBJS) env_universal.o env_universal_common.o wutil.o
$(CC) key_reader.o input_common.o $(CORE_OBJS) env_universal.o env_universal_common.o wutil.o $(LDFLAGS) -o $@
#
# Update dependencies
#
depend:
makedepend -fMakefile.in -Y *.c
./config.status
.PHONY: depend
# Copy all the source files into a new directory and use tar to create
@@ -450,32 +519,48 @@ depend:
#
# Uses install instead of mkdir so build won't fail if the directory
# exists
fish-@PACKAGE_VERSION@.tar: $(DOC_SRC_DIR_FILES) $(MAIN_DIR_FILES) $(INIT_DIR_FILES) $(TEST_DIR_FILES) $(COMPLETIONS_DIR_FILES) ChangeLog
fish-@PACKAGE_VERSION@.tar: $(DOC_SRC_DIR_FILES) $(MAIN_DIR_FILES) $(ETC_DIR_FILES) $(TEST_DIR_FILES) $(SHARE_DIR_FILES) $(FUNCTIONS_DIR_FILES) $(COMPLETIONS_DIR_FILES) ChangeLog
rm -rf fish-@PACKAGE_VERSION@
$(INSTALL) -d fish-@PACKAGE_VERSION@
$(INSTALL) -d fish-@PACKAGE_VERSION@/doc_src
$(INSTALL) -d fish-@PACKAGE_VERSION@/init
$(INSTALL) -d fish-@PACKAGE_VERSION@/init/completions
$(INSTALL) -d fish-@PACKAGE_VERSION@/etc
$(INSTALL) -d fish-@PACKAGE_VERSION@/share
$(INSTALL) -d fish-@PACKAGE_VERSION@/share/completions
$(INSTALL) -d fish-@PACKAGE_VERSION@/share/functions
$(INSTALL) -d fish-@PACKAGE_VERSION@/tests
$(INSTALL) -d fish-@PACKAGE_VERSION@/po
cp -f $(DOC_SRC_DIR_FILES) fish-@PACKAGE_VERSION@/doc_src
cp -f $(MAIN_DIR_FILES) fish-@PACKAGE_VERSION@/
cp -f $(INIT_DIR_FILES) fish-@PACKAGE_VERSION@/init/
cp -f $(COMPLETIONS_DIR_FILES) fish-@PACKAGE_VERSION@/init/completions/
cp -f $(ETC_DIR_FILES) fish-@PACKAGE_VERSION@/etc/
cp -f $(SHARE_DIR_FILES) fish-@PACKAGE_VERSION@/share/
cp -f $(COMPLETIONS_DIR_FILES) fish-@PACKAGE_VERSION@/share/completions/
cp -f $(FUNCTIONS_DIR_FILES) fish-@PACKAGE_VERSION@/share/functions/
cp -f $(TESTS_DIR_FILES) fish-@PACKAGE_VERSION@/tests/
cp -f $(TRANSLATIONS_SRC) fish-@PACKAGE_VERSION@/po/
tar -c fish-@PACKAGE_VERSION@ >fish-@PACKAGE_VERSION@.tar
rm -rf fish-@PACKAGE_VERSION@
tar: fish-@PACKAGE_VERSION@.tar
.PHONY: tar
fish-@PACKAGE_VERSION@.tar.gz: fish-@PACKAGE_VERSION@.tar
gzip -f --best -c fish-@PACKAGE_VERSION@.tar >fish-@PACKAGE_VERSION@.tar.gz
fish-@PACKAGE_VERSION@.tar.bz2: fish-@PACKAGE_VERSION@.tar
bzip2 -f --best -k fish-@PACKAGE_VERSION@.tar
dist: fish-@PACKAGE_VERSION@.tar.bz2
.PHONY: dist
# Create .rpm file for the current systems architecture and an
# .src.rpm file.
rpm: fish-@PACKAGE_VERSION@.tar.bz2
@if ! which rpmbuild; then \
echo Could not find the rpmbuild command, needed to build an rpm; \
echo You may be able to install it using the following command:; \
echo \'yum install rpm-build\'; \
false; \
fi
cp fish.spec /usr/src/redhat/SPECS/
cp fish-@PACKAGE_VERSION@.tar.bz2 /usr/src/redhat/SOURCES/
rpmbuild -ba --clean /usr/src/redhat/SPECS/fish.spec
@@ -489,15 +574,15 @@ rpm: fish-@PACKAGE_VERSION@.tar.bz2
distclean: clean
rm -f fish.spec doc_src/fish.1 doc_src/Doxyfile
rm -f init/fish init/fish_interactive.fish init/fish_complete.fish
rm -f etc/fish etc/fish_interactive.fish seq
rm -f config.status config.log config.h Makefile
.PHONY: distclean
clean:
rm -f *.o doc.h doc_src/*.doxygen doc_src/*.c builtin_help.c
rm -f *.o doc.h doc_src/*.doxygen doc_src/*.c builtin_help.c doc_src/*.o
rm -f tests/tmp.err tests/tmp.out tests/tmp.status tests/foo.txt
rm -f tokenizer_test fish key_reader set_color gen_hdr2 mimedb
rm -f fishd fish_pager count
rm -f fishd fish_pager count fish_tests
rm -f fish-@PACKAGE_VERSION@.tar
rm -f fish-@PACKAGE_VERSION@.tar.gz
rm -f fish-@PACKAGE_VERSION@.tar.bz2
@@ -511,87 +596,112 @@ clean:
# DO NOT DELETE THIS LINE -- make depend depends on it.
builtin.o: config.h util.h wutil.h builtin.h function.h complete.h proc.h
builtin.o: io.h parser.h reader.h env.h expand.h common.h wgetopt.h sanity.h
builtin.o: tokenizer.h builtin_help.h wildcard.h input_common.h input.h
builtin.o: intern.h event.h signal.h translate.h
builtin_commandline.o: signal.h config.h util.h builtin.h common.h wgetopt.h
builtin_commandline.o: reader.h proc.h io.h parser.h tokenizer.h
builtin_commandline.o: input_common.h input.h translate.h
builtin.o: config.h fallback.h common.h util.h wutil.h builtin.h function.h
builtin.o: complete.h proc.h io.h parser.h event.h reader.h env.h wgetopt.h
builtin.o: sanity.h tokenizer.h builtin_help.h wildcard.h input_common.h
builtin.o: input.h intern.h signal.h translate.h halloc.h halloc_util.h
builtin.o: parse_util.h expand.h
builtin_commandline.o: signal.h config.h fallback.h common.h util.h wutil.h
builtin_commandline.o: builtin.h wgetopt.h reader.h proc.h io.h parser.h
builtin_commandline.o: event.h tokenizer.h input_common.h input.h translate.h
builtin_commandline.o: parse_util.h
builtin_complete.o: signal.h config.h fallback.h common.h util.h wutil.h
builtin_complete.o: builtin.h complete.h wgetopt.h parser.h proc.h io.h
builtin_complete.o: event.h reader.h translate.h
builtin_help.o: config.h util.h common.h builtin_help.h
builtin_set.o: signal.h config.h util.h builtin.h env.h expand.h common.h
builtin_set.o: wgetopt.h proc.h io.h parser.h translate.h
builtin_ulimit.o: config.h util.h builtin.h common.h wgetopt.h translate.h
common.o: config.h signal.h util.h wutil.h common.h expand.h proc.h io.h
common.o: wildcard.h parser.h
complete.o: signal.h config.h util.h tokenizer.h wildcard.h proc.h io.h
complete.o: parser.h function.h complete.h builtin.h env.h exec.h expand.h
complete.o: common.h reader.h history.h intern.h translate.h wutil.h
env.o: config.h signal.h util.h wutil.h proc.h io.h common.h env.h sanity.h
env.o: expand.h history.h reader.h parser.h env_universal.h
env.o: env_universal_common.h input_common.h event.h translate.h
env_universal.o: config.h signal.h util.h common.h wutil.h
builtin_set.o: signal.h config.h fallback.h common.h util.h wutil.h builtin.h
builtin_set.o: env.h expand.h wgetopt.h proc.h io.h parser.h event.h
builtin_set.o: translate.h
builtin_ulimit.o: config.h fallback.h common.h util.h builtin.h wgetopt.h
builtin_ulimit.o: translate.h
common.o: config.h fallback.h common.h util.h wutil.h expand.h proc.h io.h
common.o: wildcard.h parser.h event.h
complete.o: signal.h config.h fallback.h common.h util.h tokenizer.h
complete.o: wildcard.h proc.h io.h parser.h event.h function.h complete.h
complete.o: builtin.h env.h exec.h expand.h reader.h history.h intern.h
complete.o: translate.h parse_util.h halloc_util.h wutil.h
env.o: config.h signal.h fallback.h common.h util.h wutil.h proc.h io.h env.h
env.o: sanity.h expand.h history.h reader.h parser.h event.h env_universal.h
env.o: env_universal_common.h input_common.h translate.h complete.h
env_universal.o: config.h signal.h fallback.h common.h util.h wutil.h
env_universal.o: env_universal_common.h env_universal.h
env_universal_common.o: signal.h util.h common.h wutil.h
env_universal_common.o: config.h signal.h fallback.h common.h util.h wutil.h
env_universal_common.o: env_universal_common.h
event.o: signal.h config.h util.h function.h proc.h io.h parser.h common.h
event.o: event.h translate.h
exec.o: signal.h config.h util.h common.h wutil.h proc.h io.h exec.h parser.h
exec.o: builtin.h function.h env.h wildcard.h sanity.h expand.h
exec.o: env_universal.h env_universal_common.h translate.h
expand.o: signal.h config.h util.h common.h wutil.h env.h proc.h io.h
expand.o: parser.h expand.h wildcard.h exec.h tokenizer.h complete.h
fishd.o: signal.h util.h common.h wutil.h env_universal_common.h
fish_pager.o: config.h signal.h util.h wutil.h common.h complete.h output.h
fish_pager.o: input_common.h env_universal.h env_universal_common.h
fish_tests.o: config.h signal.h util.h common.h proc.h io.h reader.h
fish_tests.o: builtin.h function.h complete.h wutil.h env.h expand.h parser.h
fish_tests.o: tokenizer.h output.h exec.h event.h
function.o: signal.h config.h util.h function.h proc.h io.h parser.h common.h
function.o: intern.h event.h
highlight.o: signal.h config.h util.h wutil.h highlight.h tokenizer.h proc.h
highlight.o: io.h parser.h builtin.h function.h env.h expand.h sanity.h
highlight.o: common.h complete.h output.h
history.o: config.h util.h wutil.h history.h common.h reader.h env.h sanity.h
input.o: config.h signal.h util.h wutil.h reader.h proc.h io.h common.h
input.o: sanity.h input_common.h input.h parser.h env.h expand.h event.h
input.o: translate.h
input_common.o: config.h util.h common.h wutil.h input_common.h
event.o: signal.h config.h fallback.h common.h util.h wutil.h function.h
event.o: proc.h io.h parser.h event.h translate.h halloc_util.h
exec.o: signal.h config.h fallback.h common.h util.h wutil.h proc.h io.h
exec.o: exec.h parser.h event.h builtin.h function.h env.h wildcard.h
exec.o: sanity.h expand.h env_universal.h env_universal_common.h translate.h
exec.o: halloc.h halloc_util.h parse_util.h
expand.o: signal.h config.h fallback.h common.h util.h wutil.h env.h proc.h
expand.o: io.h parser.h event.h expand.h wildcard.h exec.h tokenizer.h
expand.o: complete.h translate.h parse_util.h halloc_util.h
fallback.o: config.h fallback.h common.h util.h
fishd.o: config.h signal.h fallback.h common.h util.h wutil.h
fishd.o: env_universal_common.h
fish_pager.o: config.h signal.h fallback.h common.h util.h wutil.h complete.h
fish_pager.o: output.h input_common.h env_universal.h env_universal_common.h
fish_pager.o: halloc.h halloc_util.h
fish_tests.o: config.h signal.h fallback.h common.h util.h proc.h io.h
fish_tests.o: reader.h builtin.h function.h complete.h wutil.h env.h expand.h
fish_tests.o: parser.h event.h tokenizer.h output.h exec.h halloc_util.h
function.o: signal.h config.h wutil.h fallback.h common.h util.h function.h
function.o: proc.h io.h translate.h parser.h event.h intern.h reader.h
function.o: parse_util.h env.h expand.h
halloc.o: config.h fallback.h common.h util.h halloc.h
halloc_util.o: config.h fallback.h common.h util.h halloc.h
highlight.o: signal.h config.h fallback.h common.h util.h wutil.h highlight.h
highlight.o: tokenizer.h proc.h io.h parser.h event.h parse_util.h builtin.h
highlight.o: function.h env.h expand.h sanity.h complete.h output.h
history.o: config.h fallback.h common.h util.h wutil.h history.h reader.h
history.o: env.h sanity.h signal.h
input.o: config.h signal.h fallback.h common.h util.h wutil.h reader.h proc.h
input.o: io.h sanity.h input_common.h input.h parser.h event.h env.h expand.h
input.o: translate.h output.h
input_common.o: config.h fallback.h common.h util.h wutil.h input_common.h
input_common.o: env_universal.h env_universal_common.h
intern.o: config.h util.h common.h intern.h
io.o: config.h util.h wutil.h exec.h proc.h io.h common.h translate.h
key_reader.o: input_common.h
kill.o: signal.h config.h util.h wutil.h kill.h proc.h io.h sanity.h common.h
kill.o: env.h expand.h exec.h parser.h
main.o: config.h signal.h util.h common.h reader.h builtin.h function.h
main.o: complete.h wutil.h env.h sanity.h proc.h io.h parser.h expand.h
main.o: intern.h exec.h event.h output.h translate.h
mimedb.o: config.h xdgmime.h util.h
output.o: config.h signal.h util.h wutil.h expand.h common.h output.h
output.o: highlight.h
parser.o: signal.h config.h util.h common.h wutil.h proc.h io.h parser.h
parser.o: tokenizer.h exec.h wildcard.h function.h builtin.h builtin_help.h
parser.o: env.h expand.h reader.h sanity.h env_universal.h
parser.o: env_universal_common.h event.h translate.h
proc.o: config.h signal.h util.h wutil.h proc.h io.h common.h reader.h
proc.o: sanity.h env.h parser.h event.h translate.h
reader.o: config.h signal.h util.h wutil.h highlight.h reader.h proc.h io.h
reader.o: parser.h complete.h history.h common.h sanity.h env.h exec.h
reader.o: expand.h tokenizer.h kill.h input_common.h input.h function.h
reader.o: output.h translate.h
sanity.o: signal.h config.h util.h common.h sanity.h proc.h io.h history.h
sanity.o: reader.h kill.h wutil.h
intern.o: config.h fallback.h common.h util.h wutil.h intern.h
io.o: config.h fallback.h common.h util.h wutil.h exec.h proc.h io.h
io.o: translate.h halloc.h
key_reader.o: fallback.h common.h util.h input_common.h
kill.o: signal.h config.h fallback.h common.h util.h wutil.h kill.h proc.h
kill.o: io.h sanity.h env.h exec.h parser.h event.h
main.o: config.h signal.h fallback.h common.h util.h reader.h builtin.h
main.o: function.h complete.h wutil.h env.h sanity.h proc.h io.h parser.h
main.o: event.h expand.h intern.h exec.h output.h translate.h halloc_util.h
main.o: history.h
mimedb.o: config.h xdgmime.h fallback.h common.h util.h
output.o: config.h signal.h fallback.h common.h util.h wutil.h expand.h
output.o: output.h halloc_util.h highlight.h
parser.o: signal.h config.h fallback.h common.h util.h wutil.h proc.h io.h
parser.o: parser.h event.h tokenizer.h exec.h wildcard.h function.h builtin.h
parser.o: builtin_help.h env.h expand.h reader.h sanity.h env_universal.h
parser.o: env_universal_common.h translate.h intern.h parse_util.h halloc.h
parser.o: halloc_util.h
parse_util.o: config.h fallback.h common.h util.h wutil.h tokenizer.h
parse_util.o: parse_util.h expand.h intern.h exec.h proc.h io.h env.h
parse_util.o: wildcard.h halloc_util.h
proc.o: config.h signal.h fallback.h common.h util.h wutil.h proc.h io.h
proc.o: reader.h sanity.h env.h parser.h event.h translate.h halloc.h
proc.o: halloc_util.h output.h
reader.o: config.h signal.h fallback.h common.h util.h wutil.h highlight.h
reader.o: reader.h proc.h io.h parser.h event.h complete.h history.h sanity.h
reader.o: env.h exec.h expand.h tokenizer.h kill.h input_common.h input.h
reader.o: function.h output.h translate.h parse_util.h
refcount.o: config.h fallback.h common.h util.h wutil.h refcount.h
sanity.o: signal.h config.h fallback.h common.h util.h sanity.h proc.h io.h
sanity.o: history.h reader.h kill.h wutil.h translate.h
set_color.o: config.h
signal.o: config.h signal.h common.h util.h wutil.h event.h reader.h proc.h
signal.o: io.h translate.h
tokenizer.o: config.h util.h wutil.h tokenizer.h common.h wildcard.h
tokenizer.o: translate.h
translate.o: config.h common.h util.h
util.o: config.h util.h common.h wutil.h
wgetopt.o: config.h wgetopt.h wutil.h
wildcard.o: config.h util.h wutil.h complete.h common.h wildcard.h reader.h
wildcard.o: expand.h translate.h
wutil.o: config.h util.h common.h wutil.h
signal.o: config.h signal.h common.h util.h fallback.h wutil.h event.h
signal.o: reader.h proc.h io.h translate.h
tokenizer.o: config.h fallback.h common.h util.h wutil.h tokenizer.h
tokenizer.o: wildcard.h translate.h
translate.o: config.h common.h util.h fallback.h halloc_util.h
util.o: config.h fallback.h common.h util.h wutil.h
wgetopt.o: config.h wgetopt.h wutil.h fallback.h common.h util.h translate.h
wildcard.o: config.h fallback.h common.h util.h wutil.h complete.h wildcard.h
wildcard.o: reader.h expand.h translate.h
wutil.o: config.h fallback.h common.h util.h wutil.h
xdgmimealias.o: xdgmimealias.h xdgmime.h xdgmimeint.h
xdgmime.o: xdgmime.h xdgmimeint.h xdgmimeglob.h xdgmimemagic.h xdgmimealias.h
xdgmime.o: xdgmimeparent.h

176
builtin.c
View File

@@ -38,7 +38,10 @@
#include <time.h>
#include "config.h"
#include "fallback.h"
#include "util.h"
#include "wutil.h"
#include "builtin.h"
#include "function.h"
@@ -60,6 +63,9 @@
#include "signal.h"
#include "translate.h"
#include "halloc.h"
#include "halloc_util.h"
#include "parse_util.h"
#include "expand.h"
/**
The default prompt for the read command
@@ -496,7 +502,7 @@ static int builtin_builtin( wchar_t **argv )
al_init( &names );
builtin_get_names( &names );
names_arr = list_to_char_arr( 0, &names );
names_arr = list_to_char_arr( &names );
qsort( names_arr,
al_get_count( &names ),
sizeof(wchar_t *),
@@ -511,7 +517,7 @@ static int builtin_builtin( wchar_t **argv )
L"\n",
(void *)0 );
}
halloc_free( names_arr );
free( names_arr );
al_destroy( &names );
}
return 0;
@@ -580,6 +586,7 @@ static int builtin_generic( wchar_t **argv )
}
/**
Output a definition of the specified function to the sb_out
stringbuffer. Used by the functions builtin.
*/
static void functions_def( wchar_t *name )
@@ -813,7 +820,7 @@ static int builtin_functions( wchar_t **argv )
al_init( &names );
function_get_names( &names, show_hidden );
names_arr = list_to_char_arr( 0, &names );
names_arr = list_to_char_arr( &names );
qsort( names_arr,
al_get_count( &names ),
sizeof(wchar_t *),
@@ -845,7 +852,7 @@ static int builtin_functions( wchar_t **argv )
}
}
halloc_free( names_arr );
free( names_arr );
al_destroy( &names );
return 0;
}
@@ -858,7 +865,7 @@ static int builtin_functions( wchar_t **argv )
sb_append( sb_out, _( L"Current function definitions are:\n\n" ) );
al_init( &names );
function_get_names( &names, show_hidden );
names_arr = list_to_char_arr( 0, &names );
names_arr = list_to_char_arr( &names );
qsort( names_arr,
al_get_count( &names ),
sizeof(wchar_t *),
@@ -867,7 +874,7 @@ static int builtin_functions( wchar_t **argv )
{
functions_def( names_arr[i] );
}
halloc_free( names_arr );
free( names_arr );
al_destroy( &names );
break;
}
@@ -924,8 +931,7 @@ static int builtin_function( wchar_t **argv )
woptind=0;
parser_push_block( FUNCTION_DEF );
events=halloc( current_block, sizeof(array_list_t ) );
al_init( events );
events=al_halloc( current_block );
const static struct woption
long_options[] =
@@ -1023,7 +1029,7 @@ static int builtin_function( wchar_t **argv )
{
event_t *e;
if( !wcsvarname( woptarg ) )
if( wcsvarname( woptarg ) )
{
sb_printf( sb_err,
_( L"%ls: Invalid variable name '%ls'\n" ),
@@ -1037,7 +1043,7 @@ static int builtin_function( wchar_t **argv )
if( !e )
die_mem();
e->type = EVENT_VARIABLE;
e->param1.variable = halloc_register( current_block, wcsdup( woptarg ));
e->param1.variable = halloc_wcsdup( current_block, woptarg );
e->function_name=0;
al_push( events, e );
break;
@@ -1139,7 +1145,7 @@ static int builtin_function( wchar_t **argv )
argc-woptind );
res=1;
}
else if( !(is_binding?wcsbindingname( argv[woptind] ) : wcsvarname( argv[woptind] ) ))
else if( !(is_binding?wcsbindingname( argv[woptind] ) : !wcsvarname( argv[woptind] ) ))
{
sb_printf( sb_err,
_( L"%ls: Illegal function name '%ls'\n" ),
@@ -1160,8 +1166,6 @@ static int builtin_function( wchar_t **argv )
}
}
halloc_register( current_block, events->arr );
if( res )
{
int i;
@@ -1176,7 +1180,7 @@ static int builtin_function( wchar_t **argv )
al_init( &names );
function_get_names( &names, 0 );
names_arr = list_to_char_arr( 0, &names );
names_arr = list_to_char_arr( &names );
qsort( names_arr,
al_get_count( &names ),
sizeof(wchar_t *),
@@ -1194,7 +1198,7 @@ static int builtin_function( wchar_t **argv )
sb_append2( sb_err,
nxt, L" ", (void *)0 );
}
halloc_free( names_arr );
free( names_arr );
al_destroy( &names );
sb_append( sb_err, L"\n" );
@@ -1203,11 +1207,11 @@ static int builtin_function( wchar_t **argv )
}
else
{
current_block->param1.function_name=halloc_register( current_block, wcsdup(argv[woptind]));
current_block->param2.function_description=desc?halloc_register( current_block, wcsdup(desc)):0;
current_block->param1.function_name=halloc_wcsdup( current_block, argv[woptind]);
current_block->param2.function_description=desc?halloc_wcsdup( current_block, desc):0;
current_block->param3.function_is_binding = is_binding;
current_block->param4.function_events = events;
for( i=0; i<al_get_count( events ); i++ )
{
event_t *e = (event_t *)al_get( events, i );
@@ -1344,7 +1348,8 @@ static int builtin_read( wchar_t **argv )
wchar_t *nxt;
wchar_t *prompt = DEFAULT_READ_PROMPT;
wchar_t *commandline = L"";
int exit_res=0;
woptind=0;
while( 1 )
@@ -1463,20 +1468,6 @@ static int builtin_read( wchar_t **argv )
return 1;
}
if( woptind == argc )
{
sb_printf( sb_err,
BUILTIN_ERR_MISSING,
argv[0] );
sb_append2( sb_err,
parser_current_line(),
L"\n",
(void *)0 );
builtin_print_help( argv[0], sb_err );
return 1;
}
/*
Verify all variable names
*/
@@ -1507,10 +1498,6 @@ static int builtin_read( wchar_t **argv )
*/
i=woptind;
ifs = env_get( L"IFS" );
if( ifs == 0 )
ifs = L"";
/*
Check if we should read interactively using \c reader_readline()
*/
@@ -1526,10 +1513,12 @@ static int builtin_read( wchar_t **argv )
else
{
string_buffer_t sb;
int eof=0;
sb_init( &sb );
while( 1 )
{
int eof=0;
int finished=0;
wchar_t res=0;
@@ -1570,30 +1559,46 @@ static int builtin_read( wchar_t **argv )
if( eof )
break;
if( res == L'\n' )
break;
sb_append_char( &sb, res );
}
if( sb.used < 2 && eof )
{
exit_res = 1;
}
buff = wcsdup( (wchar_t *)sb.buff );
sb_destroy( &sb );
}
wchar_t *state;
nxt = wcstok( buff, (i<argc-1)?ifs:L"", &state );
while( i<argc )
if( i != argc )
{
env_set( argv[i], nxt != 0 ? nxt: L"", place );
wchar_t *state;
i++;
if( nxt != 0 )
nxt = wcstok( 0, (i<argc-1)?ifs:L"", &state);
ifs = env_get( L"IFS" );
if( ifs == 0 )
ifs = L"";
nxt = wcstok( buff, (i<argc-1)?ifs:L"", &state );
while( i<argc )
{
env_set( argv[i], nxt != 0 ? nxt: L"", place );
i++;
if( nxt != 0 )
nxt = wcstok( 0, (i<argc-1)?ifs:L"", &state);
}
}
free( buff );
return 0;
return exit_res;
}
/**
@@ -1613,6 +1618,8 @@ static int builtin_status( wchar_t **argv )
IS_NO_JOB_CONTROL,
STACK_TRACE,
DONE,
CURRENT_FILENAME,
CURRENT_LINE_NUMBER
}
;
@@ -1658,6 +1665,14 @@ static int builtin_status( wchar_t **argv )
L"is-no-job-control", no_argument, &mode, IS_NO_JOB_CONTROL
}
,
{
L"current-filename", no_argument, &mode, CURRENT_FILENAME
}
,
{
L"current-line-number", no_argument, &mode, CURRENT_LINE_NUMBER
}
,
{
L"job-control", required_argument, 0, 'j'
}
@@ -1732,6 +1747,24 @@ static int builtin_status( wchar_t **argv )
switch( mode )
{
case CURRENT_FILENAME:
{
const wchar_t *fn = parser_current_filename();
if( !fn )
fn = _(L"Standard input");
sb_printf( sb_out, L"%ls\n", fn );
break;
}
case CURRENT_LINE_NUMBER:
{
sb_printf( sb_out, L"%d\n", parser_get_lineno() );
break;
}
case IS_INTERACTIVE:
return !is_interactive_session;
@@ -1766,9 +1799,9 @@ static int builtin_status( wchar_t **argv )
else
sb_printf( sb_out, _( L"This is not a login shell\n" ) );
sb_printf( sb_out, _(L"Job control: %ls\n"),
job_control_mode==JOB_CONTROL_INTERACTIVE?_(L"Only on interactive jobs"):
(job_control_mode==JOB_CONTROL_NONE?_(L"Never"):_(L"Always")) );
sb_printf( sb_out, _( L"Job control: %ls\n" ),
job_control_mode==JOB_CONTROL_INTERACTIVE?_( L"Only on interactive jobs" ):
(job_control_mode==JOB_CONTROL_NONE ? _( L"Never" ) : _( L"Always" ) ) );
parser_stack_trace( current_block, sb_out );
break;
@@ -1943,9 +1976,9 @@ static int builtin_source( wchar_t ** argv )
argc = builtin_count_args( argv );
if( argc != 2 )
if( argc < 2 )
{
sb_printf( sb_err, _( L"%ls: Expected exactly one argument, got %d\n" ), argv[0], argc );
sb_printf( sb_err, _( L"%ls: Expected at least one argument, got %d\n" ), argv[0], argc );
builtin_print_help( argv[0], sb_err );
return 1;
}
@@ -1972,7 +2005,7 @@ static int builtin_source( wchar_t ** argv )
{
wchar_t *fn = wrealpath( argv[1], 0 );
const wchar_t *fn_intern;
if( !fn )
{
fn_intern = intern( argv[1] );
@@ -1985,18 +2018,20 @@ static int builtin_source( wchar_t ** argv )
parser_push_block( SOURCE );
reader_push_current_filename( fn_intern );
current_block->param1.source_dest = fn_intern;
parse_util_set_argv( argv+2);
res = reader_read( fd );
parser_pop_block();
if( res )
{
sb_printf( sb_err,
_( L"%ls: Error while reading file '%ls'\n" ),
argv[0],
argv[1]
);
argv[1] );
}
/*
@@ -2010,7 +2045,6 @@ static int builtin_source( wchar_t ** argv )
return res;
}
/**
Make the specified job the first job of the job list. Moving jobs
around in the list makes the list reflect the order in which the
@@ -2460,7 +2494,7 @@ static int builtin_jobs( wchar_t **argv )
*/
for( j=first_job; j; j=j->next )
{
if( j->constructed )
if( j->constructed && !job_is_completed(j) )
{
builtin_jobs_print( j, mode, !found );
return 0;
@@ -2493,7 +2527,7 @@ static int builtin_jobs( wchar_t **argv )
j = job_get_from_pid( pid );
if( j )
if( j && !job_is_completed( j ) )
{
builtin_jobs_print( j, mode, !found );
}
@@ -2514,7 +2548,7 @@ static int builtin_jobs( wchar_t **argv )
/*
Ignore unconstructed jobs, i.e. ourself.
*/
if( j->constructed /*&& j->skip_notification*/ )
if( j->constructed && !job_is_completed(j) )
{
builtin_jobs_print( j, mode, !found );
found = 1;
@@ -2545,11 +2579,12 @@ static int builtin_for( wchar_t **argv )
if( argc < 3)
{
sb_printf( sb_err,
_( L"%ls: Expected at least two arguments\n" ),
_( L"%ls: Expected at least two arguments, got %d\n"),
argc ,
argv[0] );
builtin_print_help( argv[0], sb_err );
}
else if ( !wcsvarname(argv[1]) )
else if ( wcsvarname(argv[1]) )
{
sb_printf( sb_err,
_( L"%ls: '%ls' is not a valid variable name\n" ),
@@ -2581,11 +2616,11 @@ static int builtin_for( wchar_t **argv )
int i;
current_block->tok_pos = parser_get_pos();
current_block->param1.for_variable = halloc_register( current_block, wcsdup( argv[1] ));
current_block->param1.for_variable = halloc_wcsdup( current_block, argv[1] );
for( i=argc-1; i>3; i-- )
{
al_push( &current_block->param2.for_vars, halloc_register( current_block, wcsdup(argv[ i ] ) ) );
al_push( &current_block->param2.for_vars, halloc_wcsdup( current_block, argv[ i ] ) );
}
halloc_register( current_block, current_block->param2.for_vars.arr );
@@ -2901,7 +2936,7 @@ static int builtin_switch( wchar_t **argv )
else
{
parser_push_block( SWITCH );
current_block->param1.switch_value = halloc_register( current_block, wcsdup( argv[1]));
current_block->param1.switch_value = halloc_wcsdup( current_block, argv[1]);
current_block->skip=1;
current_block->param2.switch_taken=0;
}
@@ -2937,8 +2972,10 @@ static int builtin_case( wchar_t **argv )
for( i=1; i<argc; i++ )
{
free( unescaped );
unescaped = unescape( argv[i], 1);
unescaped = parse_util_unescape_wildcards( argv[i] );
if( wildcard_match( current_block->param1.switch_value, unescaped ) )
{
current_block->skip = 0;
@@ -3145,6 +3182,7 @@ void builtin_destroy()
{
hash_destroy( desc );
free( desc );
desc=0;
}
al_destroy( &io_stack );
@@ -3184,7 +3222,7 @@ static int internal_help( wchar_t *cmd )
int builtin_run( wchar_t **argv )
{
int (*cmd)(wchar_t **argv)=0;
cmd = hash_get( &builtin, argv[0] );
cmd = (int (*)(wchar_t **))hash_get( &builtin, argv[0] );
if( argv[1] != 0 && !internal_help(argv[0]) )
{

View File

@@ -12,7 +12,10 @@ Functions used for implementing the commandline builtin.
#include <signal.h>
#include "config.h"
#include "fallback.h"
#include "util.h"
#include "wutil.h"
#include "builtin.h"
#include "common.h"

View File

@@ -12,7 +12,10 @@ Functions used for implementing the complete builtin.
#include <signal.h>
#include "config.h"
#include "fallback.h"
#include "util.h"
#include "wutil.h"
#include "builtin.h"
#include "common.h"
@@ -27,7 +30,7 @@ const static wchar_t *temporary_buffer;
/*
builtin_complete_* are a set of rather silly looping functions that
make sure that all the proper combinations of complete_add or
complete_remove get called.
complete_remove get called.
*/
static void builtin_complete_add2( const wchar_t *cmd,
@@ -253,7 +256,7 @@ int builtin_complete( wchar_t **argv )
string_buffer_t short_opt;
array_list_t gnu_opt, old_opt;
wchar_t *comp=L"", *desc=L"", *condition=L"", *load=0;
wchar_t *comp=L"", *desc=L"", *condition=L"";
wchar_t *do_complete = 0;
@@ -307,7 +310,8 @@ int builtin_complete( wchar_t **argv )
}
,
{
L"long-option", required_argument, 0, 'l' }
L"long-option", required_argument, 0, 'l'
}
,
{
L"old-option", required_argument, 0, 'o'
@@ -333,10 +337,6 @@ int builtin_complete( wchar_t **argv )
L"condition", required_argument, 0, 'n'
}
,
{
L"load", required_argument, 0, 'y'
}
,
{
L"do-complete", required_argument, 0, 'C'
}
@@ -351,7 +351,7 @@ int builtin_complete( wchar_t **argv )
int opt = wgetopt_long( argc,
argv,
L"a:c:p:s:l:o:d:frxeun:y:C:",
L"a:c:p:s:l:o:d:frxeun:C:",
long_options,
&opt_index );
if( opt == -1 )
@@ -368,6 +368,7 @@ int builtin_complete( wchar_t **argv )
long_options[opt_index].name );
sb_append( sb_err,
parser_current_line() );
// builtin_print_help( argv[0], sb_err );
@@ -418,25 +419,21 @@ int builtin_complete( wchar_t **argv )
comp = woptarg;
break;
case 'e':
remove = 1;
break;
case 'n':
condition = woptarg;
break;
case 'y':
load = woptarg;
break;
case 'C':
do_complete = woptarg?woptarg:reader_get_buffer();
break;
case '?':
sb_append( sb_err,
parser_current_line() );
// builtin_print_help( argv[0], sb_err );
res = 1;
@@ -446,90 +443,85 @@ int builtin_complete( wchar_t **argv )
}
if( res != 0 )
if( !res )
{
}
else if( do_complete )
{
array_list_t comp;
int i;
const wchar_t *prev_temporary_buffer = temporary_buffer;
temporary_buffer = do_complete;
if( recursion_level < 1 )
if( do_complete )
{
recursion_level++;
array_list_t comp;
int i;
const wchar_t *prev_temporary_buffer = temporary_buffer;
temporary_buffer = do_complete;
if( recursion_level < 1 )
{
recursion_level++;
al_init( &comp );
complete( do_complete, &comp );
for( i=0; i<al_get_count( &comp ); i++ )
{
wchar_t *next = (wchar_t *)al_get( &comp, i );
wchar_t *sep = wcschr( next, COMPLETE_SEP );
if( sep )
*sep = L'\t';
sb_printf( sb_out, L"%ls\n", next );
}
al_foreach( &comp, (void (*)(const void *))&free );
al_destroy( &comp );
recursion_level--;
}
temporary_buffer = prev_temporary_buffer;
al_init( &comp );
complete( do_complete, &comp );
for( i=0; i<al_get_count( &comp ); i++ )
{
wchar_t *next = (wchar_t *)al_get( &comp, i );
wchar_t *sep = wcschr( next, COMPLETE_SEP );
if( sep )
*sep = L'\t';
sb_printf( sb_out, L"%ls\n", next );
}
al_foreach( &comp, (void (*)(const void *))&free );
al_destroy( &comp );
recursion_level--;
}
temporary_buffer = prev_temporary_buffer;
}
else if( woptind != argc )
{
sb_printf( sb_err,
_( L"%ls: Too many arguments\n" ),
argv[0] );
sb_append( sb_err,
parser_current_line() );
// builtin_print_help( argv[0], sb_err );
res = 1;
}
else if( load )
{
complete_load( load, 1 );
}
else if( (al_get_count( &cmd) == 0 ) && (al_get_count( &path) == 0 ) )
{
/* No arguments specified, meaning we print the definitions of
* all specified completions to stdout.*/
complete_print( sb_out );
}
else
{
if( remove )
else if( woptind != argc )
{
builtin_complete_remove( &cmd,
&path,
(wchar_t *)short_opt.buff,
&gnu_opt,
&old_opt );
sb_printf( sb_err,
_( L"%ls: Too many arguments\n" ),
argv[0] );
sb_append( sb_err,
parser_current_line() );
// builtin_print_help( argv[0], sb_err );
res = 1;
}
else if( (al_get_count( &cmd) == 0 ) && (al_get_count( &path) == 0 ) )
{
/* No arguments specified, meaning we print the definitions of
* all specified completions to stdout.*/
complete_print( sb_out );
}
else
{
builtin_complete_add( &cmd,
&path,
(wchar_t *)short_opt.buff,
&gnu_opt,
&old_opt,
result_mode,
authorative,
condition,
comp,
desc );
}
}
if( remove )
{
builtin_complete_remove( &cmd,
&path,
(wchar_t *)short_opt.buff,
&gnu_opt,
&old_opt );
}
else
{
builtin_complete_add( &cmd,
&path,
(wchar_t *)short_opt.buff,
&gnu_opt,
&old_opt,
result_mode,
authorative,
condition,
comp,
desc );
}
}
}
al_foreach( &cmd, (void (*)(const void *))&free );
al_foreach( &path, (void (*)(const void *))&free );

View File

@@ -12,7 +12,10 @@ Functions used for implementing the set builtin.
#include <signal.h>
#include "config.h"
#include "fallback.h"
#include "util.h"
#include "wutil.h"
#include "builtin.h"
#include "env.h"
@@ -23,6 +26,26 @@ Functions used for implementing the set builtin.
#include "parser.h"
#include "translate.h"
#define BUILTIN_SET_PATH_ERROR L"%ls: Could not add component %ls to %ls.\n"
#define BUILTIN_SET_PATH_HINT L"%ls: Did you mean 'set %ls $%ls %ls'?\n"
/**
Call env_set. On error, print a description of the problem to
stderr.
*/
static void my_env_set( const wchar_t *key, const wchar_t *val, int scope )
{
switch( env_set( key, val, scope | ENV_USER ) )
{
case ENV_PERM:
{
sb_printf( sb_err, _(L"%ls: Tried to change the read-only variable '%ls'\n"), L"set", key );
break;
}
}
}
/**
Extract the name from a destination argument of the form name[index1 index2...]
*/
@@ -111,7 +134,12 @@ static int parse_fill_indexes( array_list_t *indexes,
/**
Update a list by writing the specified values at the specified indexes
Update a list \c list by writing copies (using wcsdup) of the
values specified by \c values to the indexes specified by \c
indexes. The previous entries at the specidied position will be
free'd.
\return The number of elements in the list after the modifications have been made
*/
static int update_values( array_list_t *list,
array_list_t *indexes,
@@ -119,16 +147,12 @@ static int update_values( array_list_t *list,
{
int i;
//fwprintf(stderr, L"Scan complete\n");
/* Replace values where needed */
for( i = 0; i < al_get_count(indexes); i++ )
{
int ind = *(int *) al_get(indexes, i) - 1;
void *new = (void *) al_get(values, i);
if (al_get(list, ind) != 0)
{
free((void *) al_get(list, ind));
}
free((void *) al_get(list, ind));
al_set(list, ind, new != 0 ? wcsdup(new) : wcsdup(L""));
}
@@ -166,8 +190,6 @@ static int erase_values(array_list_t *list, array_list_t *indexes)
int i;
array_list_t result;
//fwprintf(stderr, L"Starting with %d\n", al_get_count(list));
al_init(&result);
for (i = 0; i < al_get_count(list); i++)
@@ -186,8 +208,6 @@ static int erase_values(array_list_t *list, array_list_t *indexes)
al_push_all( list, &result );
al_destroy(&result);
//fwprintf(stderr, L"Remaining: %d\n", al_get_count(&result));
return al_get_count(list);
}
@@ -204,8 +224,6 @@ static int fill_buffer_from_list(string_buffer_t *sb, array_list_t *list)
wchar_t *v = (wchar_t *) al_get(list, i);
if (v != 0)
{
// fwprintf(stderr, L".\n");
// fwprintf(stderr, L"Collecting %ls from %d\n", v, i);
sb_append(sb, v);
}
if (i < al_get_count(list) - 1)
@@ -251,12 +269,25 @@ static void print_variables(int include_values, int esc, int scope)
al_destroy(&names);
}
static int is_path_variable( const wchar_t *env )
{
return contains_str( env,
L"PATH",
L"CDPATH",
(void *)0 );
}
/**
The set builtin. Creates, updates and erases environment variables and environemnt variable arrays.
*/
int builtin_set( wchar_t **argv )
{
/**
Variables used for parsing the argument list
*/
const static struct woption
long_options[] =
{
@@ -290,7 +321,7 @@ int builtin_set( wchar_t **argv )
}
;
wchar_t short_options[] = L"+xglenuUq";
const wchar_t *short_options = L"+xglenuUq";
int argc = builtin_count_args(argv);
@@ -360,6 +391,15 @@ int builtin_set( wchar_t **argv )
}
}
/*
Ok, all arguments have been parsed, let's validate them
*/
/*
If we are checking the existance of a variable (-q) we can not
also specify scope
*/
if( query && (erase || list || global || local || universal || export || unexport ) )
{
sb_printf(sb_err,
@@ -372,7 +412,7 @@ int builtin_set( wchar_t **argv )
}
/* Check operation and modifiers sanity */
/* We can't both list and erase varaibles */
if( erase && list )
{
sb_printf(sb_err,
@@ -384,6 +424,9 @@ int builtin_set( wchar_t **argv )
return 1;
}
/*
Variables can only have one scope
*/
if( local + global + universal > 1 )
{
sb_printf( sb_err,
@@ -394,6 +437,9 @@ int builtin_set( wchar_t **argv )
return 1;
}
/*
Variables can only have one export status
*/
if( export && unexport )
{
sb_printf( sb_err,
@@ -407,13 +453,16 @@ int builtin_set( wchar_t **argv )
if( query )
{
/*
Query mode. Return number of specified variables that do not exist.
Query mode. Return the number variables that do not exist
out of the specified variables.
*/
int i;
for( i=woptind; i<argc; i++ )
{
if( !env_exist( argv[i] ) )
{
retcode++;
}
}
return retcode;
@@ -424,8 +473,7 @@ int builtin_set( wchar_t **argv )
if( woptind < argc )
{
dest = wcsdup(argv[woptind++]);
//fwprintf(stderr, L"Dest: %ls\n", dest);
if( !wcslen( dest ) )
{
free( dest );
@@ -441,9 +489,82 @@ int builtin_set( wchar_t **argv )
while( woptind < argc )
{
al_push(&values, argv[woptind++]);
// fwprintf(stderr, L"Val: %ls\n", argv[woptind - 1]);
}
if( is_path_variable( dest ) )
{
int i;
int error = 0;
for( i=0; i<al_get_count( &values ); i++ )
{
int show_perror = 0;
int show_hint = 0;
struct stat buff;
wchar_t *dir = (wchar_t *)al_get( &values, i );
if( wstat( dir, &buff ) )
{
error = 1;
show_perror = 1;
}
if( !( S_IFDIR & buff.st_mode ) )
{
error = 1;
}
if( error )
{
wchar_t *colon;
sb_printf( sb_err,
_(BUILTIN_SET_PATH_ERROR),
argv[0],
dir,
dest );
colon = wcschr( dir, L':' );
if( colon && *(colon+1) )
{
show_hint = 1;
}
}
if( show_perror )
{
builtin_wperror( argv[0] );
}
if( show_hint )
{
sb_printf( sb_err,
_(BUILTIN_SET_PATH_HINT),
argv[0],
dest,
dest,
wcschr( dir, L':' )+1);
}
if( error )
{
break;
}
}
if( error )
{
al_destroy(&values);
return 1;
}
}
/* Extract variable name and indexes */
sb_init(&name_sb);
@@ -456,8 +577,7 @@ int builtin_set( wchar_t **argv )
if( !retcode )
{
name = (wchar_t *) name_sb.buff;
//fwprintf(stderr, L"Name is %ls\n", name);
al_init(&indexes);
retval = parse_fill_indexes(&indexes, dest);
if (retval < 0)
@@ -474,7 +594,7 @@ int builtin_set( wchar_t **argv )
int scope = (local ? ENV_LOCAL : 0) | (global ? ENV_GLOBAL : 0) | (export ? ENV_EXPORT : 0) | (unexport ? ENV_UNEXPORT : 0) | (universal ? ENV_UNIVERSAL:0) | ENV_USER;
if( list )
{
/* Maybe we should issue an error if there are any other arguments */
/* Maybe we should issue an error if there are any other arguments? */
print_variables(0, 0, scope);
finished=1;
}
@@ -509,7 +629,7 @@ int builtin_set( wchar_t **argv )
!erase &&
!list )
{
env_set( name, 0, scope );
my_env_set( name, 0, scope );
finished = 1;
}
}
@@ -569,7 +689,8 @@ int builtin_set( wchar_t **argv )
else
{
fill_buffer_from_list(&result_sb, &val_l);
env_set(name, (wchar_t *) result_sb.buff, scope);
my_env_set(name, (wchar_t *) result_sb.buff, scope);
}
}
else
@@ -582,7 +703,7 @@ int builtin_set( wchar_t **argv )
fill_buffer_from_list( &result_sb,
&val_l );
env_set(name,
my_env_set(name,
(wchar_t *) result_sb.buff,
scope);
}
@@ -598,7 +719,7 @@ int builtin_set( wchar_t **argv )
}
/* Common cleanup */
//fwprintf(stderr, L"Cleanup\n");
free(dest);
sb_destroy(&name_sb);
al_destroy( &values );

View File

@@ -3,6 +3,8 @@
Functions used for implementing the ulimit builtin.
*/
#include "config.h"
#include <stdlib.h>
#include <stdio.h>
#include <wchar.h>
@@ -12,8 +14,9 @@ Functions used for implementing the ulimit builtin.
#include <unistd.h>
#include <errno.h>
#include "config.h"
#include "fallback.h"
#include "util.h"
#include "builtin.h"
#include "common.h"
#include "wgetopt.h"

343
common.c
View File

@@ -6,6 +6,7 @@ parts of fish.
#include "config.h"
#include <stdlib.h>
#include <termios.h>
#include <wchar.h>
@@ -20,7 +21,6 @@ parts of fish.
#include <errno.h>
#include <limits.h>
#include <stdarg.h>
#include <signal.h>
#include <locale.h>
#include <time.h>
#include <sys/time.h>
@@ -51,14 +51,15 @@ parts of fish.
#include <ncurses/term.h>
#endif
#include "fallback.h"
#include "util.h"
#include "wutil.h"
#include "common.h"
#include "expand.h"
#include "proc.h"
#include "wildcard.h"
#include "parser.h"
#include "halloc.h"
/**
The maximum number of minor errors to report. Further errors will be omitted.
@@ -73,13 +74,6 @@ parts of fish.
struct termios shell_modes;
/**
Number of error encountered. This is reset after each command, and
used to limit the number of error messages on commands with many
string convertion problems.
*/
static int error_count=0;
int error_max=1;
wchar_t ellipsis_char;
@@ -95,20 +89,14 @@ int debug_level=1;
*/
static struct winsize termsize;
/**
Number of nested calls to the block function. Unblock when this reaches 0.
*/
static int block_count=0;
/**
String buffer used by the wsetlocale function
*/
static string_buffer_t *setlocale_buff=0;
void common_destroy()
{
if( setlocale_buff )
{
sb_destroy( setlocale_buff );
@@ -116,9 +104,13 @@ void common_destroy()
}
}
wchar_t **list_to_char_arr( void *context, array_list_t *l )
void common_init()
{
wchar_t ** res = halloc( context, sizeof(wchar_t *)*(al_get_count( l )+1) );
}
wchar_t **list_to_char_arr( array_list_t *l )
{
wchar_t ** res = malloc( sizeof(wchar_t *)*(al_get_count( l )+1) );
int i;
if( res == 0 )
{
@@ -127,40 +119,11 @@ wchar_t **list_to_char_arr( void *context, array_list_t *l )
for( i=0; i<al_get_count( l ); i++ )
{
res[i] = (wchar_t *)al_get(l,i);
if( context )
halloc_register( context, res[i] );
}
res[i]='\0';
return res;
}
void block()
{
block_count++;
if( block_count == 1 )
{
sigset_t chldset;
sigemptyset( &chldset );
sigaddset( &chldset, SIGCHLD );
sigprocmask(SIG_BLOCK, &chldset, 0);
}
}
void unblock()
{
block_count--;
if( block_count == 0 )
{
sigset_t chldset;
sigemptyset( &chldset );
sigaddset( &chldset, SIGCHLD );
sigprocmask(SIG_UNBLOCK, &chldset, 0);
}
}
int fgetws2( wchar_t **b, int *len, FILE *f )
{
int i=0;
@@ -174,8 +137,6 @@ int fgetws2( wchar_t **b, int *len, FILE *f )
watching for EINTR errors, bytes are lost.
*/
block();
while( 1 )
{
/* Reallocate the buffer if necessary */
@@ -214,8 +175,6 @@ int fgetws2( wchar_t **b, int *len, FILE *f )
case L'\n':
case L'\0':
buff[i]=L'\0';
unblock();
return i;
/* Ignore carriage returns */
case L'\r':
@@ -228,7 +187,6 @@ int fgetws2( wchar_t **b, int *len, FILE *f )
}
unblock();
}
@@ -254,20 +212,28 @@ void sort_list( array_list_t *comp )
wchar_t *str2wcs( const char *in )
{
wchar_t *out;
size_t res=0;
int in_pos=0;
int out_pos = 0;
size_t len = strlen(in);
mbstate_t state;
out = malloc( sizeof(wchar_t)*(len+1) );
memset( &state, 0, sizeof(state) );
if( !out )
{
die_mem();
}
return str2wcs_internal( in, out );
}
wchar_t *str2wcs_internal( const char *in, wchar_t *out )
{
size_t res=0;
int in_pos=0;
int out_pos = 0;
mbstate_t state;
size_t len = strlen(in);
memset( &state, 0, sizeof(state) );
while( in[in_pos] )
{
res = mbrtowc( &out[out_pos], &in[in_pos], len-in_pos, &state );
@@ -287,6 +253,7 @@ wchar_t *str2wcs( const char *in )
{
return out;
}
default:
{
in_pos += res;
@@ -300,27 +267,28 @@ wchar_t *str2wcs( const char *in )
return out;
}
void error_reset()
{
error_count=0;
}
char *wcs2str( const wchar_t *in )
{
char *out;
size_t res=0;
int in_pos=0;
int out_pos = 0;
mbstate_t state;
out = malloc( MAX_UTF8_BYTES*wcslen(in)+1 );
memset( &state, 0, sizeof(state) );
if( !out )
{
die_mem();
}
return wcs2str_internal( in, out );
}
char *wcs2str_internal( const wchar_t *in, char *out )
{
size_t res=0;
int in_pos=0;
int out_pos = 0;
mbstate_t state;
memset( &state, 0, sizeof(state) );
while( in[in_pos] )
{
if( ( in[in_pos] >= ENCODE_DIRECT_BASE) &&
@@ -332,19 +300,14 @@ char *wcs2str( const wchar_t *in )
{
res = wcrtomb( &out[out_pos], in[in_pos], &state );
switch( res )
if( res == (size_t)(-1) )
{
case (size_t)(-1):
{
debug( 1, L"Wide character has no narrow representation" );
memset( &state, 0, sizeof(state) );
break;
}
default:
{
out_pos += res;
break;
}
debug( 1, L"Wide character has no narrow representation" );
memset( &state, 0, sizeof(state) );
}
else
{
out_pos += res;
}
}
in_pos++;
@@ -437,121 +400,17 @@ wchar_t **strv2wcsv( const char **in )
}
/*$OpenBSD: strlcat.c,v 1.11 2003/06/17 21:56:24 millert Exp $*/
/*
* Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
size_t
wcslcat(wchar_t *dst, const wchar_t *src, size_t siz)
{
register wchar_t *d = dst;
register const wchar_t *s = src;
register size_t n = siz;
size_t dlen;
/* Find the end of dst and adjust bytes left but don't go past end */
while (n-- != 0 && *d != '\0')
d++;
dlen = d - dst;
n = siz - dlen;
if (n == 0)
return(dlen + wcslen(s));
while (*s != '\0')
{
if (n != 1)
{
*d++ = *s;
n--;
}
s++;
}
*d = '\0';
return(dlen + (s - src));
/* count does not include NUL */
}
/*$OpenBSD: strlcpy.c,v 1.8 2003/06/17 21:56:24 millert Exp $*/
/*
* Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
size_t
wcslcpy(wchar_t *dst, const wchar_t *src, size_t siz)
{
register wchar_t *d = dst;
register const wchar_t *s = src;
register size_t n = siz;
/* Copy as many bytes as will fit */
if (n != 0 && --n != 0)
{
do
{
if ((*d++ = *s++) == 0)
break;
}
while (--n != 0);
}
/* Not enough room in dst, add NUL and traverse rest of src */
if (n == 0)
{
if (siz != 0)
*d = '\0';
/* NUL-terminate dst */
while (*s++)
;
}
return(s - src - 1);
/* count does not include NUL */
}
int wcsvarname( wchar_t *str )
wchar_t *wcsvarname( wchar_t *str )
{
while( *str )
{
if( (!iswalnum(*str)) && (*str != L'_' ) )
{
return 0;
return str;
}
str++;
}
return 1;
return 0;
}
@@ -574,12 +433,34 @@ int my_wcswidth( const wchar_t *c )
return res;
}
wchar_t *quote_end( const wchar_t *in )
const wchar_t *quote_end( const wchar_t *pos )
{
return wcschr( in+1, *in );
wchar_t c = *pos;
while( 1 )
{
pos++;
if( !*pos )
return 0;
if( *pos == L'\\')
{
pos++;
}
else
{
if( *pos == c )
{
return pos;
}
}
}
return 0;
}
const wchar_t *wsetlocale(int category, const wchar_t *locale)
{
@@ -642,12 +523,6 @@ int read_blocked(int fd, void *buf, size_t count)
return res;
}
int writeb( tputs_arg_t b )
{
write( 1, &b, 1 );
// putc( b, stdout );
return 0;
}
void die_mem()
{
@@ -938,74 +813,87 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special )
break;
}
case L'X':
case L'u':
case L'U':
case L'x':
case L'o':
case L'X':
case L'0':
case L'1':
case L'2':
case L'3':
case L'4':
case L'5':
case L'6':
case L'7':
{
int i;
wchar_t res=0;
long long res=0;
int chars=2;
int base=16;
int byte = 0;
int max_val = 127;
switch( in[in_pos] )
{
case L'u':
{
base=16;
chars=4;
max_val = 35535;
break;
}
case L'U':
{
base=16;
chars=8;
max_val = WCHAR_MAX;
break;
}
case L'x':
{
base=16;
chars=2;
break;
}
case L'X':
{
byte=1;
base=16;
chars=2;
max_val = 255;
break;
}
case L'o':
default:
{
base=8;
chars=3;
in_pos--;
break;
}
}
}
for( i=0; i<chars; i++ )
{
int d = convert_digit( in[++in_pos],base);
if( d < 0 )
{
in_pos--;
break;
}
res=(res*base)|d;
}
in[out_pos] = (byte?ENCODE_DIRECT_BASE:0)+res;
if( (res > 0) && (res <= max_val) )
{
in[out_pos] = (byte?ENCODE_DIRECT_BASE:0)+res;
}
else
{
free(in);
return 0;
}
break;
}
@@ -1160,6 +1048,31 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special )
*/
case 1:
{
if( c == L'\\' )
{
switch( in[++in_pos] )
{
case '\\':
case L'\'':
{
in[out_pos]=in[in_pos];
break;
}
case 0:
{
free(in);
return 0;
}
default:
{
in[out_pos++] = L'\\';
in[out_pos]= in[in_pos];
}
}
}
if( c == L'\'' )
{
in[out_pos] = INTERNAL_SEPARATOR;
@@ -1197,12 +1110,14 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special )
return 0;
}
case '\\':
case L'$':
case '"':
{
in[out_pos]=in[in_pos];
break;
}
default:
{
in[out_pos++] = L'\\';

View File

@@ -15,19 +15,6 @@
#include "util.h"
/**
Under curses, tputs expects an int (*func)(char) as its last
parameter, but in ncurses, tputs expects a int (*func)(int) as its
last parameter. tputs_arg_t is defined to always be what tputs
expects. Hopefully.
*/
#ifdef NCURSES_VERSION
typedef int tputs_arg_t;
#else
typedef char tputs_arg_t;
#endif
/**
Maximum number of bytes used by a single utf-8 character
*/
@@ -47,7 +34,7 @@ typedef char tputs_arg_t;
/**
This is in the unicode private use area.
*/
#define ENCODE_DIRECT_BASE 0xf000
#define ENCODE_DIRECT_BASE 0xf100
/**
Save the shell mode on startup so we can restore them on exit
@@ -88,7 +75,7 @@ extern wchar_t *program_name;
is not noll, all elements of the \c array_list_t are also
registered to \c context using \c halloc_register().
*/
wchar_t **list_to_char_arr( void *context, array_list_t *l );
wchar_t **list_to_char_arr( array_list_t *l );
/**
Read a line from the stream f into the buffer buff of length len. If
@@ -114,6 +101,7 @@ void sort_list( array_list_t *comp );
specified multibyte character string
*/
wchar_t *str2wcs( const char *in );
wchar_t *str2wcs_internal( const char *in, wchar_t *out );
/**
Returns a newly allocated multibyte character string equivalent of
@@ -121,6 +109,8 @@ wchar_t *str2wcs( const char *in );
*/
char *wcs2str( const wchar_t *in );
char *wcs2str_internal( const wchar_t *in, char *out );
/**
Returns a newly allocated wide character string array equivalent of
the specified multibyte character string array
@@ -144,35 +134,18 @@ wchar_t *wcsdupcat( const wchar_t *a, const wchar_t *b );
*/
wchar_t *wcsdupcat2( const wchar_t *a, ... );
/**
Appends src to string dst of size siz (unlike wcsncat, siz is the
full size of dst, not space left). At most siz-1 characters will be
copied. Always NUL terminates (unless siz <= wcslen(dst)). Returns
wcslen(src) + MIN(siz, wcslen(initial dst)). If retval >= siz,
truncation occurred.
This is the OpenBSD strlcat function, modified for wide characters,
and renamed to reflect this change.
*/
size_t wcslcat( wchar_t *dst, const wchar_t *src, size_t siz );
/**
Copy src to string dst of size siz. At most siz-1 characters will
be copied. Always NUL terminates (unless siz == 0). Returns
wcslen(src); if retval >= siz, truncation occurred.
This is the OpenBSD strlcpy function, modified for wide characters,
and renamed to reflect this change.
*/
size_t wcslcpy( wchar_t *dst, const wchar_t *src, size_t siz );
/**
Test if the given string is a valid variable name
*/
int wcsvarname( wchar_t *str );
/**
Test if the given string is a valid variable name.
\return null if this is a valid name, and a pointer to the first invalid character otherwise
*/
wchar_t *wcsvarname( wchar_t *str );
/**
@@ -187,7 +160,7 @@ int my_wcswidth( const wchar_t *c );
\param in the position of the opening quote
*/
wchar_t *quote_end( const wchar_t *in );
const wchar_t *quote_end( const wchar_t *in );
/**
A call to this function will reset the error counter. Some
@@ -220,20 +193,18 @@ int contains_str( const wchar_t *needle, ... );
*/
int read_blocked(int fd, void *buf, size_t count);
/**
This is for writing process notification messages. Has to write to
stdout, so clr_eol and such functions will work correctly. Not an
issue since this function is only used in interactive mode anyway.
*/
int writeb( tputs_arg_t b );
/**
Exit program at once, leaving an error message about running out of memory
*/
void die_mem();
/**
Clean up
Create global_context using halloc
*/
void common_init();
/**
Free global_context using halloc_free
*/
void common_destroy();
@@ -262,8 +233,7 @@ void debug( int level, const wchar_t *msg, ... );
\return The escaped string, or 0 if there is not enough memory
*/
wchar_t *escape( const wchar_t *in,
int escape_all );
wchar_t *escape( const wchar_t *in, int escape_all );
/**
Expand backslashed escapes and substitute them with their unescaped
@@ -279,16 +249,6 @@ wchar_t *escape( const wchar_t *in,
wchar_t *unescape( const wchar_t * in,
int escape_special );
/**
Block SIGCHLD. Calls to block/unblock may be nested, and only once the nest count reaches zero wiull the block be removed.
*/
void block();
/**
undo call to block().
*/
void unblock();
/**
Attempt to acquire a lock based on a lockfile, waiting LOCKPOLLINTERVAL
milliseconds between polls and timing out after timeout seconds,

File diff suppressed because it is too large Load Diff

View File

@@ -33,6 +33,8 @@
/** Separateor between completion and description*/
#define COMPLETE_SEP_STR L"\004"
#define COMPLETE_ITEM_SEP L'\uf500'
/**
Character that separates the completion and description on programmable completions
*/
@@ -162,6 +164,6 @@ int complete_is_valid_argument( const wchar_t *str,
\param cmd the command for which to load command-specific completions
\param reload should the commands completions be reloaded, even if they where previously loaded. (This is set to true on actual completions, so that changed completion are updated in running shells)
*/
void complete_load( wchar_t *cmd, int reload );
void complete_load( const wchar_t *cmd, int reload );
#endif

665
config.guess vendored

File diff suppressed because it is too large Load Diff

219
config.sub vendored
View File

@@ -1,9 +1,10 @@
#! /bin/sh
# Configuration validation subroutine script.
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
# 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
# Inc.
timestamp='2003-06-18'
timestamp='2006-02-27'
# This file is (in principle) common to ALL GNU software.
# The presence of a machine in this file suggests that SOME GNU software
@@ -21,14 +22,15 @@ timestamp='2003-06-18'
#
# 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.
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
# 02110-1301, USA.
#
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
# Please send patches to <config-patches@gnu.org>. Submit a context
# diff and a properly formatted ChangeLog entry.
#
@@ -70,7 +72,7 @@ Report bugs and patches to <config-patches@gnu.org>."
version="\
GNU config.sub ($timestamp)
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
@@ -83,11 +85,11 @@ Try \`$me --help' for more information."
while test $# -gt 0 ; do
case $1 in
--time-stamp | --time* | -t )
echo "$timestamp" ; exit 0 ;;
echo "$timestamp" ; exit ;;
--version | -v )
echo "$version" ; exit 0 ;;
echo "$version" ; exit ;;
--help | --h* | -h )
echo "$usage"; exit 0 ;;
echo "$usage"; exit ;;
-- ) # Stop option processing
shift; break ;;
- ) # Use stdin as input.
@@ -99,7 +101,7 @@ while test $# -gt 0 ; do
*local*)
# First pass through any local machine types.
echo $1
exit 0;;
exit ;;
* )
break ;;
@@ -118,7 +120,9 @@ esac
# Here we must recognize all the valid KERNEL-OS combinations.
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
case $maybe_os in
nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
storm-chaos* | os2-emx* | rtmk-nova*)
os=-$maybe_os
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
;;
@@ -144,7 +148,7 @@ case $os in
-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-apple | -axis)
-apple | -axis | -knuth | -cray)
os=
basic_machine=$1
;;
@@ -169,6 +173,10 @@ case $os in
-hiux*)
os=-hiuxwe2
;;
-sco6)
os=-sco5v6
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;;
-sco5)
os=-sco3.2v5
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
@@ -185,6 +193,10 @@ case $os in
# Don't forget version if it is 3.2v4 or newer.
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;;
-sco5v6*)
# Don't forget version if it is 3.2v4 or newer.
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;;
-sco*)
os=-sco3.2v2
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
@@ -228,14 +240,16 @@ case $basic_machine in
| a29k \
| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
| am33_2.0 \
| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
| bfin \
| c4x | clipper \
| d10v | d30v | dlx | dsp16xx \
| fr30 | frv \
| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
| i370 | i860 | i960 | ia64 \
| ip2k \
| m32r | m68000 | m68k | m88k | mcore \
| ip2k | iq2000 \
| m32r | m32rle | m68000 | m68k | m88k | maxq | mb | microblaze | mcore \
| mips | mipsbe | mipseb | mipsel | mipsle \
| mips16 \
| mips64 | mips64el \
@@ -244,31 +258,38 @@ case $basic_machine in
| mips64vr4100 | mips64vr4100el \
| mips64vr4300 | mips64vr4300el \
| mips64vr5000 | mips64vr5000el \
| mips64vr5900 | mips64vr5900el \
| mipsisa32 | mipsisa32el \
| mipsisa32r2 | mipsisa32r2el \
| mipsisa64 | mipsisa64el \
| mipsisa64r2 | mipsisa64r2el \
| mipsisa64sb1 | mipsisa64sb1el \
| mipsisa64sr71k | mipsisa64sr71kel \
| mipstx39 | mipstx39el \
| mn10200 | mn10300 \
| mt \
| msp430 \
| nios | nios2 \
| ns16k | ns32k \
| openrisc | or32 \
| or32 \
| pdp10 | pdp11 | pj | pjl \
| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
| pyramid \
| s390 | s390x \
| sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
| sh64 | sh64le \
| sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \
| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
| strongarm \
| tahoe | thumb | tic4x | tic80 | tron \
| v850 | v850e \
| we32k \
| x86 | xscale | xstormy16 | xtensa \
| x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
| z8k)
basic_machine=$basic_machine-unknown
;;
m32c)
basic_machine=$basic_machine-unknown
;;
m6811 | m68hc11 | m6812 | m68hc12)
# Motorola 68HC11/12.
basic_machine=$basic_machine-unknown
@@ -276,6 +297,9 @@ case $basic_machine in
;;
m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
;;
ms1)
basic_machine=mt-unknown
;;
# We use `pc' rather than `unknown'
# because (1) that's what they normally are, and
@@ -296,19 +320,19 @@ case $basic_machine in
| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
| arm-* | armbe-* | armle-* | armeb-* | armv*-* \
| avr-* \
| bs2000-* \
| bfin-* | bs2000-* \
| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
| clipper-* | cydra-* \
| clipper-* | craynv-* | cydra-* \
| d10v-* | d30v-* | dlx-* \
| elxsi-* \
| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
| h8300-* | h8500-* \
| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
| i*86-* | i860-* | i960-* | ia64-* \
| ip2k-* \
| m32r-* \
| ip2k-* | iq2000-* \
| m32r-* | m32rle-* \
| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
| m88110-* | m88k-* | mcore-* \
| m88110-* | m88k-* | maxq-* | mcore-* \
| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
| mips16-* \
| mips64-* | mips64el-* \
@@ -317,34 +341,41 @@ case $basic_machine in
| mips64vr4100-* | mips64vr4100el-* \
| mips64vr4300-* | mips64vr4300el-* \
| mips64vr5000-* | mips64vr5000el-* \
| mips64vr5900-* | mips64vr5900el-* \
| mipsisa32-* | mipsisa32el-* \
| mipsisa32r2-* | mipsisa32r2el-* \
| mipsisa64-* | mipsisa64el-* \
| mipsisa64r2-* | mipsisa64r2el-* \
| mipsisa64sb1-* | mipsisa64sb1el-* \
| mipsisa64sr71k-* | mipsisa64sr71kel-* \
| mipstx39-* | mipstx39el-* \
| mmix-* \
| mt-* \
| msp430-* \
| none-* | np1-* | nv1-* | ns16k-* | ns32k-* \
| nios-* | nios2-* \
| none-* | np1-* | ns16k-* | ns32k-* \
| orion-* \
| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
| pyramid-* \
| romp-* | rs6000-* \
| s390-* | s390x-* \
| sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \
| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \
| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
| sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \
| sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
| sparclite-* \
| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
| tahoe-* | thumb-* \
| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
| tron-* \
| v850-* | v850e-* | vax-* \
| we32k-* \
| x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \
| xtensa-* \
| x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
| xstormy16-* | xtensa-* \
| ymp-* \
| z8k-*)
;;
m32c-*)
;;
# Recognize the various machine names and aliases which stand
# for a CPU type and a company and sometimes even an OS.
386bsd)
@@ -361,6 +392,9 @@ case $basic_machine in
basic_machine=a29k-amd
os=-udi
;;
abacus)
basic_machine=abacus-unknown
;;
adobe68k)
basic_machine=m68010-adobe
os=-scout
@@ -378,6 +412,9 @@ case $basic_machine in
amd64)
basic_machine=x86_64-pc
;;
amd64-*)
basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
amdahl)
basic_machine=580-amdahl
os=-sysv
@@ -437,12 +474,27 @@ case $basic_machine in
basic_machine=j90-cray
os=-unicos
;;
craynv)
basic_machine=craynv-cray
os=-unicosmp
;;
cr16c)
basic_machine=cr16c-unknown
os=-elf
;;
crds | unos)
basic_machine=m68k-crds
;;
crisv32 | crisv32-* | etraxfs*)
basic_machine=crisv32-axis
;;
cris | cris-* | etrax*)
basic_machine=cris-axis
;;
crx)
basic_machine=crx-unknown
os=-elf
;;
da30 | da30-*)
basic_machine=m68k-da30
;;
@@ -465,6 +517,10 @@ case $basic_machine in
basic_machine=m88k-motorola
os=-sysv3
;;
djgpp)
basic_machine=i586-pc
os=-msdosdjgpp
;;
dpx20 | dpx20-*)
basic_machine=rs6000-bull
os=-bosx
@@ -643,10 +699,6 @@ case $basic_machine in
mips3*)
basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
;;
mmix*)
basic_machine=mmix-knuth
os=-mmixware
;;
monitor)
basic_machine=m68k-rom68k
os=-coff
@@ -659,6 +711,9 @@ case $basic_machine in
basic_machine=i386-pc
os=-msdos
;;
ms1-*)
basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
;;
mvs)
basic_machine=i370-ibm
os=-mvs
@@ -727,10 +782,6 @@ case $basic_machine in
np1)
basic_machine=np1-gould
;;
nv1)
basic_machine=nv1-cray
os=-unicosmp
;;
nsr-tandem)
basic_machine=nsr-tandem
;;
@@ -738,9 +789,12 @@ case $basic_machine in
basic_machine=hppa1.1-oki
os=-proelf
;;
or32 | or32-*)
openrisc | openrisc-*)
basic_machine=or32-unknown
os=-coff
;;
os400)
basic_machine=powerpc-ibm
os=-os400
;;
OSE68000 | ose68000)
basic_machine=m68000-ericsson
@@ -767,6 +821,12 @@ case $basic_machine in
pc532 | pc532-*)
basic_machine=ns32k-pc532
;;
pc98)
basic_machine=i386-pc
;;
pc98-*)
basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
pentium | p5 | k5 | k6 | nexgen | viac3)
basic_machine=i586-pc
;;
@@ -823,6 +883,10 @@ case $basic_machine in
basic_machine=i586-unknown
os=-pw32
;;
rdos)
basic_machine=i386-pc
os=-rdos
;;
rom68k)
basic_machine=m68k-rom68k
os=-coff
@@ -833,6 +897,12 @@ case $basic_machine in
rtpc | rtpc-*)
basic_machine=romp-ibm
;;
s390 | s390-*)
basic_machine=s390-ibm
;;
s390x | s390x-*)
basic_machine=s390x-ibm
;;
sa29200)
basic_machine=a29k-amd
os=-udi
@@ -956,6 +1026,10 @@ case $basic_machine in
tower | tower-32)
basic_machine=m68k-ncr
;;
tpf)
basic_machine=s390x-ibm
os=-tpf
;;
udi29k)
basic_machine=a29k-amd
os=-udi
@@ -999,6 +1073,10 @@ case $basic_machine in
basic_machine=hppa1.1-winbond
os=-proelf
;;
xbox)
basic_machine=i686-pc
os=-mingw32
;;
xps | xps100)
basic_machine=xps100-honeywell
;;
@@ -1029,6 +1107,9 @@ case $basic_machine in
romp)
basic_machine=romp-ibm
;;
mmix)
basic_machine=mmix-knuth
;;
rs6000)
basic_machine=rs6000-ibm
;;
@@ -1045,13 +1126,10 @@ case $basic_machine in
we32k)
basic_machine=we32k-att
;;
sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele)
sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
basic_machine=sh-unknown
;;
sh64)
basic_machine=sh64-unknown
;;
sparc | sparcv9 | sparcv9b)
sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
basic_machine=sparc-sun
;;
cydra)
@@ -1124,19 +1202,23 @@ case $os in
| -aos* \
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
| -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
| -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
| -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
| -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
| -openbsd* | -solidbsd* \
| -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
| -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
| -chorusos* | -chorusrdb* \
| -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
| -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
| -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
| -uxpv* | -beos* | -mpeix* | -udk* \
| -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
| -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
| -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
| -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
| -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
| -powermax* | -dnix* | -nx6 | -nx7 | -sei*)
| -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
| -skyos* | -haiku* | -rdos*)
# Remember, each alternative MUST END IN *, to match a version number.
;;
-qnx*)
@@ -1154,12 +1236,15 @@ case $os in
os=`echo $os | sed -e 's|nto|nto-qnx|'`
;;
-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
| -windows* | -osx | -abug | -netware* | -os9* | -beos* \
| -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
| -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
;;
-mac*)
os=`echo $os | sed -e 's|mac|macos|'`
;;
-linux-dietlibc)
os=-linux-dietlibc
;;
-linux*)
os=`echo $os | sed -e 's|linux|linux-gnu|'`
;;
@@ -1172,6 +1257,9 @@ case $os in
-opened*)
os=-openedition
;;
-os400*)
os=-os400
;;
-wince*)
os=-wince
;;
@@ -1193,6 +1281,9 @@ case $os in
-atheos*)
os=-atheos
;;
-syllable*)
os=-syllable
;;
-386bsd)
os=-bsd
;;
@@ -1215,6 +1306,9 @@ case $os in
-sinix*)
os=-sysv4
;;
-tpf*)
os=-tpf
;;
-triton*)
os=-sysv3
;;
@@ -1251,6 +1345,9 @@ case $os in
-kaos*)
os=-kaos
;;
-zvmoe)
os=-zvmoe
;;
-none)
;;
*)
@@ -1282,9 +1379,9 @@ case $basic_machine in
arm*-semi)
os=-aout
;;
c4x-* | tic4x-*)
os=-coff
;;
c4x-* | tic4x-*)
os=-coff
;;
# This must come before the *-dec entry.
pdp10-*)
os=-tops20
@@ -1328,9 +1425,15 @@ case $basic_machine in
*-be)
os=-beos
;;
*-haiku)
os=-haiku
;;
*-ibm)
os=-aix
;;
*-knuth)
os=-mmixware
;;
*-wec)
os=-proelf
;;
@@ -1463,9 +1566,15 @@ case $basic_machine in
-mvs* | -opened*)
vendor=ibm
;;
-os400*)
vendor=ibm
;;
-ptx*)
vendor=sequent
;;
-tpf*)
vendor=ibm
;;
-vxsim* | -vxworks* | -windiss*)
vendor=wrs
;;
@@ -1490,7 +1599,7 @@ case $basic_machine in
esac
echo $basic_machine$os
exit 0
exit
# Local variables:
# eval: (add-hook 'write-file-hooks 'time-stamp)

View File

@@ -1,14 +1,57 @@
# Process this file with autoconf to produce a configure script.
AC_INIT(fish,1.20.2,fish-users@lists.sf.net)
AC_INIT(fish,1.21.6,fish-users@lists.sf.net)
# If needed, run autoconf to regenerate the configure file
AC_MSG_CHECKING([if autoconf needs to be run])
if test configure -ot configure.ac; then
AC_MSG_RESULT([yes])
if which autoconf >/dev/null; then
# No need to provide any error messages if autoconf fails, the
# shell and autconf should take care of that themselves
AC_MSG_NOTICE([running autoconf])
if autoconf; then
./configure "$@"
fi
exit
else
AC_MSG_ERROR( [cannot find the autoconf program in your path.
This program needs to be run whenever the configure.ac file is modified.
Please install it and try again.])
fi
else
AC_MSG_RESULT([no])
fi
# If needed, run autoheader to regenerate config.h.in
AC_MSG_CHECKING([if autoheader needs to be run])
if test ! -f ./config.h.in -o config.h.in -ot configure.ac; then
AC_MSG_RESULT([yes])
if which autoheader >/dev/null; then
AC_MSG_NOTICE([running autoheader])
autoheader
else
AC_MSG_ERROR( [cannot find the autoheader program in your path.
This program needs to be run whenever the configure.ac file is modified.
Please install it and try again.])
fi
else
AC_MSG_RESULT([no])
fi
# Detect directories which may contain additional headers, libraries
# and commands. This needs to be done early - before Autoconf starts
# to mess with CFLAGS and all the other environemnt variables.
for i in /usr/pkg /sw /opt /opt/local; do
AC_MSG_CHECKING([for $i/include include directory])
if test -d $i/include; then
AC_MSG_RESULT(yes)
CPPFLAGS="$CPPFLAGS -I$i/include/"
CFLAGS="$CFLAGS -I$i/include/"
else
AC_MSG_RESULT(no)
AC_MSG_RESULT(no)
fi
AC_MSG_CHECKING([for $i/lib library directory])
@@ -31,22 +74,6 @@ done
AC_SUBST( optbindirs, $optbindirs )
# If needed, run autoheader automatically
AC_MSG_CHECKING([if autoheader needs to be run])
if test ! -f ./config.h.in -o config.h.in -ot configure.ac; then
AC_MSG_RESULT([yes])
if which autoheader >/dev/null; then
AC_MSG_NOTICE([running autoheader])
autoheader
else
AC_MSG_ERROR( [cannot find the autoheader program in your path.
This program is needed because the configure.ac file has been modified.
Please install it and try again.])
fi
else
AC_MSG_RESULT([no])
fi
# Tell autoconf to create config.h header
AC_CONFIG_HEADERS(config.h)
@@ -58,16 +85,17 @@ AC_PROG_INSTALL
# Check for doxygen, which is needed to build
AC_CHECK_PROG( has_doxygen, [doxygen], "true")
if ! test $has_doxygen = "true"; then
if ! test "$has_doxygen" = "true"; then
AC_MSG_ERROR( [cannot find the Doxygen program in your path.
This program is needed to build fish.
Please install it and try again.])
fi
# Check for seq program. If missing, install fallback shellscript implementation
# Check for seq command. If missing, make sure fallback shellscript
# implementation is installed
AC_CHECK_PROG( SEQ_FALLBACK, seq, [ ], [seq])
# Optionally drop xsel
# Optionally drop xsel command
AC_ARG_WITH( xsel,
AC_HELP_STRING([--without-xsel],
[do not build the xsel program needed for X clipboard integration]),
@@ -84,17 +112,114 @@ else
AC_SUBST( XSEL_MAN_PATH,[ ])
fi
#
# Test if the compiler accepts the -std=c99 flag. If so, using it
# increases the odds of correct compilation, since we want to use the
# *wprintf functions, which where defined in C99.
#
XCFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -std=c99"
AC_MSG_CHECKING(if -std=c99 works)
AC_CACHE_VAL(local_cv_has__std_c99,[
AC_TRY_RUN([
#include <stdlib.h>
#include <stdio.h>
int main() {
return 0;
}],
local_cv_has__std_c99=yes,
local_cv_has__std_c99=no,
)])
AC_MSG_RESULT($local_cv_has__std_c99)
case x$local_cv_has__std_c99 in
xno) CFLAGS="$XCFLAGS" ;;
esac
#
# If we are using gcc, set some flags that increase the odds of the
# compiler producing a working binary...
#
if test "$CC" = gcc; then
#
# -fno-optimize-sibling-calls seems to work around a bug where
# sending a SIGWINCH to fish on NetBSD causes fish to exit when
# compiled with GCC 3.3.3. This is probably either a compiler bug
# or a libc bug, but adding this flag seems to fix things for
# now. Long term, the real problem should be tracked down and
# truly fixed, at which point we can remove this silly flag. This
# bug has been verified to not exist on Linux using GCC 3.3.3.
#
CFLAGS="$CFLAGS -fno-optimize-sibling-calls"
#
# -Wall is there to keep me on my toes
#
CFLAGS="$CFLAGS -Wall"
fi
#
# If we are compiling against glibc, set some flags to work around
# some rather stupid attempts to hide prototypes for *wprintf
# functions, as well as prototypes of various gnu extensions.
#
AC_MSG_CHECKING([if we are compiling against glibc])
AC_RUN_IFELSE(
[AC_LANG_PROGRAM([
#include <stdlib.h>
#ifdef __GLIBC__
#define STATUS 0
#else
#define STATUS 1
#endif],
[return STATUS;])],
[glibc=yes],
[glibc=no] )
if test "$glibc" = yes; then
AC_MSG_RESULT(yes)
#
# This gives us access to prototypes for gnu extensions and C99
# functions if we are compiling agains glibc. All GNU extensions
# that are used must have a fallback implementation available in
# fallback.h, in order to keep fish working on non-gnu platforms.
#
CFLAGS="$CFLAGS -D _GNU_SOURCE -D _ISOC99_SOURCE"
else
AC_MSG_RESULT(no)
fi
# Test cpu for special handling of ppc
#
# This is used to skip use of tputs on ppc systems, since it seemed to
# be broken, at least on older debin-based systems. This is obviously
# not the right way to to detect whether this workaround should be
# used, since it catches far to many systems, but I do not have the
# hardware available to narrow this problem down, and in practice, it
# seems that tputs is never really needed.
#
AC_CANONICAL_TARGET
if test $target_cpu = powerpc; then
AC_DEFINE([TPUTS_KLUDGE],[1],[Evil kludge to get Power based machines to work])
fi
AC_DEFINE_UNQUOTED([CPU],[L"$target_cpu"],[CPU type])
# Set up installation directories
# Set up PREFIX and related preprocessor symbols. Fish needs to know
# where it will be installed. One of the reasons for this is so that
# it can make sure the fish installation directory is in the path
# during startup.
if [[ "$prefix" = NONE ]]; then
AC_DEFINE_UNQUOTED( [PREFIX], L"/usr/local", [Installation directory])
AC_SUBST( PREFIX, /usr/local)
@@ -103,11 +228,14 @@ else
AC_DEFINE_UNQUOTED( [PREFIX], L"$prefix", [Installation directory])
AC_SUBST( PREFIX, [$prefix])
fi
AC_DEFINE_UNQUOTED( SYSCONFDIR, [L"$(eval echo $sysconfdir)"], [System configuration directory] )
AC_DEFINE_UNQUOTED( DATADIR, [L"$(eval echo $datadir)"], [System configuration directory] )
AC_SUBST( SYSCONFDIR, ["$(eval echo $sysconfdir)"] )
AC_SUBST( DATADIR, ["$(eval echo $datadir)"] )
AC_SUBST(fishdir,[/fish.d])
AC_SUBST(fishfile,[/fish])
AC_SUBST(fishinputfile,[/fish_inputrc])
# Set up the directory where the documentation files should be
# installed
AC_ARG_VAR( [docdir], [Documentation direcotry] )
if test -z $docdir; then
@@ -115,16 +243,101 @@ if test -z $docdir; then
fi
AC_DEFINE_UNQUOTED( DOCDIR, [L"$(eval echo $docdir)"], [Documentation directory] )
AC_DEFINE_UNQUOTED( SYSCONFDIR, [L"$(eval echo $sysconfdir)"], [System configuration directory] )
AC_SUBST( SYSCONFDIR, ["$(eval echo $sysconfdir)"] )
# Set up locale directory
# Set up locale directory. This is where the .po files will be
# installed.
AC_DEFINE_UNQUOTED( [LOCALEDIR], "$(eval echo $datadir)/locale", [Locale directory])
AC_SUBST( [LOCALEDIR], [$datadir/locale])
# See if Linux procfs is present
# See if Linux procfs is present. This is used to get extra
# information about running processes.
AC_CHECK_FILES([/proc/self/stat])
# This is ued to tell the wgetopt library to translate strings. This
# way wgetopt can be dropped into any project without requiring i18n.
AC_DEFINE([HAVE_TRANSLATE_H], [1],
[Define to 1 if the wgettext function should be used for translating strings.])
# Check for presense of various libraries
AC_SEARCH_LIBS( gettext, intl, AC_SUBST( HAVE_GETTEXT, [1] ), AC_SUBST( HAVE_GETTEXT, [0] ) )
AC_SEARCH_LIBS( connect, socket, , [AC_MSG_ERROR([Cannot find the socket library, needed to build this package.] )] )
AC_SEARCH_LIBS( nanosleep, rt, , [AC_MSG_ERROR([Cannot find the rt library, needed to build this package.] )] )
AC_SEARCH_LIBS( setupterm, [ncurses curses], , [AC_MSG_ERROR([Could not find a curses implementation, needed to build fish])] )
# Check for presense of various header files
AC_CHECK_HEADERS([getopt.h termio.h sys/resource.h term.h ncurses/term.h libintl.h ncurses.h curses.h])
AC_CHECK_HEADER([regex.h],
[AC_DEFINE([HAVE_REGEX_H], [1], [Define to 1 if you have the <regex.h> header file.])],
[AC_MSG_ERROR([Could not find the header regex.h, needed to build fish])])
# Check for presense of various functions
AC_CHECK_FUNCS( wcsdup wcsndup wcslen wcscasecmp wcsncasecmp gettext fwprintf )
AC_CHECK_FUNCS( futimes wcwidth wcswidth getopt_long wcstok fputwc fgetwc )
AC_CHECK_FUNCS( wcstol dcgettext wcslcat wcslcpy )
# Here follows a list of small programs used to test for various
# features that Autoconf doesn't tell us about
# Check if realpath accepts null for its second argument
AC_MSG_CHECKING([if realpath accepts null for its second argument])
AC_RUN_IFELSE(
[AC_LANG_PROGRAM([
#include <limits.h>
#include <errno.h>
#include <stdlib.h>],
[int status; char *res; res = realpath( "somefile", 0 ); status = !(res != 0 || errno == ENOENT); exit( status );])],
[have_realpath_null=yes],
[have_realpath_null=no] )
if test "$have_realpath_null" = yes; then
AC_MSG_RESULT(yes)
AC_DEFINE([HAVE_REALPATH_NULL], [1],
[Define to 1 if realpath accepts null for its second argument.])
else
AC_MSG_RESULT(no)
fi
# If we have a fwprintf in libc, test that it actually works. As of
# March 2006, it is broken under Dragonfly BSD.
if test "$ac_cv_func_fwprintf" = yes; then
AC_MSG_CHECKING([if fwprintf is broken])
AC_RUN_IFELSE(
[AC_LANG_PROGRAM([
#include <stdlib.h>
#include <stdio.h>
#include <locale.h>
#include <wchar.h>
],
[
setlocale( LC_ALL, "" );
fwprintf( stderr, L"%ls%ls", L"", L"fish:" );
])],
[
AC_MSG_RESULT(no)
],
[
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_BROKEN_FWPRINTF], [1], [Define to 1 one if the implemented fwprintf is broken])
] )
fi
# Check for RLIMIT_NPROC in sys/resource.h.
AC_MSG_CHECKING([for RLIMIT_NPROC in sys/resource.h])
AC_TRY_COMPILE([#include <sys/resource.h>],
[int tmp; tmp=RLIMIT_NPROC;], have_rlimit_as=yes, have_rlimit_as=no)
if test "$have_rlimit_as" = yes; then
AC_MSG_RESULT(yes)
AC_DEFINE([HAVE_RLIMIT_NPROC], [1],
[Define to 1 if HAVE_RLIMIT_NPROC is defined in <sys/resource.h>.])
else
AC_MSG_RESULT(no)
fi
# Check for RLIMIT_AS in sys/resource.h.
AC_MSG_CHECKING([for RLIMIT_AS in sys/resource.h])
AC_TRY_COMPILE([#include <sys/resource.h>],
@@ -161,62 +374,6 @@ else
AC_MSG_RESULT(no)
fi
# Check for RLIMIT_NPROC in sys/resource.h.
AC_MSG_CHECKING([for RLIMIT_NPROC in sys/resource.h])
AC_TRY_COMPILE([#include <sys/resource.h>],
[int tmp; tmp=RLIMIT_NPROC;], have_rlimit_as=yes, have_rlimit_as=no)
if test "$have_rlimit_as" = yes; then
AC_MSG_RESULT(yes)
AC_DEFINE([HAVE_RLIMIT_NPROC], [1],
[Define to 1 if HAVE_RLIMIT_NPROC is defined in <sys/resource.h>.])
else
AC_MSG_RESULT(no)
fi
# Check if realpath accepts null for its second argument
AC_MSG_CHECKING([if realpath accepts null for its second argument])
AC_RUN_IFELSE(
[AC_LANG_PROGRAM([#include <limits.h>
#include <errno.h>
#include <stdlib.h>],
[int status; char *res; res = realpath( "somefile", 0 ); status = !(res != 0 || errno == ENOENT); exit( status );])],
[have_realpath_null=yes],
[have_realpath_null=no] )
if test "$have_realpath_null" = yes; then
AC_MSG_RESULT(yes)
AC_DEFINE([HAVE_REALPATH_NULL], [1],
[Define to 1 if realpath accepts null for its second argument.])
else
AC_MSG_RESULT(no)
fi
# Check for libraries
AC_CHECK_LIB(socket, connect)
AC_CHECK_LIB(rt, nanosleep)
AC_CHECK_LIB(intl, gettext)
# Check for various header files
AC_CHECK_HEADERS([getopt.h termio.h sys/resource.h term.h ncurses/term.h libintl.h])
AC_CHECK_HEADER([regex.h],
[AC_DEFINE([HAVE_REGEX_H], [1], [Define to 1 if you have the <regex.h> header file.])],
[AC_MSG_ERROR([Could not find the header regex.h, needed to build fish])])
# Check for various functions, and insert results into config.h
AC_CHECK_FUNCS( wcsdup wcsndup wcslen wcscasecmp wcsncasecmp gettext fwprintf )
AC_CHECK_FUNCS( futimes wcwidth wcswidth getopt_long wcstok fputwc fgetwc )
AC_CHECK_FUNCS( wcstol dcgettext )
AC_DEFINE([HAVE_TRANSLATE_H], [1],
[Define to 1 if the wgettext function should be used for translating strings.])
# Check again for gettext library, and insert results into the Makefile
AC_CHECK_FUNC(gettext, AC_SUBST(HAVE_GETTEXT,1), AC_SUBST(HAVE_GETTEXT,0) )
# Check for _nl_msg_cat_cntr symbol
AC_MSG_CHECKING([for _nl_msg_cat_cntr symbol])
AC_TRY_LINK([#if HAVE_LIBINTL_H]
@@ -225,18 +382,16 @@ AC_TRY_LINK([#if HAVE_LIBINTL_H]
[extern int _nl_msg_cat_cntr;]
[int tmp = _nl_msg_cat_cntr; exit(tmp);], have__nl_msg_cat_cntr=yes, have__nl_msg_cat_cntr=no)
if test "$have__nl_msg_cat_cntr" = yes; then
AC_MSG_RESULT(yes)
AC_MSG_RESULT(yes)
AC_DEFINE([HAVE__NL_MSG_CAT_CNTR], [1],
[Define to 1 if the _nl_msg_cat_cntr symbol is exported.])
else
AC_MSG_RESULT(no)
fi
# Check if we have ncurses, and use it rather than curses if possible.
AC_SEARCH_LIBS( setupterm, [ncurses curses], [ AC_MSG_NOTICE([Found curses implementation])], [AC_MSG_ERROR([Could not find a curses implementation, needed to build fish])] )
AC_CONFIG_FILES([Makefile fish.spec doc_src/fish.1 doc_src/Doxyfile init/fish init/fish_interactive.fish init/fish_complete.fish seq])
# Tell the world what we know
AC_CONFIG_FILES([Makefile fish.spec doc_src/fish.1 doc_src/Doxyfile etc/fish etc/fish_interactive.fish share/fish seq])
AC_OUTPUT
echo "Now run 'make' and 'make install' to built and install fish."
echo "Good luck!"
echo "fish is now configured."
echo "Use 'make' and 'make install' to built and install fish."

View File

@@ -11,6 +11,22 @@ wildcarded values. The \c case statement is used together with the \c
switch statement in order to determine which block should be
performed.
Each \c case command is given one or more parameter. The first \c case
command with a parameter that matches the string specified in the
switch command will be evaluated. \c case parameters may contain
wildcards. These need to be escaped or quoted in order to avoid
regular wildcard expansion using filenames.
Note that fish does not fall through on case statements. Though the
syntax may look a bit like C switch statements, it behaves more like
the case stamantes of traditional shells.
Also note that command substitutions in a case statement will be
evaluated even if it's body is not taken. This may seem
counterintuitive at first, but it is unavoidable, since it would be
impossible to know if a case command will evaluate to true before all
forms of parameter expansion have been performed for the case command.
\subsection case-example Example
If the variable \$animal contains the name of an animal, the following
@@ -27,9 +43,11 @@ switch $animal
echo bird
case shark trout stingray
echo fish
case '*'
echo I have no idea what a $animal is
end
</pre>
</p>
<p>
If the above code was run with \$animal set to \c whale, the output would be \c mammal.
If the above code was run with \c \$animal set to \c whale, the output would be \c mammal.
</p>

View File

@@ -3,10 +3,9 @@
\subsection cd-synopsis Synopsis
<tt>cd [DIRECTORY]</tt>
\subsection cd-description Description
Changes the current directory. If <tt>DIRECTORY</tt> is supplied it
will become the new directory. If \c DIRECTORY is a relative path, the
CDPATH environment variable will be separated using the : as
separator, and the resulting list will be searched for a suitable new
current directory. If CDPATH is not set, it is assumed to be '.'. If
\c DIRECTORY is not specified, \$HOME will be the new directory.
\subsection cd-description Description Changes the current
directory. If <tt>DIRECTORY</tt> is supplied it will become the new
directory. If \c DIRECTORY is a relative path, the paths found in the
CDPATH environment variable array will be tried as prefixes for the
specified path. If CDPATH is not set, it is assumed to be '.'. If \c
DIRECTORY is not specified, \$HOME will be the new directory.

File diff suppressed because it is too large Load Diff

9
doc_src/fish_pager.txt Normal file
View File

@@ -0,0 +1,9 @@
\section fish_pager fish_pager - Internal command used by fish
\subsection fish_pager-description Description
This command is used internally by fish to display a list of
completions. It should not be used by other commands, as it's
interface is liable to change in the future.

View File

@@ -8,10 +8,13 @@
The <tt>read</tt> builtin causes fish to read one line from standard
input and store the result in one or more environment variables.
- <tt>-c CMD</tt> or <tt>--command=CMD</tt> specifies that the initial string in the interactive mode command buffer should be CMD.
- <tt>-e</tt> or <tt>--export</tt> specifies that the variables will be exported to subshells.
- <tt>-g</tt> or <tt>--global</tt> specifies that the variables will be made global.
- <tt>-pPROMPT_CMD</tt> or <tt>--prompt=PROMPT_CMD</tt> specifies that the output of the shell command PROMPT_CMD should be used as the prompt for the interactive mode prompt. The default prompt command is <tt>set_color green; echo read; set_color normal; echo "> "</tt>.
- <tt>-cCMD</tt> or <tt>--command=CMD</tt> specifies that the initial string in the interactive mode command buffer should be CMD.
- <tt>-p PROMPT_CMD</tt> or <tt>--prompt=PROMPT_CMD</tt> specifies that the output of the shell command PROMPT_CMD should be used as the prompt for the interactive mode prompt. The default prompt command is <tt>set_color green; echo read; set_color normal; echo "> "</tt>.
- <code>-u</code> or <code>--unexport</code> causes the specified environment not to be exported to child processes
- <code>-U</code> or <code>--universal</code> causes the specified environment variable to be made universal. If this option is supplied, the variable will be shared between all the current users fish instances on the current computer, and will be preserved across restarts of the shell.
- <code>-x</code> or <code>--export</code> causes the specified environment variable to be exported to child processes
Read starts by reading a single line of input from stdin, the line is
then tokenized using the <tt>IFS</tt> environment variable. Each variable

View File

@@ -8,7 +8,19 @@
The \c switch statement is used to perform one of several blocks of
commands depending on whether a specified value equals one of several
wildcarded values.
wildcarded values. The \c case statement is used together with the \c
switch statement in order to determine which block should be
performed.
Each \c case command is given one or more parameter. The first \c case
command with a parameter that matches the string specified in the
switch command will be evaluated. \c case parameters may contain
wildcards. These need to be escaped or quoted in order to avoid
regular wildcard expansion using filenames.
Note that fish does not fall through on case statements. Though the
syntax may look a bit like C switch statements, it behaves more like
the case stamantes of traditional shells.
\subsection switch-example Example
@@ -26,12 +38,14 @@ switch $animal
echo bird
case shark trout stingray
echo fish
case '*'
echo I have no idea what a $animal is
end
</pre>
</p>
<p>
If the above code was run with \$animal set to \c whale, the output
If the above code was run with \c \$animal set to \c whale, the output
would be \c mammal.
</p>

34
env.c
View File

@@ -33,7 +33,10 @@
#include <errno.h>
#include "fallback.h"
#include "util.h"
#include "wutil.h"
#include "proc.h"
#include "common.h"
@@ -101,7 +104,7 @@ typedef struct env_node
typedef struct var_entry
{
int export; /**< Whether the variable should be exported */
wchar_t val[0]; /**< The value of the variable */
wchar_t val[1]; /**< The value of the variable */
}
var_entry_t;
@@ -605,9 +608,9 @@ static env_node_t *env_get_node( const wchar_t *key )
return 0;
}
void env_set( const wchar_t *key,
const wchar_t *val,
int var_mode )
int env_set( const wchar_t *key,
const wchar_t *val,
int var_mode )
{
int free_val = 0;
var_entry_t *entry;
@@ -623,7 +626,7 @@ void env_set( const wchar_t *key,
if( (var_mode & ENV_USER ) &&
hash_get( &env_read_only, key ) )
{
return;
return ENV_PERM;
}
if( wcscmp( key, L"umask" ) == 0)
@@ -647,7 +650,7 @@ void env_set( const wchar_t *key,
/*
Do not actually create a umask variable, on env_get, it will be calculated dynamically
*/
return;
return 0;
}
/*
@@ -746,7 +749,7 @@ void env_set( const wchar_t *key,
node = top;
while( node->next && !node->new_scope )
node = node->next;
}
}
}
@@ -806,7 +809,8 @@ void env_set( const wchar_t *key,
{
handle_locale();
}
return 0;
}
@@ -817,14 +821,19 @@ void env_set( const wchar_t *key,
static int try_remove( env_node_t *n,
const wchar_t *key )
{
const void *old_key_void, *old_val_void;
wchar_t *old_key, *old_val;
if( n == 0 )
return 0;
hash_remove( &n->env,
key,
(const void **)&old_key,
(const void **)&old_val );
&old_key_void,
&old_val_void );
old_key = (wchar_t *)old_key_void;
old_val = (wchar_t *)old_val_void;
if( old_key != 0 )
{
var_entry_t * v = (var_entry_t *)old_val;
@@ -889,7 +898,10 @@ wchar_t *env_get( const wchar_t *key )
wchar_t *next = history_get( i-add_current );
if( !next )
{
debug( 1, _( L"No history item at index %d\n" ), i );
/*
This is not an error - it simply means the user has
a short history
*/
break;
}

13
env.h
View File

@@ -41,6 +41,11 @@
*/
#define ENV_UNIVERSAL 32
/**
Error code for trying to alter read-only variable
*/
#define ENV_PERM 1
/**
Initialize environment variable data
*/
@@ -61,9 +66,15 @@ void env_destroy();
\param val The value
\param mode The type of the variable. Can be any combination of ENV_GLOBAL, ENV_LOCAL, ENV_EXPORT and ENV_USER. If mode is zero, the current variable space is searched and the current mode is used. If no current variable with the same name is found, ENV_LOCAL is assumed.
\returns 0 on suicess or an error code on failiure.
The current error codes are:
* ENV_PERM, can only be returned when setting as a user, e.g. ENV_USER is set. This means that the user tried to change a read-only variable.
*/
void env_set( const wchar_t *key,
int env_set( const wchar_t *key,
const wchar_t *val,
int mode );

View File

@@ -1,5 +1,6 @@
#include "config.h"
#include <stdlib.h>
#include <stdio.h>
#include <wchar.h>
@@ -26,7 +27,9 @@
#include <signal.h>
#include "fallback.h"
#include "util.h"
#include "common.h"
#include "wutil.h"
#include "env_universal_common.h"
@@ -214,7 +217,7 @@ void env_universal_init( wchar_t * p,
void (*sf)(),
void (*cb)( int type, const wchar_t *name, const wchar_t *val ))
{
debug( 2, L"env_universal_init()" );
debug( 3, L"env_universal_init()" );
path=p;
user=u;
start_fishd=sf;
@@ -233,7 +236,7 @@ void env_universal_init( wchar_t * p,
{
env_universal_barrier();
}
debug( 2, L"end env_universal_init()" );
debug( 3, L"end env_universal_init()" );
}
void env_universal_destroy()

View File

@@ -7,6 +7,7 @@
*/
#include "config.h"
#include <stdlib.h>
#include <stdio.h>
#include <wchar.h>
@@ -27,7 +28,9 @@
#include <signal.h>
#include <sys/stat.h>
#include "fallback.h"
#include "util.h"
#include "common.h"
#include "wutil.h"
#include "env_universal_common.h"
@@ -105,7 +108,7 @@ static int get_names_show_unexported;
void env_universal_common_init( void (*cb)(int type, const wchar_t *key, const wchar_t *val ) )
{
debug( 2, L"Init env_universal_common" );
debug( 3, L"Init env_universal_common" );
callback = cb;
hash_init( &env_universal_var, &hash_wcs_func, &hash_wcs_cmp );
}
@@ -229,7 +232,7 @@ static int match( const wchar_t *msg, const wchar_t *cmd )
static void parse_message( wchar_t *msg,
connection_t *src )
{
debug( 2, L"parse_message( %ls );", msg );
debug( 3, L"parse_message( %ls );", msg );
if( msg[0] == L'#' )
return;

71
etc/fish.in Normal file
View File

@@ -0,0 +1,71 @@
#
# Init file for fish
#
# @configure_input@
#
# Set default search paths for completions and shellscript functions
#
set -g fish_function_path ~/.fish.d/functions @SYSCONFDIR@/fish.d/functions @DATADIR@/fish/functions
set -g fish_complete_path ~/.fish.d/completions @SYSCONFDIR@/fish.d/completions @DATADIR@/fish/completions
#
# Set default field separators
#
set -g IFS \ \t\n
#
# Some things should only be done for login terminals
#
if status --is-login
#
# Set some value for LANG if nothing was set before, and this is a
# login shell.
#
if not set -q LANG >/dev/null
set -gx LANG en_US.UTF-8
end
# Check for i18n information in
# /etc/sysconfig/i18n
if test -f /etc/sysconfig/i18n
eval (cat /etc/sysconfig/i18n |sed -ne 's/^\([a-zA-Z]*\)=\(.*\)$/set -gx \1 \2;/p')
end
#
# Put linux consoles in unicode mode.
#
if expr "$LANG" : ".*\.[Uu][Tt][Ff].*" >/dev/null
if test "$TERM" = linux
if which unicode_start >/dev/null
unicode_start
end
end
end
end
#
# There are variables that contain colons that are not arrays. This
# reverts them back to regular strings.
#
for i in DISPLAY
if set -q $i
set -- $i (printf ":%s" $$i|cut -c 2-)
end
end
#
# Load additional initialization files
#
for i in fish.d/*.fish
. $i
end

View File

@@ -0,0 +1,106 @@
#
# Initializations that should only be performed when in interactive mode
#
# @configure_input@
if not status --is-interactive
exit
end
#
# Print a greeting
#
printf (_ 'Welcome to fish, the friendly interactive shell\n')
printf (_ 'Type %shelp%s for instructions on how to use fish\n') (set_color green) (set_color normal)
#
# Set exit message
#
function fish_on_exit -d (_ "Commands to execute when fish exits") --on-process %self
printf (_ "Good bye\n")
end
#
# Set INPUTRC to something nice
#
# We override INPUTRC if already set, since it may be set by a shell
# other than fish, which may use a different file. The new value should
# be exported, since the fish inputrc file plays nice with other files
# by including them when found.
# Give priority to the default file installed with fish in
# @SYSCONFDIR@/fish_inputrc.
#
for i in ~/.fish_inputrc @SYSCONFDIR@/fish_inputrc ~/.inputrc /etc/inputrc
if test -f $i
set -xg INPUTRC $i
break
end
end
#
# Set various defaults using these throwaway functions
#
function set_default -d "Set an universal variable, unless it has already been set"
if not set -q $argv[1]
set -U -- $argv
end
if not set -q $argv[1]
set -g -- $argv
end
end
function set_exported_default -d "Set an exported universal variable, unless it has already been set"
if not set -q $argv[1]
set -Ux -- $argv
end
if not set -q $argv[1]
set -gx -- $argv
end
end
# Regular syntax highlighting colors
set_default fish_color_normal normal
set_default fish_color_command green
set_default fish_color_redirection normal
set_default fish_color_comment brown
set_default fish_color_error red
set_default fish_color_cwd green
# Background color for matching quotes and parenthesis
set_default fish_color_match cyan
# Background color for search matches
set_default fish_color_search_match purple
# Pager colors
set_default fish_pager_color_prefix cyan
set_default fish_pager_color_completion normal
set_default fish_pager_color_description normal
set_default fish_pager_color_progress cyan
#
# Directory history colors
#
set_default fish_color_history_current cyan
#
# Setup the CDPATH variable
#
set_default CDPATH . ~
#
# Remove temporary functions for setting default variable values
#
functions -e set_exported_default
functions -e set_default

31
event.c
View File

@@ -12,7 +12,10 @@
#include <string.h>
#include "config.h"
#include "fallback.h"
#include "util.h"
#include "wutil.h"
#include "function.h"
#include "proc.h"
@@ -21,6 +24,7 @@
#include "event.h"
#include "signal.h"
#include "translate.h"
#include "halloc_util.h"
/**
Number of signals that can be queued before an overflow occurs
@@ -194,10 +198,7 @@ const wchar_t *event_get_desc( event_t *e )
{
if( !get_desc_buff )
{
get_desc_buff=malloc(sizeof(string_buffer_t) );
if( !get_desc_buff )
die_mem();
sb_init( get_desc_buff );
get_desc_buff=sb_halloc( global_context );
}
else
{
@@ -255,7 +256,7 @@ void event_add_handler( event_t *event )
e = event_copy( event, 0 );
if( !events )
events = al_new();
events = al_new();
if( e->type == EVENT_SIGNAL )
{
@@ -387,8 +388,6 @@ static void event_fire_internal( event_t *event )
int i, j;
string_buffer_t *b=0;
array_list_t *fire=0;
int was_interactive = is_interactive;
/*
First we free all events that have been removed
@@ -452,7 +451,7 @@ static void event_fire_internal( event_t *event )
for( j=0; j<al_get_count(&event->arguments); j++ )
{
wchar_t *arg_esc = escape( (wchar_t *)al_get( &event->arguments, j), 0 );
wchar_t *arg_esc = escape( (wchar_t *)al_get( &event->arguments, j), 1 );
sb_append( b, L" " );
sb_append( b, arg_esc );
free( arg_esc );
@@ -464,19 +463,14 @@ static void event_fire_internal( event_t *event )
Event handlers are not part of the main flow of code, so
they are marked as non-interactive and as a subshell
*/
is_interactive=0;
proc_push_interactive(0);
parser_push_block( EVENT );
current_block->param1.event = event;
eval( (wchar_t *)b->buff, 0, TOP );
parser_pop_block();
proc_pop_interactive();
}
/*
Restore interactivity flags
*/
is_interactive = was_interactive;
if( b )
{
sb_destroy( b );
@@ -644,13 +638,6 @@ void event_destroy()
free( killme );
killme=0;
}
if( get_desc_buff )
{
sb_destroy( get_desc_buff );
free( get_desc_buff );
}
}
void event_free( event_t *e )

63
exec.c
View File

@@ -22,7 +22,10 @@
#include <dirent.h>
#include "config.h"
#include "fallback.h"
#include "util.h"
#include "common.h"
#include "wutil.h"
#include "proc.h"
@@ -38,6 +41,8 @@
#include "env_universal.h"
#include "translate.h"
#include "halloc.h"
#include "halloc_util.h"
#include "parse_util.h"
/**
Prototype for the getpgid library function. The prototype for this
@@ -260,7 +265,7 @@ static int handle_child_io( io_data_t *io, int exit_on_error )
if( io->fd > 2 )
{
/*
Make sure the fd used by this redirection is not used by i.e. a pipe.
Make sure the fd used by this redirection is not used by e.g. a pipe.
*/
free_fd( io, io->fd );
}
@@ -403,7 +408,7 @@ static int setup_child_process( job_t *j, process_t *p )
if( !res )
{
res = handle_child_io( j->io, (p==0) );
res = handle_child_io( j->io, (p!=0) );
}
/* Set the handling for job control signals back to the default. */
@@ -648,8 +653,6 @@ void exec( job_t *j )
pid_t pid;
int mypipe[2];
sigset_t chldset;
sigemptyset( &chldset );
sigaddset( &chldset, SIGCHLD );
int skip_fork;
io_data_t pipe_read, pipe_write;
@@ -662,6 +665,11 @@ void exec( job_t *j )
*/
int exec_error=0;
if( no_exec )
return;
sigemptyset( &chldset );
sigaddset( &chldset, SIGCHLD );
debug( 4, L"Exec job '%ls' with id %d", j->command, j->job_id );
@@ -788,9 +796,6 @@ void exec( job_t *j )
{
case INTERNAL_FUNCTION:
{
wchar_t **arg;
int i;
string_buffer_t sb;
wchar_t * def = halloc_register( j, wcsdup( function_get_definition( p->argv[0] )));
//fwprintf( stderr, L"run function %ls\n", argv[0] );
@@ -804,26 +809,9 @@ void exec( job_t *j )
current_block->param2.function_call_process = p;
current_block->param1.function_name = halloc_register( current_block, wcsdup( p->argv[0] ) );
if( builtin_count_args(p->argv)>1 )
{
sb_init( &sb );
for( i=1, arg=p->argv+1; *arg; i++, arg++ )
{
if( i != 1 )
sb_append( &sb, ARRAY_SEP_STR );
sb_append( &sb, *arg );
}
env_set( L"argv", (wchar_t *)sb.buff, ENV_LOCAL );
sb_destroy( &sb );
}
else
{
env_set( L"argv", 0, ENV_LOCAL );
}
parse_util_set_argv( p->argv+1 );
parser_forbid_function( p->argv[0] );
if( p->next )
@@ -1221,14 +1209,12 @@ void exec( job_t *j )
{
proc_last_bg_pid = j->pgid;
}
if( !exec_error )
{
job_continue (j, 0);
}
debug( 3, L"End of exec()" );
}
int exec_subshell( const wchar_t *cmd,
@@ -1278,10 +1264,16 @@ int exec_subshell( const wchar_t *cmd,
{
wchar_t *el = str2wcs( begin );
if( el )
{
al_push( l, el );
}
else
{
debug( 2, L"Got null string on line %d of file %s", __LINE__, __FILE__ );
}
}
io_buffer_destroy( io_buffer );
return status;
case '\n':
@@ -1289,7 +1281,14 @@ int exec_subshell( const wchar_t *cmd,
wchar_t *el;
*end=0;
el = str2wcs( begin );
al_push( l, el );
if( el )
{
al_push( l, el );
}
else
{
debug( 2, L"Got null string on line %d of file %s", __LINE__, __FILE__ );
}
begin = end+1;
break;
}

325
expand.c
View File

@@ -1,7 +1,7 @@
/**\file expand.c
String expansion functions. These functions perform several kinds of
parameter expansion.
parameter expansion.
*/
@@ -27,7 +27,10 @@ parameter expansion.
#endif
#include "config.h"
#include "fallback.h"
#include "util.h"
#include "common.h"
#include "wutil.h"
#include "env.h"
@@ -36,10 +39,12 @@ parameter expansion.
#include "expand.h"
#include "wildcard.h"
#include "exec.h"
#include "signal.h"
#include "tokenizer.h"
#include "complete.h"
#include "translate.h"
#include "parse_util.h"
#include "halloc_util.h"
/**
Description for child process
@@ -388,8 +393,6 @@ static int find_process( const wchar_t *proc,
This is a numeric job string, like '%2'
*/
// fwprintf( stderr, L"Numeric\n\n\n" );
if( flags & ACCEPT_INCOMPLETE )
{
for( j=first_job; j != 0; j=j->next )
@@ -399,7 +402,6 @@ static int find_process( const wchar_t *proc,
continue;
swprintf( jid, 16, L"%d", j->job_id );
// fwprintf( stderr, L"Jid %ls\n", jid );
if( wcsncmp( proc, jid, wcslen(proc ) )==0 )
{
@@ -427,7 +429,6 @@ static int find_process( const wchar_t *proc,
{
result = malloc(sizeof(wchar_t)*16 );
swprintf( result, 16, L"%d", j->pgid );
//fwprintf( stderr, L"pid %d %ls\n", j->pgid, result );
al_push( out, result );
found = 1;
}
@@ -439,12 +440,9 @@ static int find_process( const wchar_t *proc,
for( j=first_job; j != 0; j=j->next )
{
// fwprintf( stderr, L"..." );
if( j->command == 0 )
continue;
// fwprintf( stderr, L"match '%ls' '%ls'\n\n\n", j->command, proc );
if( match_pid( j->command, proc, flags ) )
{
if( flags & ACCEPT_INCOMPLETE )
@@ -453,8 +451,6 @@ static int find_process( const wchar_t *proc,
COMPLETE_SEP_STR,
COMPLETE_JOB_DESC,
(void *)0 );
// fwprintf( stderr, L"Woot %ls\n", res );
al_push( out, res );
}
else
@@ -480,12 +476,9 @@ static int find_process( const wchar_t *proc,
for( p=j->first_process; p; p=p->next )
{
// fwprintf( stderr, L"..." );
if( p->actual_cmd == 0 )
continue;
// fwprintf( stderr, L"match '%ls' '%ls'\n\n\n", j->command, proc );
if( match_pid( p->actual_cmd, proc, flags ) )
{
if( flags & ACCEPT_INCOMPLETE )
@@ -557,8 +550,10 @@ static int find_process( const wchar_t *proc,
continue;
}
signal_block();
fgetws2( &cmd, &sz, cmdfile );
signal_unblock();
fclose( cmdfile );
}
else
@@ -683,34 +678,28 @@ static int expand_pid( wchar_t *in,
}
}
// fwprintf( stderr, L"expand_pid() %ls\n", in );
int prev = al_get_count( out );
if( !find_process( in+1, flags, out ) )
return 0;
if( prev == al_get_count( out ) )
{
// fwprintf( stderr, L"no match\n" );
if( flags & ACCEPT_INCOMPLETE )
free( in );
else
{
*in = L'%';
// fwprintf( stderr, L"return %ls\n", in );
al_push( out, in );
}
}
else
{
// fwprintf( stderr, L"match\n" );
free( in );
}
return 1;
}
/**
Expand all environment variables in the string *ptr.
@@ -725,7 +714,7 @@ static int expand_pid( wchar_t *in,
happens, don't edit it unless you know exactly what you are doing,
and do proper testing afterwards.
*/
static int expand_variables( wchar_t *in, array_list_t *out )
static int expand_variables( wchar_t *in, array_list_t *out, int last_idx )
{
wchar_t c;
wchar_t prev_char=0;
@@ -733,7 +722,32 @@ static int expand_variables( wchar_t *in, array_list_t *out )
int is_ok= 1;
int empty=0;
for( i=wcslen(in)-1; (i>=0) && is_ok && !empty; i-- )
static string_buffer_t *var_tmp = 0;
static array_list_t *var_idx_list = 0;
if( !var_tmp )
{
var_tmp = sb_halloc( global_context );
if( !var_tmp )
die_mem();
}
else
{
sb_clear(var_tmp );
}
if( !var_idx_list )
{
var_idx_list = al_halloc( global_context );
if( !var_idx_list )
die_mem();
}
else
{
al_truncate( var_idx_list, 0 );
}
for( i=last_idx; (i>=0) && is_ok && !empty; i-- )
{
c = in[i];
if( ( c == VARIABLE_EXPAND ) || (c == VARIABLE_EXPAND_SINGLE ) )
@@ -741,12 +755,11 @@ static int expand_variables( wchar_t *in, array_list_t *out )
int start_pos = i+1;
int stop_pos;
int var_len, new_len;
wchar_t *var_name;
wchar_t * var_val;
wchar_t * new_in;
array_list_t l;
int is_single = (c==VARIABLE_EXPAND_SINGLE);
int var_name_stop_pos;
stop_pos = start_pos;
while( 1 )
@@ -759,7 +772,8 @@ static int expand_variables( wchar_t *in, array_list_t *out )
stop_pos++;
}
var_name_stop_pos = stop_pos;
/* printf( "Stop for '%c'\n", in[stop_pos]);*/
var_len = stop_pos - start_pos;
@@ -808,23 +822,16 @@ static int expand_variables( wchar_t *in, array_list_t *out )
break;
}
sb_append_substring( var_tmp, &in[start_pos], var_len );
if( !(var_name = malloc( sizeof(wchar_t)*(var_len+1) )))
{
die_mem();
}
wcsncpy( var_name, &in[start_pos], var_len );
var_name[var_len]='\0';
/* printf( "Variable name is %s, len is %d\n", var_name, var_len );*/
wchar_t *var_val_orig = expand_var( var_name );
var_val = expand_var( (wchar_t *)var_tmp->buff );
if( var_val_orig && (var_val = wcsdup( var_val_orig) ) )
if( var_val )
{
int all_vars=1;
array_list_t idx;
al_init( &idx );
al_init( &l );
array_list_t var_item_list;
al_init( &var_item_list );
if( in[stop_pos] == L'[' )
{
wchar_t *end;
@@ -857,43 +864,42 @@ static int expand_variables( wchar_t *in, array_list_t *out )
is_ok = 0;
break;
}
al_push( &idx, (void *)tmp );
al_push( var_idx_list, (void *)tmp );
stop_pos = end-in;
}
}
if( is_ok )
{
expand_variable_array( var_val, &l );
expand_variable_array( var_val, &var_item_list );
if( !all_vars )
{
int j;
for( j=0; j<al_get_count( &idx ); j++)
for( j=0; j<al_get_count( var_idx_list ); j++)
{
int tmp = (int)al_get( &idx, j );
if( tmp < 1 || tmp > al_get_count( &l ) )
int tmp = (int)al_get( var_idx_list, j );
if( tmp < 1 || tmp > al_get_count( &var_item_list ) )
{
error( SYNTAX_ERROR,
-1,
L"Array index out of bounds" );
is_ok=0;
al_truncate( &idx, j );
al_truncate( var_idx_list, j );
break;
}
else
{
/* Move string from list l to list idx */
al_set( &idx, j, al_get( &l, tmp-1 ) );
al_set( &l, tmp-1, 0 );
al_set( var_idx_list, j, al_get( &var_item_list, tmp-1 ) );
al_set( &var_item_list, tmp-1, 0 );
}
}
/* Free remaining strings in list l and truncate it */
al_foreach( &l, (void (*)(const void *))&free );
al_truncate( &l, 0 );
al_foreach( &var_item_list, (void (*)(const void *))&free );
al_truncate( &var_item_list, 0 );
/* Add items from list idx back to list l */
al_push_all( &l, &idx );
al_push_all( &var_item_list, var_idx_list );
}
free( var_val );
}
if( is_ok )
@@ -902,16 +908,15 @@ static int expand_variables( wchar_t *in, array_list_t *out )
if( is_single )
{
string_buffer_t res;
sb_init( &res );
in[i]=0;
sb_init( &res );
sb_append( &res, in );
sb_append_char( &res, INTERNAL_SEPARATOR );
for( j=0; j<al_get_count( &l); j++ )
for( j=0; j<al_get_count( &var_item_list); j++ )
{
wchar_t *next = (wchar_t *)al_get( &l, j );
wchar_t *next = (wchar_t *)al_get( &var_item_list, j );
if( is_ok )
{
@@ -922,52 +927,57 @@ static int expand_variables( wchar_t *in, array_list_t *out )
free( next );
}
sb_append( &res, &in[stop_pos] );
is_ok &= expand_variables( (wchar_t *)res.buff, out );
is_ok &= expand_variables( (wchar_t *)res.buff, out, i );
}
else
{
for( j=0; j<al_get_count( &l); j++ )
for( j=0; j<al_get_count( &var_item_list); j++ )
{
wchar_t *next = (wchar_t *)al_get( &l, j );
if( is_ok )
wchar_t *next = (wchar_t *)al_get( &var_item_list, j );
if( is_ok && (i == 0) && (!in[stop_pos]) )
{
new_len = wcslen(in) - (stop_pos-start_pos+1) + wcslen( next) +2;
if( !(new_in = malloc( sizeof(wchar_t)*new_len )))
al_push( out, next );
}
else
{
if( is_ok )
{
die_mem();
}
else
{
wcsncpy( new_in, in, start_pos-1 );
if(start_pos>1 && new_in[start_pos-2]!=VARIABLE_EXPAND)
new_len = wcslen(in) - (stop_pos-start_pos+1);
new_len += wcslen( next) +2;
if( !(new_in = malloc( sizeof(wchar_t)*new_len )))
{
new_in[start_pos-1]=INTERNAL_SEPARATOR;
new_in[start_pos]=L'\0';
die_mem();
}
else
new_in[start_pos-1]=L'\0';
{
wcslcpy( new_in, in, start_pos );
wcscat( new_in, next );
wcscat( new_in, &in[stop_pos] );
// fwprintf( stderr, L"New value %ls\n", new_in );
is_ok &= expand_variables( new_in, out );
if(start_pos>1 && new_in[start_pos-2]!=VARIABLE_EXPAND)
{
new_in[start_pos-1]=INTERNAL_SEPARATOR;
new_in[start_pos]=L'\0';
}
else
new_in[start_pos-1]=L'\0';
wcscat( new_in, next );
wcscat( new_in, &in[stop_pos] );
is_ok &= expand_variables( new_in, out, i );
}
}
free( next );
}
free( next );
}
}
}
al_destroy( &l );
al_destroy( &idx );
free(in);
free(var_name );
al_destroy( &var_item_list );
return is_ok;
}
else
@@ -993,19 +1003,14 @@ static int expand_variables( wchar_t *in, array_list_t *out )
in[i]=0;
sb_append( &res, in );
sb_append( &res, &in[stop_pos] );
is_ok &= expand_variables( wcsdup((wchar_t *)res.buff), out );
sb_destroy( &res );
is_ok &= expand_variables( (wchar_t *)res.buff, out, i );
free(in);
free(var_name );
return is_ok;
}
}
free(var_name );
}
@@ -1039,9 +1044,6 @@ static int expand_brackets( wchar_t *in, int flags, array_list_t *out )
wchar_t *item_begin;
int len1, len2, tot_len;
// fwprintf( stderr, L"expand %ls\n", in );
for( pos=in;
(!bracket_end) && (*pos) && !syntax_error;
pos++ )
@@ -1109,7 +1111,7 @@ static int expand_brackets( wchar_t *in, int flags, array_list_t *out )
{
error( SYNTAX_ERROR,
-1,
L"Mismatched brackets" );
_(L"Mismatched brackets") );
return 0;
}
@@ -1133,8 +1135,8 @@ static int expand_brackets( wchar_t *in, int flags, array_list_t *out )
int item_len = pos-item_begin;
whole_item = malloc( sizeof(wchar_t)*(tot_len + item_len + 1) );
wcsncpy( whole_item, in, len1 );
wcsncpy( whole_item+len1, item_begin, item_len );
wcslcpy( whole_item, in, len1+1 );
wcslcpy( whole_item+len1, item_begin, item_len+1 );
wcscpy( whole_item+len1+item_len, bracket_end+1 );
expand_brackets( whole_item, flags, out );
@@ -1172,6 +1174,18 @@ static int expand_subshell( wchar_t *in, array_list_t *out )
int i, j;
const wchar_t *item_begin;
if( !in )
{
debug( 2, L"Got null string on line %d of file %s", __LINE__, __FILE__ );
return 0;
}
if( !out )
{
debug( 2, L"Got null pointer on line %d of file %s", __LINE__, __FILE__ );
return 0;
}
switch( parse_util_locate_cmdsubst(in,
&paran_begin,
&paran_end,
@@ -1188,7 +1202,6 @@ static int expand_subshell( wchar_t *in, array_list_t *out )
case 1:
break;
}
len1 = (paran_begin-in);
@@ -1203,7 +1216,7 @@ static int expand_subshell( wchar_t *in, array_list_t *out )
return 0;
}
wcsncpy( subcmd, paran_begin+1, paran_end-paran_begin-1 );
wcslcpy( subcmd, paran_begin+1, paran_end-paran_begin );
subcmd[ paran_end-paran_begin-1]=0;
if( exec_subshell( subcmd, &sub_res)==-1 )
@@ -1237,10 +1250,10 @@ static int expand_subshell( wchar_t *in, array_list_t *out )
sb_append_substring( &whole_item, sub_item2, item_len );
sb_append_char( &whole_item, INTERNAL_SEPARATOR );
sb_append( &whole_item, tail_item );
al_push( out, whole_item.buff );
al_push( out, whole_item.buff );
}
free( sub_item2 );
}
free(in);
@@ -1279,7 +1292,6 @@ static wchar_t * expand_tilde_internal( wchar_t *in )
wchar_t *new_in=0;
wchar_t *old_in=0;
// fwprintf( stderr, L"Tilde expand ~%ls\n", (*ptr)+1 );
if( in[1] == '/' || in[1] == '\0' )
{
/* Current users home directory */
@@ -1371,7 +1383,7 @@ static void remove_internal_separator( const void *s, int conv )
case INTERNAL_SEPARATOR:
in++;
break;
case ANY_CHAR:
in++;
*out++ = conv?L'?':ANY_CHAR;
@@ -1393,7 +1405,8 @@ static void remove_internal_separator( const void *s, int conv )
/**
The real expansion function. expand_one is just a wrapper around this one.
*/
int expand_string( wchar_t *str,
int expand_string( void *context,
wchar_t *str,
array_list_t *end_out,
int flags )
{
@@ -1403,12 +1416,13 @@ int expand_string( wchar_t *str,
int i;
int subshell_ok = 1;
int res = EXPAND_OK;
int start_count = al_get_count( end_out );
// debug( 1, L"Expand %ls", str );
if( (!(flags & ACCEPT_INCOMPLETE)) && is_clean( str ) )
{
halloc_register( context, str );
al_push( end_out, str );
return EXPAND_OK;
}
@@ -1418,23 +1432,18 @@ int expand_string( wchar_t *str,
if( EXPAND_SKIP_SUBSHELL & flags )
{
wchar_t *pos = str;
while( 1 )
const wchar_t *begin, *end;
if( parse_util_locate_cmdsubst( str,
&begin,
&end,
1 ) != 0 )
{
pos = wcschr( pos, L'(' );
if( pos == 0 )
break;
if( (pos == str) || ( *(pos-1) != L'\\' ) )
{
error( SUBSHELL_ERROR, -1, L"Subshells not allowed" );
free( str );
al_destroy( &list1 );
al_destroy( &list2 );
return EXPAND_ERROR;
}
pos++;
error( SUBSHELL_ERROR, -1, L"Subshells not allowed" );
free( str );
al_destroy( &list1 );
al_destroy( &list2 );
return EXPAND_ERROR;
}
al_push( &list1, str );
}
@@ -1463,7 +1472,10 @@ int expand_string( wchar_t *str,
free( (void *)al_get( in, i ) );
if( !next )
continue;
{
debug( 2, L"Got null string on line %d of file %s", __LINE__, __FILE__ );
continue;
}
if( EXPAND_SKIP_VARIABLES & flags )
{
@@ -1472,11 +1484,10 @@ int expand_string( wchar_t *str,
if( *tmp == VARIABLE_EXPAND )
*tmp = L'$';
al_push( out, next );
}
else
{
if(!expand_variables( next, out ))
if(!expand_variables( next, out, wcslen(next)-1 ))
{
al_destroy( in );
al_destroy( out );
@@ -1493,6 +1504,13 @@ int expand_string( wchar_t *str,
for( i=0; i<al_get_count( in ); i++ )
{
wchar_t *next = (wchar_t *)al_get( in, i );
if( !next )
{
debug( 2, L"Got null string on line %d of file %s", __LINE__, __FILE__ );
continue;
}
if( !expand_brackets( next, flags, out ))
{
al_destroy( in );
@@ -1508,6 +1526,13 @@ int expand_string( wchar_t *str,
for( i=0; i<al_get_count( in ); i++ )
{
wchar_t *next = (wchar_t *)al_get( in, i );
if( !next )
{
debug( 2, L"Got null string on line %d of file %s", __LINE__, __FILE__ );
continue;
}
if( !(next=expand_tilde_internal( next ) ) )
{
al_destroy( in );
@@ -1552,7 +1577,14 @@ int expand_string( wchar_t *str,
wchar_t *next = (wchar_t *)al_get( in, i );
int wc_res;
if( !next )
{
debug( 2, L"Got null string on line %d of file %s", __LINE__, __FILE__ );
continue;
}
remove_internal_separator( next, EXPAND_SKIP_WILDCARDS & flags );
if( ((flags & ACCEPT_INCOMPLETE) && (!(flags & EXPAND_SKIP_WILDCARDS))) ||
wildcard_has( next, 1 ) )
{
@@ -1569,50 +1601,79 @@ int expand_string( wchar_t *str,
switch( wc_res )
{
case 0:
{
if( !(flags & ACCEPT_INCOMPLETE) )
{
if( res == EXPAND_OK )
res = EXPAND_WILDCARD_NO_MATCH;
break;
}
}
case 1:
{
int j;
res = EXPAND_WILDCARD_MATCH;
sort_list( out );
al_push_all( end_out, out );
for( j=0; j<al_get_count( out ); j++ )
{
wchar_t *next = (wchar_t *)al_get( out, j );
if( !next )
{
debug( 2, L"Got null string on line %d of file %s", __LINE__, __FILE__ );
continue;
}
al_push( end_out, next );
}
al_truncate( out, 0 );
break;
}
}
}
else
{
if( flags & ACCEPT_INCOMPLETE)
{
free( next );
}
else
{
al_push( end_out, next );
}
}
}
al_destroy( in );
al_destroy( out );
}
if( context )
{
for( i=start_count; i<al_get_count( end_out ); i++ )
{
halloc_register( context, (void *)al_get( end_out, i ) );
}
}
return res;
}
wchar_t *expand_one( wchar_t *string, int flags )
wchar_t *expand_one( void *context, wchar_t *string, int flags )
{
array_list_t l;
int res;
wchar_t *one;
if( (!(flags & ACCEPT_INCOMPLETE)) && is_clean( string ) )
{
halloc_register( context, string );
return string;
}
al_init( &l );
res = expand_string( string, &l, flags );
res = expand_string( 0, string, &l, flags );
if( !res )
{
one = 0;
@@ -1632,6 +1693,8 @@ wchar_t *expand_one( wchar_t *string, int flags )
al_foreach( &l, (void(*)(const void *))&free );
al_destroy( &l );
halloc_register( context, one );
return one;
}

View File

@@ -130,7 +130,7 @@ enum
\param out The list to which the result will be appended.
\return One of EXPAND_OK, EXPAND_ERROR, EXPAND_WILDCARD_MATCH and EXPAND_WILDCARD_NO_MATCH
*/
int expand_string( wchar_t *in, array_list_t *out, int flag );
int expand_string( void *context, wchar_t *in, array_list_t *out, int flag );
/**
expand_one is identical to expand_string, except it will fail if in
@@ -141,14 +141,13 @@ int expand_string( wchar_t *in, array_list_t *out, int flag );
\param flag Specifies if any expansion pass should be skipped. Legal values are any combination of EXPAND_SKIP_SUBSHELL EXPAND_SKIP_VARIABLES and EXPAND_SKIP_WILDCARDS
\return The expanded parameter, or 0 on failiure
*/
wchar_t *expand_one( wchar_t *in, int flag );
wchar_t *expand_one( void *context, wchar_t *in, int flag );
/**
Convert the variable value to a human readable form, i.e. escape things, handle arrays, etc. Suitable for pretty-printing.
*/
wchar_t *expand_escape_variable( const wchar_t *in );
/**
Perform tilde expansion and nothing else on the specified string.

999
fallback.c Normal file
View File

@@ -0,0 +1,999 @@
/**
This file only contains fallback implementations of functions which
have been found to be missing or broken by the configuration
scripts.
*/
#include "config.h"
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <wchar.h>
#include <wctype.h>
#include <string.h>
#include <dirent.h>
#include <stdarg.h>
#include <limits.h>
#if HAVE_NCURSES_H
#include <ncurses.h>
#else
#include <curses.h>
#endif
#if HAVE_TERMIO_H
#include <termio.h>
#endif
#if HAVE_TERM_H
#include <term.h>
#elif HAVE_NCURSES_TERM_H
#include <ncurses/term.h>
#endif
#include "fallback.h"
#include "util.h"
#ifdef TPUTS_KLUDGE
int tputs(const char *str, int affcnt, int (*fish_putc)(tputs_arg_t))
{
while( *str )
{
fish_putc( *str++ );
}
}
#endif
#ifndef HAVE_FWPRINTF
#define INTERNAL_FWPRINTF 1
#endif
#ifdef HAVE_BROKEN_FWPRINTF
#define INTERNAL_FWPRINTF 1
#endif
#ifdef INTERNAL_FWPRINTF
void pad( void (*writer)(wchar_t), int count)
{
int i;
if( count < 0 )
return;
for( i=0; i<count; i++ )
{
writer( L' ' );
}
}
/**
Generic formatting function. All other string formatting functions
are secretly a wrapper around this function. vgprintf does not
implement all the filters supported by printf, only those that are
currently used by fish. vgprintf internally uses snprintf to
implement the number outputs, such as %f and %x.
Currently supported functionality:
- precision specification, both through .* and .N
- Padding through * and N
- Right padding using the - prefix
- long versions of all filters thorugh l and ll prefix
- Character output using %c
- String output through %s
- Floating point number output through %f
- Integer output through %d, %i, %u, %o, %x and %X
For a full description on the usage of *printf, see use 'man 3 printf'.
*/
static int vgwprintf( void (*writer)(wchar_t),
const wchar_t *filter,
va_list va )
{
const wchar_t *filter_org=filter;
int count=0;
for( ;*filter; filter++)
{
if(*filter == L'%')
{
int is_long=0;
int width = -1;
filter++;
int loop=1;
int precision=-1;
int pad_left = 1;
if( iswdigit( *filter ) )
{
width=0;
while( (*filter >= L'0') && (*filter <= L'9'))
{
width=10*width+(*filter++ - L'0');
}
}
while( loop )
{
switch(*filter)
{
case L'l':
/* Long variable */
is_long++;
filter++;
break;
case L'*':
/* Set minimum field width */
width = va_arg( va, int );
filter++;
break;
case L'-':
filter++;
pad_left=0;
break;
case L'.':
/*
Set precision.
*/
filter++;
if( *filter == L'*' )
{
precision = va_arg( va, int );
}
else
{
precision=0;
while( (*filter >= L'0') && (*filter <= L'9'))
{
precision=10*precision+(*filter++ - L'0');
}
}
break;
default:
loop=0;
break;
}
}
switch( *filter )
{
case L'c':
{
wchar_t c;
if( (width >= 0) && pad_left )
{
pad( writer, width-1 );
count += maxi( width-1, 0 );
}
c = is_long?va_arg(va, wint_t):btowc(va_arg(va, int));
if( precision != 0 )
writer( c );
if( (width >= 0) && !pad_left )
{
pad( writer, width-1 );
count += maxi( width-1, 0 );
}
count++;
break;
}
case L's':
{
wchar_t *ss=0;
if( is_long )
{
ss = va_arg(va, wchar_t *);
}
else
{
char *ns = va_arg(va, char*);
if( ns )
{
ss = str2wcs( ns );
}
}
if( !ss )
{
return -1;
}
if( (width >= 0) && pad_left )
{
pad( writer, width-wcslen(ss) );
count += maxi(width-wcslen(ss), 0);
}
wchar_t *s=ss;
int precount = count;
while( *s )
{
if( (precision > 0) && (precision <= (count-precount) ) )
break;
writer( *(s++) );
count++;
}
if( (width >= 0) && !pad_left )
{
pad( writer, width-wcslen(ss) );
count += maxi( width-wcslen(ss), 0 );
}
if( !is_long )
free( ss );
break;
}
case L'd':
case L'i':
case L'o':
case L'u':
case L'x':
case L'X':
{
char str[33];
char *pos;
char format[16];
int len;
format[0]=0;
strcat( format, "%");
if( precision >= 0 )
strcat( format, ".*" );
switch( is_long )
{
case 2:
strcat( format, "ll" );
break;
case 1:
strcat( format, "l" );
break;
}
len = strlen(format);
format[len++]=(char)*filter;
format[len]=0;
switch( *filter )
{
case L'd':
case L'i':
{
switch( is_long )
{
case 0:
{
int d = va_arg( va, int );
if( precision >= 0 )
snprintf( str, 32, format, precision, d );
else
snprintf( str, 32, format, d );
break;
}
case 1:
{
long d = va_arg( va, long );
if( precision >= 0 )
snprintf( str, 32, format, precision, d );
else
snprintf( str, 32, format, d );
break;
}
case 2:
{
long long d = va_arg( va, long long );
if( precision >= 0 )
snprintf( str, 32, format, precision, d );
else
snprintf( str, 32, format, d );
break;
}
default:
debug( 0, L"Invalid length modifier in string %ls\n", filter_org );
return -1;
}
break;
}
case L'u':
case L'o':
case L'x':
case L'X':
{
switch( is_long )
{
case 0:
{
unsigned d = va_arg( va, unsigned );
if( precision >= 0 )
snprintf( str, 32, format, precision, d );
else
snprintf( str, 32, format, d );
break;
}
case 1:
{
unsigned long d = va_arg( va, unsigned long );
if( precision >= 0 )
snprintf( str, 32, format, precision, d );
else
snprintf( str, 32, format, d );
break;
}
case 2:
{
unsigned long long d = va_arg( va, unsigned long long );
if( precision >= 0 )
snprintf( str, 32, format, precision, d );
else
snprintf( str, 32, format, d );
break;
}
default:
debug( 0, L"Invalid length modifier in string %ls\n", filter_org );
return -1;
}
break;
}
default:
debug( 0, L"Invalid filter %ls in string %ls\n", *filter, filter_org );
return -1;
}
if( (width >= 0) && pad_left )
{
int l = maxi(width-strlen(str), 0 );
pad( writer, l );
count += l;
}
pos = str;
while( *pos )
{
writer( *(pos++) );
count++;
}
if( (width >= 0) && !pad_left )
{
int l = maxi(width-strlen(str), 0 );
pad( writer, l );
count += l;
}
break;
}
case L'f':
{
char str[32];
char *pos;
double val = va_arg( va, double );
if( precision>= 0 )
{
if( width>= 0 )
{
snprintf( str, 32, "%*.*f", width, precision, val );
}
else
{
snprintf( str, 32, "%.*f", precision, val );
}
}
else
{
if( width>= 0 )
{
snprintf( str, 32, "%*f", width, val );
}
else
{
snprintf( str, 32, "%f", val );
}
}
pos = str;
while( *pos )
{
writer( *(pos++) );
count++;
}
break;
}
case L'n':
{
int *n = va_arg( va, int *);
*n = count;
break;
}
case L'%':
{
writer('%');
count++;
break;
}
default:
debug( 0, L"Unknown switch %lc in string %ls\n", *filter, filter_org );
return -1;
}
}
else
{
writer( *filter );
count++;
}
}
return count;
}
/**
Holds data for swprintf writer
*/
static struct
{
int count;
int max;
wchar_t *pos;
}
sw_data;
/**
Writers for string output
*/
static void sw_writer( wchar_t c )
{
if( sw_data.count < sw_data.max )
*(sw_data.pos++)=c;
sw_data.count++;
}
int vswprintf( wchar_t *out, size_t n, const wchar_t *filter, va_list va )
{
int written;
sw_data.pos=out;
sw_data.max=n;
sw_data.count=0;
written=vgwprintf( &sw_writer,
filter,
va );
if( written < n )
{
*sw_data.pos = 0;
}
else
{
written=-1;
}
return written;
}
int swprintf( wchar_t *out, size_t n, const wchar_t *filter, ... )
{
va_list va;
int written;
va_start( va, filter );
written = vswprintf( out, n, filter, va );
va_end( va );
return written;
}
/**
Holds auxiliary data for fwprintf and wprintf writer
*/
static FILE *fw_data;
static void fw_writer( wchar_t c )
{
putwc( c, fw_data );
}
/*
Writers for file output
*/
int vfwprintf( FILE *f, const wchar_t *filter, va_list va )
{
fw_data = f;
return vgwprintf( &fw_writer, filter, va );
}
int fwprintf( FILE *f, const wchar_t *filter, ... )
{
va_list va;
int written;
va_start( va, filter );
written = vfwprintf( f, filter, va );
va_end( va );
return written;
}
int vwprintf( const wchar_t *filter, va_list va )
{
return vfwprintf( stdout, filter, va );
}
int wprintf( const wchar_t *filter, ... )
{
va_list va;
int written;
va_start( va, filter );
written=vwprintf( filter, va );
va_end( va );
return written;
}
#endif
#ifndef HAVE_FGETWC
wint_t fgetwc(FILE *stream)
{
wchar_t res=0;
mbstate_t state;
memset (&state, '\0', sizeof (state));
while(1)
{
int b = fgetc( stream );
char bb;
int sz;
if( b == EOF )
return WEOF;
bb=b;
sz = mbrtowc( &res, &bb, 1, &state );
switch( sz )
{
case -1:
memset (&state, '\0', sizeof (state));
return WEOF;
case -2:
break;
case 0:
return 0;
default:
return res;
}
}
}
wint_t getwc(FILE *stream)
{
return fgetwc( stream );
}
#endif
#ifndef HAVE_FPUTWC
wint_t fputwc(wchar_t wc, FILE *stream)
{
int res;
char s[MB_CUR_MAX+1];
memset( s, 0, MB_CUR_MAX+1 );
wctomb( s, wc );
res = fputs( s, stream );
return res==EOF?WEOF:wc;
}
wint_t putwc(wchar_t wc, FILE *stream)
{
return fputwc( wc, stream );
}
#endif
#ifndef HAVE_WCSTOK
/*
Used by fallback wcstok. Borrowed from glibc
*/
static size_t fish_wcsspn (const wchar_t *wcs,
const wchar_t *accept )
{
register const wchar_t *p;
register const wchar_t *a;
register size_t count = 0;
for (p = wcs; *p != L'\0'; ++p)
{
for (a = accept; *a != L'\0'; ++a)
if (*p == *a)
break;
if (*a == L'\0')
return count;
else
++count;
}
return count;
}
/*
Used by fallback wcstok. Borrowed from glibc
*/
static wchar_t *fish_wcspbrk (const wchar_t *wcs, const wchar_t *accept)
{
while (*wcs != L'\0')
if (wcschr (accept, *wcs) == NULL)
++wcs;
else
return (wchar_t *) wcs;
return NULL;
}
/*
Fallback wcstok implementation. Borrowed from glibc.
*/
wchar_t *wcstok(wchar_t *wcs, const wchar_t *delim, wchar_t **save_ptr)
{
wchar_t *result;
if (wcs == NULL)
{
if (*save_ptr == NULL)
{
errno = EINVAL;
return NULL;
}
else
wcs = *save_ptr;
}
/* Scan leading delimiters. */
wcs += fish_wcsspn (wcs, delim);
if (*wcs == L'\0')
{
*save_ptr = NULL;
return NULL;
}
/* Find the end of the token. */
result = wcs;
wcs = fish_wcspbrk (result, delim);
if (wcs == NULL)
{
/* This token finishes the string. */
*save_ptr = NULL;
}
else
{
/* Terminate the token and make *SAVE_PTR point past it. */
*wcs = L'\0';
*save_ptr = wcs + 1;
}
return result;
}
#endif
#ifndef HAVE_WCSDUP
wchar_t *wcsdup( const wchar_t *in )
{
size_t len=wcslen(in);
wchar_t *out = malloc( sizeof( wchar_t)*(len+1));
if( out == 0 )
{
return 0;
}
memcpy( out, in, sizeof( wchar_t)*(len+1));
return out;
}
#endif
#ifndef HAVE_WCSLEN
size_t wcslen(const wchar_t *in)
{
const wchar_t *end=in;
while( *end )
end++;
return end-in;
}
#endif
#ifndef HAVE_WCSCASECMP
int wcscasecmp( const wchar_t *a, const wchar_t *b )
{
if( *a == 0 )
{
return (*b==0)?0:-1;
}
else if( *b == 0 )
{
return 1;
}
int diff = towlower(*a)-towlower(*b);
if( diff != 0 )
return diff;
else
return wcscasecmp( a+1,b+1);
}
#endif
#ifndef HAVE_WCSNCASECMP
int wcsncasecmp( const wchar_t *a, const wchar_t *b, int count )
{
if( count == 0 )
return 0;
if( *a == 0 )
{
return (*b==0)?0:-1;
}
else if( *b == 0 )
{
return 1;
}
int diff = towlower(*a)-towlower(*b);
if( diff != 0 )
return diff;
else
return wcsncasecmp( a+1,b+1, count-1);
}
#endif
#ifndef HAVE_WCWIDTH
int wcwidth( wchar_t c )
{
if( c < 32 )
return 0;
if ( c == 127 )
return 0;
return 1;
}
#endif
#ifndef HAVE_WCSNDUP
wchar_t *wcsndup( const wchar_t *in, int c )
{
wchar_t *res = malloc( sizeof(wchar_t)*(c+1) );
if( res == 0 )
{
return 0;
}
wcslcpy( res, in, c+1 );
return res;
}
#endif
long convert_digit( wchar_t d, int base )
{
long res=-1;
if( (d <= L'9') && (d >= L'0') )
{
res = d - L'0';
}
else if( (d <= L'z') && (d >= L'a') )
{
res = d + 10 - L'a';
}
else if( (d <= L'Z') && (d >= L'A') )
{
res = d + 10 - L'A';
}
if( res >= base )
{
res = -1;
}
return res;
}
#ifndef HAVE_WCSTOL
long wcstol(const wchar_t *nptr,
wchar_t **endptr,
int base)
{
long long res=0;
int is_set=0;
if( base > 36 )
{
errno = EINVAL;
return 0;
}
while( 1 )
{
long nxt = convert_digit( *nptr, base );
if( endptr != 0 )
*endptr = (wchar_t *)nptr;
if( nxt < 0 )
{
if( !is_set )
{
errno = EINVAL;
}
return res;
}
res = (res*base)+nxt;
is_set = 1;
if( res > LONG_MAX )
{
errno = ERANGE;
return LONG_MAX;
}
if( res < LONG_MIN )
{
errno = ERANGE;
return LONG_MIN;
}
nptr++;
}
}
#endif
#ifndef HAVE_WCSLCAT
/*$OpenBSD: strlcat.c,v 1.11 2003/06/17 21:56:24 millert Exp $*/
/*
* Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
size_t
wcslcat(wchar_t *dst, const wchar_t *src, size_t siz)
{
register wchar_t *d = dst;
register const wchar_t *s = src;
register size_t n = siz;
size_t dlen;
/* Find the end of dst and adjust bytes left but don't go past end */
while (n-- != 0 && *d != '\0')
d++;
dlen = d - dst;
n = siz - dlen;
if (n == 0)
return(dlen + wcslen(s));
while (*s != '\0')
{
if (n != 1)
{
*d++ = *s;
n--;
}
s++;
}
*d = '\0';
return(dlen + (s - src));
/* count does not include NUL */
}
#endif
#ifndef HAVE_WCSLCPY
/*$OpenBSD: strlcpy.c,v 1.8 2003/06/17 21:56:24 millert Exp $*/
/*
* Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
size_t
wcslcpy(wchar_t *dst, const wchar_t *src, size_t siz)
{
register wchar_t *d = dst;
register const wchar_t *s = src;
register size_t n = siz;
/* Copy as many bytes as will fit */
if (n != 0 && --n != 0)
{
do
{
if ((*d++ = *s++) == 0)
break;
}
while (--n != 0);
}
/* Not enough room in dst, add NUL and traverse rest of src */
if (n == 0)
{
if (siz != 0)
*d = '\0';
/* NUL-terminate dst */
while (*s++)
;
}
return(s - src - 1);
/* count does not include NUL */
}
#endif

265
fallback.h Normal file
View File

@@ -0,0 +1,265 @@
#ifndef FISH_FALLBACK_H
#define FISH_FALLBACK_H
#include <stdio.h>
#include <stdarg.h>
#include <wctype.h>
#include <wchar.h>
#include "common.h"
/**
Under curses, tputs expects an int (*func)(char) as its last
parameter, but in ncurses, tputs expects a int (*func)(int) as its
last parameter. tputs_arg_t is defined to always be what tputs
expects. Hopefully.
*/
#ifdef NCURSES_VERSION
typedef int tputs_arg_t;
#else
typedef char tputs_arg_t;
#endif
#ifdef TPUTS_KLUDGE
/**
Linux on PPC seems to have a tputs implementation that sometimes
behaves strangely. This fallback seems to fix things.
*/
int tputs(const char *str, int affcnt, int (*fish_putc)(tputs_arg_t));
#endif
#ifndef HAVE_FWPRINTF
/**
Print formated string. Some operating systems (Like NetBSD) do not
have wide string formating functions. Therefore we implement our
own. Not at all complete. Supports wide and narrow characters,
strings and decimal numbers, position (%n), field width and
precision.
*/
int fwprintf( FILE *f, const wchar_t *format, ... );
/**
Print formated string. Some operating systems (Like NetBSD) do not
have wide string formating functions. Therefore we define our
own. Not at all complete. Supports wide and narrow characters,
strings and decimal numbers, position (%n), field width and
precision.
*/
int swprintf( wchar_t *str, size_t l, const wchar_t *format, ... );
/**
Print formated string. Some operating systems (Like NetBSD) do not
have wide string formating functions. Therefore we define our
own. Not at all complete. Supports wide and narrow characters,
strings and decimal numbers, position (%n), field width and
precision.
*/
int wprintf( const wchar_t *format, ... );
/**
Print formated string. Some operating systems (Like NetBSD) do not
have wide string formating functions. Therefore we define our
own. Not at all complete. Supports wide and narrow characters,
strings and decimal numbers, position (%n), field width and
precision.
*/
int vwprintf( const wchar_t *filter, va_list va );
/**
Print formated string. Some operating systems (Like NetBSD) do not
have wide string formating functions. Therefore we define our
own. Not at all complete. Supports wide and narrow characters,
strings and decimal numbers, position (%n), field width and
precision.
*/
int vfwprintf( FILE *f, const wchar_t *filter, va_list va );
/**
Print formated string. Some operating systems (Like NetBSD) do not
have wide string formating functions. Therefore we define our
own. Not at all complete. Supports wide and narrow characters,
strings and decimal numbers, position (%n), field width and
precision.
*/
int vswprintf( wchar_t *out, size_t n, const wchar_t *filter, va_list va );
#endif
#ifndef HAVE_FGETWC
/**
Fallback implementation of fgetwc
*/
wint_t fgetwc(FILE *stream);
/**
Fallback implementation of getwc
*/
wint_t getwc(FILE *stream);
#endif
#ifndef HAVE_FPUTWC
/**
Fallback implementation of fputwc
*/
wint_t fputwc(wchar_t wc, FILE *stream);
/**
Fallback implementation of putwc
*/
wint_t putwc(wchar_t wc, FILE *stream);
#endif
#ifndef HAVE_WCSTOK
/**
Fallback implementation of wcstok. Uses code borrowed from glibc.
*/
wchar_t *wcstok(wchar_t *wcs, const wchar_t *delim, wchar_t **ptr);
#endif
#ifndef HAVE_WCWIDTH
/**
Return the number of columns used by a character. This is a libc
function, but the prototype for this function is missing in some libc
implementations.
Fish has a fallback implementation in case the implementation is
missing altogether. In locales without a native wcwidth, Unicode
is probably so broken that it isn't worth trying to implement a
real wcwidth. Therefore, the fallback wcwidth assumes any printing
character takes up one column and anything else uses 0 columns.
*/
int wcwidth( wchar_t c );
#endif
#ifndef HAVE_WCSDUP
/**
Create a duplicate string. Wide string version of strdup. Will
automatically exit if out of memory.
*/
wchar_t *wcsdup(const wchar_t *in);
#endif
#ifndef HAVE_WCSLEN
/**
Fallback for wcsen. Returns the length of the specified string.
*/
size_t wcslen(const wchar_t *in);
#endif
#ifndef HAVE_WCSCASECMP
/**
Case insensitive string compare function. Wide string version of
strcasecmp.
This implementation of wcscasecmp does not take into account
esoteric locales where uppercase and lowercase do not cleanly
transform between each other. Hopefully this should be fine since
fish only uses this function with one of the strings supplied by
fish and guaranteed to be a sane, english word. Using wcscasecmp on
a user-supplied string should be considered a bug.
*/
int wcscasecmp( const wchar_t *a, const wchar_t *b );
#endif
#ifndef HAVE_WCSNCASECMP
/**
Case insensitive string compare function. Wide string version of
strncasecmp.
This implementation of wcsncasecmp does not take into account
esoteric locales where uppercase and lowercase do not cleanly
transform between each other. Hopefully this should be fine since
fish only uses this function with one of the strings supplied by
fish and guaranteed to be a sane, english word. Using wcsncasecmp on
a user-supplied string should be considered a bug.
*/
int wcsncasecmp( const wchar_t *a, const wchar_t *b, int count );
/**
Returns a newly allocated wide character string wich is a copy of
the string in, but of length c or shorter. The returned string is
always null terminated, and the null is not included in the string
length.
*/
#endif
#ifndef HAVE_WCSNDUP
/**
Fallback for wcsndup function. Returns a copy of \c in, truncated
to a maximum length of \c c.
*/
wchar_t *wcsndup( const wchar_t *in, int c );
#endif
/**
Converts from wide char to digit in the specified base. If d is not
a valid digit in the specified base, return -1.
*/
long convert_digit( wchar_t d, int base );
#ifndef HAVE_WCSTOL
/**
Fallback implementation. Convert a wide character string to a
number in the specified base. This functions is the wide character
string equivalent of strtol. For bases of 10 or lower, 0..9 are
used to represent numbers. For bases below 36, a-z and A-Z are used
to represent numbers higher than 9. Higher bases than 36 are not
supported.
*/
long wcstol(const wchar_t *nptr,
wchar_t **endptr,
int base);
#endif
#ifndef HAVE_WCSLCAT
/**
Appends src to string dst of size siz (unlike wcsncat, siz is the
full size of dst, not space left). At most siz-1 characters will be
copied. Always NUL terminates (unless siz <= wcslen(dst)). Returns
wcslen(src) + MIN(siz, wcslen(initial dst)). If retval >= siz,
truncation occurred.
This is the OpenBSD strlcat function, modified for wide characters,
and renamed to reflect this change.
*/
size_t wcslcat( wchar_t *dst, const wchar_t *src, size_t siz );
#endif
#ifndef HAVE_WCSLCPY
/**
Copy src to string dst of size siz. At most siz-1 characters will
be copied. Always NUL terminates (unless siz == 0). Returns
wcslen(src); if retval >= siz, truncation occurred.
This is the OpenBSD strlcpy function, modified for wide characters,
and renamed to reflect this change.
*/
size_t wcslcpy( wchar_t *dst, const wchar_t *src, size_t siz );
#endif
#endif

View File

@@ -1,3 +1,5 @@
%define xinclude %( if test -d /usr/X11R6/include; then echo /usr/X11R6/include; else echo /usr/include; fi )
Summary: A friendly interactive shell
Name: @PACKAGE_NAME@
@@ -11,42 +13,68 @@ URL: http://roo.no-ip.org/fish/
Source0: http://roo.no-ip.org/%{name}/files/%{version}/%{name}-%{version}.tar.bz2
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildRequires: doxygen ncurses-devel xorg-x11-devel
BuildRequires: doxygen ncurses-devel
BuildRequires: %{xinclude}/X11/StringDefs.h, %{xinclude}/X11/Xlib.h
BuildRequires: %{xinclude}/X11/Intrinsic.h, %{xinclude}/X11/Xatom.h
%description
fish is a shell geared towards interactive use. It's features are
focused on user friendlieness and discoverability. The language syntax
is simple but incompatible with other shell languages.
%prep
%setup -q
%build
%build
%configure docdir=%_datadir/doc/%{name}-%{version}
make %{?_smp_mflags}
%install
rm -rf $RPM_BUILD_ROOT
make install DESTDIR="$RPM_BUILD_ROOT"
%clean
rm -rf $RPM_BUILD_ROOT
%post
if ! grep %_bindir/fish %_sysconfdir/shells >/dev/null; then
echo %_bindir/fish >>%_sysconfdir/shells
fi
%postun
if [ "$1" = 0 ]; then
grep -v %_bindir/fish %_sysconfdir/shells >%_sysconfdir/fish.tmp
mv %_sysconfdir/fish.tmp %_sysconfdir/shells
fi
%files
%defattr(-,root,root,-)
%doc %_datadir/doc/%{name}-%{version}
%_mandir/man1/fish.1*
%_mandir/man1/xsel.1x*
%_mandir/man1/mimedb.1*
@@ -54,6 +82,7 @@ fi
%_mandir/man1/count.1*
%_mandir/man1/fishd.1*
%_mandir/man1/fish_pager.1*
%attr(0755,root,root) %_bindir/fish
%attr(0755,root,root) %_bindir/fishd
%attr(0755,root,root) %_bindir/fish_pager
@@ -61,14 +90,26 @@ fi
%attr(0755,root,root) %_bindir/set_color
%attr(0755,root,root) %_bindir/mimedb
%attr(0755,root,root) %_bindir/count
%config %_sysconfdir/fish
%config %_sysconfdir/fish_inputrc
%dir %_sysconfdir/fish.d
%config %_sysconfdir/fish.d/fish_*.fish
%dir %_sysconfdir/fish.d/completions
%config %_sysconfdir/fish.d/completions/*.fish
%dir %_datadir/fish
%_datadir/fish/fish
%dir %_datadir/fish/completions
%_datadir/fish/completions/*.fish
%dir %_datadir/fish/functions
%_datadir/fish/functions/*.fish
%_datadir/locale/*/LC_MESSAGES/fish.mo
%changelog
* Tue Nov 29 2005 Axel Liljencrantz <axel@liljencrantz.se> 1.17.0-0
- 1.17.0

View File

@@ -35,13 +35,18 @@
#include <signal.h>
#include "fallback.h"
#include "util.h"
#include "wutil.h"
#include "common.h"
#include "complete.h"
#include "output.h"
#include "input_common.h"
#include "env_universal.h"
#include "halloc.h"
#include "halloc_util.h"
enum
{
@@ -74,6 +79,7 @@ static struct termios pager_modes;
static int is_ca_mode = 0;
static buffer_t *pager_buffer;
/**
The environment variables used to specify the color of different
@@ -91,8 +97,18 @@ static wchar_t *hightlight_var[] =
static string_buffer_t out_buff;
static FILE *out_file;
typedef struct
{
array_list_t *comp;
wchar_t *desc;
int comp_width;
int desc_width;
int pref_width;
int min_width;
}
comp_t;
int get_color( int highlight )
static int get_color( int highlight )
{
if( highlight < 0 )
return FISH_COLOR_NORMAL;
@@ -101,9 +117,6 @@ int get_color( int highlight )
wchar_t *val = env_universal_get( hightlight_var[highlight]);
if( val == 0 )
return FISH_COLOR_NORMAL;
if( val == 0 )
{
return FISH_COLOR_NORMAL;
@@ -112,7 +125,20 @@ int get_color( int highlight )
return output_color_code( val );
}
int try_sequence( char *seq )
static void recalc_width( array_list_t *l, const wchar_t *prefix )
{
int i;
for( i=0; i<al_get_count( l ); i++ )
{
comp_t *c = (comp_t *)al_get( l, i );
c->min_width = mini( c->desc_width, maxi(0,termsize.ws_col/3 - 2)) +
mini( c->desc_width, maxi(0,termsize.ws_col/5 - 4)) +4;
}
}
static int try_sequence( char *seq )
{
int j, k;
wint_t c=0;
@@ -195,6 +221,110 @@ static wint_t readch()
}
static int pager_buffered_writer( char c)
{
b_append( pager_buffer, &c, 1 );
return 0;
}
static void pager_flush()
{
write( 1, pager_buffer->buff, pager_buffer->used );
pager_buffer->used = 0;
}
static int print_max( const wchar_t *str, int max, int has_more )
{
int i;
int written = 0;
for( i=0; str[i]; i++ )
{
if( written + wcwidth(str[i]) > max )
break;
if( ( written + wcwidth(str[i]) == max) && (has_more || str[i+1]) )
{
writech( ellipsis_char );
written += wcwidth(ellipsis_char );
break;
}
writech( str[i] );
written+= wcwidth( str[i] );
}
return written;
}
static void completion_print_item( const wchar_t *prefix, comp_t *c, int width )
{
int comp_width=0, desc_width=0;
int i;
int written=0;
if( c->pref_width <= width )
{
/*
The entry fits, we give it as much space as it wants
*/
comp_width = c->comp_width;
desc_width = c->desc_width;
}
else
{
/*
The completion and description won't fit on the
allocated space. Give a maximum of 2/3 of the
space to the completion, and whatever is left to
the description.
*/
int desc_all = c->desc_width?c->desc_width+4:0;
comp_width = maxi( mini( c->comp_width,
2*(width-4)/3 ),
width - desc_all );
if( c->desc_width )
desc_width = width-comp_width-4;
else
c->desc_width=0;
}
for( i=0; i<al_get_count( c->comp ); i++ )
{
const wchar_t *comp = (const wchar_t *)al_get( c->comp, i );
if( i != 0 )
written += print_max( L" ", comp_width - written, 2 );
set_color( get_color(HIGHLIGHT_PAGER_PREFIX),FISH_COLOR_NORMAL );
written += print_max( prefix, comp_width - written, comp[0]?1:0 );
set_color( get_color(HIGHLIGHT_PAGER_COMPLETION),FISH_COLOR_IGNORE );
written += print_max( comp, comp_width - written, i!=(al_get_count(c->comp)-1) );
}
if( desc_width )
{
while( written < (width-desc_width-2))
{
written++;
writech( L' ');
}
written += print_max( L"(", 1, 0 );
set_color( get_color( HIGHLIGHT_PAGER_DESCRIPTION ),
FISH_COLOR_IGNORE );
written += print_max( c->desc, desc_width, 0 );
written += print_max( L")", 1, 0 );
}
else
{
while( written < width )
{
written++;
writech( L' ');
}
}
}
/**
Print the specified part of the completion list, using the
specified column offsets and quoting style.
@@ -219,291 +349,29 @@ static void completion_print( int cols,
int rows = (al_get_count( l )-1)/cols+1;
int i, j;
int prefix_width= my_wcswidth(prefix);
for( i = row_start; i<row_stop; i++ )
{
for( j = 0; j < cols; j++ )
{
wchar_t *el, *el_end;
comp_t *el;
int is_last = (j==(cols-1));
if( al_get_count( l ) <= j*rows + i )
continue;
el = (wchar_t *)al_get( l, j*rows + i );
el_end= wcschr( el, COMPLETE_SEP );
set_color( get_color(HIGHLIGHT_PAGER_PREFIX),FISH_COLOR_NORMAL );
writestr( prefix );
set_color( get_color(HIGHLIGHT_PAGER_COMPLETION),FISH_COLOR_IGNORE );
if( el_end == 0 )
{
/* We do not have a description for this completion */
int written = 0;
int max_written = width[j] - prefix_width - (j==cols-1?0:2);
if( is_quoted )
{
for( i=0; i<max_written; i++ )
{
if( !el[i] )
break;
writech( el[i] );
written+= wcwidth( el[i] );
}
}
else
{
written = write_escaped_str( el, max_written );
}
set_color( get_color( HIGHLIGHT_PAGER_DESCRIPTION ),
FISH_COLOR_IGNORE );
writespace( width[j]-
written-
prefix_width );
}
else
{
int whole_desc_width = my_wcswidth(el_end+1);
int whole_comp_width;
/*
Temporarily drop the description so that wcswidth et
al only calculate the width of the completion.
*/
*el_end = L'\0';
/*
Calculate preferred completion width
*/
if( is_quoted )
{
whole_comp_width = my_wcswidth(el);
}
else
{
wchar_t *tmp = escape( el, 1 );
whole_comp_width = my_wcswidth( tmp );
free(tmp);
}
/*
Calculate how wide this entry 'wants' to be
*/
int pref_width = whole_desc_width + 4 + prefix_width + 2 -
(j==cols-1?2:0) + whole_comp_width;
int comp_width, desc_width;
if( pref_width <= width[j] )
{
/*
The entry fits, we give it as much space as it wants
*/
comp_width = whole_comp_width;
desc_width = whole_desc_width;
}
else
{
/*
The completion and description won't fit on the
allocated space. Give a maximum of 2/3 of the
space to the completion, and whatever is left to
the description.
*/
int sum = width[j] - prefix_width - 4 - 2 + (j==cols-1?2:0);
comp_width = maxi( mini( whole_comp_width,
2*sum/3 ),
sum - whole_desc_width );
desc_width = sum-comp_width;
}
/* First we must print the completion. */
if( is_quoted )
{
writestr_ellipsis( el, comp_width);
}
else
{
write_escaped_str( el, comp_width );
}
/* Put the description back */
*el_end = COMPLETE_SEP;
/* And print it */
set_color( get_color(HIGHLIGHT_PAGER_DESCRIPTION),
FISH_COLOR_IGNORE );
writespace( maxi( 2,
width[j]
- comp_width
- desc_width
- 4
- prefix_width
+ (j==cols-1?2:0) ) );
/* Print description */
writestr(L"(");
writestr_ellipsis( el_end+1, desc_width);
writestr(L")");
if( j != cols-1)
writestr( L" " );
}
el = (comp_t *)al_get( l, j*rows + i );
completion_print_item( prefix, el, width[j] - (is_last?0:2) );
if( !is_last)
writestr( L" " );
}
writech( L'\n' );
}
}
/**
Calculates how long the specified string would be when printed on the command line.
\param str The string to be printed.
\param is_quoted Whether the string would be printed quoted or unquoted
\param pref_width the preferred width for this item
\param min_width the minimum width for this item
*/
static void printed_length( wchar_t *str,
int is_quoted,
int *pref_width,
int *min_width )
{
if( is_quoted )
{
wchar_t *sep = wcschr(str,COMPLETE_SEP);
if( sep )
{
*sep=0;
int cw = my_wcswidth( str );
int dw = my_wcswidth(sep+1);
if( termsize.ws_col > 80 )
dw = mini( dw, termsize.ws_col/3 );
*pref_width = cw+dw+4;
if( dw > termsize.ws_col/3 )
{
dw = termsize.ws_col/3;
}
*min_width=cw+dw+4;
*sep= COMPLETE_SEP;
return;
}
else
{
*pref_width=*min_width= my_wcswidth( str );
return;
}
}
else
{
int comp_len=0, desc_len=0;
int has_description = 0;
while( *str != 0 )
{
if( ( *str >= ENCODE_DIRECT_BASE) &&
( *str < ENCODE_DIRECT_BASE+256) )
{
if( has_description )
desc_len+=4;
else
comp_len+=4;
}
else
{
switch( *str )
{
case L'\n':
case L'\b':
case L'\r':
case L'\e':
case L'\t':
case L'\\':
case L'&':
case L'$':
case L' ':
case L'#':
case L'^':
case L'<':
case L'>':
case L'(':
case L')':
case L'[':
case L']':
case L'{':
case L'}':
case L'?':
case L'*':
case L'|':
case L';':
case L':':
case L'\'':
case L'"':
case L'%':
case L'~':
if( has_description )
desc_len++;
else
comp_len+=2;
break;
case COMPLETE_SEP:
has_description = 1;
break;
default:
if( has_description )
desc_len+= wcwidth(*str);
else
comp_len+= wcwidth(*str);
break;
}
}
str++;
}
if( has_description )
{
/*
Mangle long descriptions to make formating look nicer
*/
debug( 3, L"Desc, width = %d %d\n", comp_len, desc_len );
// if( termsize.ws_col > 80 )
// desc_len = mini( desc_len, termsize.ws_col/3 );
*pref_width = comp_len+ desc_len+4;;
comp_len = mini( comp_len, maxi(0,termsize.ws_col/3 - 2));
desc_len = mini( desc_len, maxi(0,termsize.ws_col/5 - 4));
*min_width = comp_len+ desc_len+4;
return;
}
else
{
debug( 3, L"No desc, width = %d\n", comp_len );
*pref_width=*min_width= comp_len;
return;
}
}
}
/**
Try to print the list of completions l with the prefix prefix using
@@ -551,8 +419,6 @@ static int completion_try_print( int cols,
int pref_tot_width=0;
int min_tot_width = 0;
int prefix_width = my_wcswidth( prefix );
int res=0;
/*
Skip completions on tiny terminals
@@ -560,25 +426,24 @@ static int completion_try_print( int cols,
if( termsize.ws_col < 16 )
return 1;
memset( pref_width, 0, sizeof(pref_width) );
memset( min_width, 0, sizeof(min_width) );
/* Calculate how wide the list would be */
for( j = 0; j < cols; j++ )
{
for( i = 0; i<rows; i++ )
{
int pref,min;
wchar_t *el;
comp_t *c;
if( al_get_count( l ) <= j*rows + i )
continue;
el = (wchar_t *)al_get( l, j*rows + i );
printed_length( el, is_quoted, &pref, &min );
pref += prefix_width;
min += prefix_width;
c = (comp_t *)al_get( l, j*rows + i );
pref = c->pref_width;
min = c->min_width;
if( j != cols-1 )
{
pref += 2;
@@ -660,6 +525,7 @@ static int completion_try_print( int cols,
}
completion_print( cols, width, 0, rows, prefix, is_quoted, l);
pager_flush();
}
else
{
@@ -692,6 +558,7 @@ static int completion_try_print( int cols,
percent );
writestr(msg);
set_color( FISH_COLOR_NORMAL, FISH_COLOR_NORMAL );
pager_flush();
int c = readch();
switch( c )
@@ -753,7 +620,8 @@ static int completion_try_print( int cols,
}
else
{
writembs( flash_screen );
if( flash_screen )
writembs( flash_screen );
}
break;
@@ -777,7 +645,8 @@ static int completion_try_print( int cols,
}
else
{
writembs( flash_screen );
if( flash_screen )
writembs( flash_screen );
}
break;
}
@@ -805,7 +674,9 @@ static int completion_try_print( int cols,
}
/**
Substitute any series of tabs, newlines, etc. with a single space character in completion description
Substitute any series of whitespace with a single space character
inside completion descriptions. Remove all whitespace from
beginning/end of completion descriptions.
*/
static void mangle_descriptions( array_list_t *l )
{
@@ -843,6 +714,125 @@ static void mangle_descriptions( array_list_t *l )
}
}
/**
Merge multiple completions with the same description to the same line
*/
static void join_completions( array_list_t *l )
{
int i, in, out;
hash_table_t desc_table;
hash_init( &desc_table, &hash_wcs_func, &hash_wcs_cmp );
for( i=0; i<al_get_count(l); i++ )
{
wchar_t *item = (wchar_t *)al_get( l, i );
wchar_t *desc = wcschr( item, COMPLETE_SEP );
long prev_idx;
if( !desc )
continue;
desc++;
prev_idx = ((long)hash_get( &desc_table, desc) )-1;
if( prev_idx == -1 )
{
hash_put( &desc_table, halloc_wcsdup( global_context, desc), (void *)(i+1));
}
else
{
string_buffer_t foo;
wchar_t *old = (wchar_t *)al_get( l, prev_idx );
wchar_t *old_end = wcschr( old, COMPLETE_SEP );
if( old_end )
{
*old_end = 0;
sb_init( &foo );
sb_append( &foo, old );
sb_append_char( &foo, COMPLETE_ITEM_SEP );
sb_append( &foo, item );
free( (void *)al_get( l, prev_idx ) );
al_set( l, prev_idx, foo.buff );
free( (void *)al_get( l, i ) );
al_set( l, i, 0 );
}
// debug( 1, L"WOOT WOOT %ls är släkt med %ls", item, al_get( l, prev_idx ) );
}
}
hash_destroy( &desc_table );
out=0;
for( in=0; in < al_get_count(l); in++ )
{
const void * d = al_get( l, in );
if( d )
{
al_set( l, out++, d );
}
}
al_truncate( l, out );
}
/**
Replace completion strings with a comp_t structure
*/
static void mangle_completions( array_list_t *l, const wchar_t *prefix )
{
int i;
for( i=0; i<al_get_count( l ); i++ )
{
wchar_t *next = (wchar_t *)al_get( l, i );
wchar_t *start, *end;
comp_t *comp = halloc( global_context, sizeof( comp_t ) );
comp->comp = al_halloc( global_context );
for( start=end=next; 1; end++ )
{
wchar_t c = *end;
if( (c == COMPLETE_ITEM_SEP) || (c==COMPLETE_SEP) || !c)
{
*end = 0;
wchar_t * str = escape( start, 1 );
comp->comp_width += my_wcswidth( str );
halloc_register( global_context, str );
al_push( comp->comp, str );
start = end+1;
}
if( c == COMPLETE_SEP )
{
comp->desc = halloc_wcsdup( global_context, start );
break;
}
if( !c )
break;
}
comp->comp_width += my_wcswidth(prefix)*al_get_count(comp->comp) + 2*(al_get_count(comp->comp)-1);
comp->desc_width = comp->desc?my_wcswidth( comp->desc ):0;
comp->pref_width = comp->comp_width + comp->desc_width + (comp->desc_width?4:0);
free( next );
al_set( l, i, comp );
}
recalc_width( l, prefix );
}
/**
Respond to a winch signal by checking the terminal size
*/
@@ -887,9 +877,12 @@ static void init()
*/
sb_init( &out_buff );
output_init();
halloc_util_init();
env_universal_init( 0, 0, 0, 0);
input_common_init( &interrupt_handler );
output_set_writer( &pager_buffered_writer );
pager_buffer = halloc( global_context, sizeof( buffer_t ) );
halloc_register_function( global_context, (void (*)(void *))&b_destroy, pager_buffer );
sigemptyset( & act.sa_mask );
act.sa_flags=0;
@@ -914,6 +907,9 @@ static void init()
pager_modes.c_cc[VMIN]=1;
pager_modes.c_cc[VTIME]=0;
/*
*/
if( tcsetattr(0,TCSANOW,&pager_modes)) /* set the new modes */
{
wperror(L"tcsetattr");
@@ -932,49 +928,51 @@ void destroy()
{
env_universal_destroy();
input_common_destroy();
output_destroy();
halloc_util_destroy();
del_curterm( cur_term );
sb_destroy( &out_buff );
fclose( out_file );
}
int main( int argc, char **argv )
{
int i;
int is_quoted=0;
array_list_t comp;
array_list_t *comp;
wchar_t *prefix;
init();
if( argc < 3 )
{
debug( 0, L"Insufficient arguments" );
}
else
{
comp = al_halloc( global_context );
prefix = str2wcs( argv[2] );
is_quoted = strcmp( "1", argv[1] )==0;
is_quoted = 0;
debug( 3, L"prefix is '%ls'", prefix );
al_init( &comp );
for( i=3; i<argc; i++ )
{
wchar_t *wcs = str2wcs( argv[i] );
if( wcs )
{
al_push( &comp, wcs );
al_push( comp, wcs );
}
}
mangle_descriptions( comp );
if( wcscmp( prefix, L"-" ) == 0 )
join_completions( comp );
mangle_completions( comp, prefix );
mangle_descriptions( &comp );
for( i = 6; i>0; i-- )
{
switch( completion_try_print( i, prefix, is_quoted, &comp ) )
switch( completion_try_print( i, prefix, is_quoted, comp ) )
{
case 0:
break;
@@ -988,8 +986,6 @@ int main( int argc, char **argv )
}
al_foreach( &comp, (void(*)(const void *))&free );
al_destroy( &comp );
free(prefix );
fwprintf( out_file, L"%ls", (wchar_t *)out_buff.buff );

View File

@@ -4,6 +4,7 @@
#include "config.h"
#include <stdlib.h>
#include <stdio.h>
#include <wchar.h>
@@ -26,7 +27,9 @@
#include <locale.h>
#include <dirent.h>
#include "fallback.h"
#include "util.h"
#include "common.h"
#include "proc.h"
#include "reader.h"
@@ -41,6 +44,7 @@
#include "output.h"
#include "exec.h"
#include "event.h"
#include "halloc_util.h"
/**
Number of laps to run performance testing loop
@@ -327,7 +331,7 @@ static void sb_test()
sb_init( &b );
if( res=sb_printf( &b, L"%ls%s", L"Testing ", "string_buffer_t " ) == -1 )
if( (res=sb_printf( &b, L"%ls%s", L"Testing ", "string_buffer_t " )) == -1 )
{
err( L"Error %d while testing stringbuffers", res );
}
@@ -336,7 +340,22 @@ static void sb_test()
{
err( L"Error %d while testing stringbuffers", res );
}
say( (wchar_t *)b.buff );
sb_clear( &b );
#define NUM_ANS L"-7 99999999 1234567 deadbeef DEADBEEFDEADBEEF"
sb_printf( &b, L"%d %u %o %x %llX", -7, 99999999, 01234567, 0xdeadbeef, 0xdeadbeefdeadbeefll );
if( wcscmp( (wchar_t *)b.buff, NUM_ANS) != 0 )
{
err( L"numerical formating is broken, '%ls' != '%ls'", (wchar_t *)b.buff, NUM_ANS );
}
else
say( L"numerical formating works" );
}
/**
@@ -533,7 +552,7 @@ static int expand_test( const wchar_t *in, int flags, ... )
wchar_t *arg;
al_init( &out );
expand_string( wcsdup(in), &out, flags);
expand_string( 0, wcsdup(in), &out, flags);
va_start( va, flags );
@@ -669,7 +688,7 @@ int main( int argc, char **argv )
say( L"Lines beginning with '(ignore):' are not errors, they are warning messages\ngenerated by the fish parser library when given broken input, and can be\nignored. All actual errors begin with 'Error:'." );
proc_init();
output_init();
halloc_util_init();
event_init();
exec_init();
parser_init();
@@ -701,7 +720,7 @@ int main( int argc, char **argv )
wutil_destroy();
exec_destroy();
event_destroy();
output_destroy();
proc_destroy();
halloc_util_destroy();
}

View File

@@ -41,6 +41,7 @@ time the original barrier request was sent have been received.
#include "config.h"
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
@@ -61,7 +62,9 @@ time the original barrier request was sent have been received.
#include <locale.h>
#include <signal.h>
#include "fallback.h"
#include "util.h"
#include "common.h"
#include "wutil.h"
#include "env_universal_common.h"

View File

@@ -9,16 +9,22 @@
#include <signal.h>
#include "config.h"
#include "wutil.h"
#include "fallback.h"
#include "util.h"
#include "function.h"
#include "proc.h"
#include "translate.h"
#include "parser.h"
#include "common.h"
#include "intern.h"
#include "event.h"
#include "reader.h"
#include "parse_util.h"
#include "env.h"
#include "expand.h"
/**
@@ -33,6 +39,7 @@ typedef struct
const wchar_t *definition_file;
int definition_offset;
int is_binding;
int is_autoload;
}
function_data_t;
@@ -40,6 +47,79 @@ typedef struct
Table containing all functions
*/
static hash_table_t function;
static int is_autoload = 0;
/**
Make sure that if the specified function is a dynamically loaded
function, it has been fully loaded.
*/
static int load( const wchar_t *name )
{
int was_autoload = is_autoload;
int res;
function_data_t *data;
data = (function_data_t *)hash_get( &function, name );
if( data && !data->is_autoload )
return 0;
is_autoload = 1;
res = parse_util_load( name,
L"fish_function_path",
&function_remove,
1 );
is_autoload = was_autoload;
return res;
}
/**
Insert a list of all dynamically loaded functions into the
specified list.
*/
static void autoload_names( array_list_t *out, int get_hidden )
{
int i;
array_list_t path_list;
const wchar_t *path_var = env_get( L"fish_function_path" );
if( ! path_var )
return;
al_init( &path_list );
expand_variable_array( path_var, &path_list );
for( i=0; i<al_get_count( &path_list ); i++ )
{
wchar_t *ndir = (wchar_t *)al_get( &path_list, i );
DIR *dir = wopendir( ndir );
if( !dir )
continue;
struct wdirent *next;
while( (next=wreaddir(dir))!=0 )
{
wchar_t *fn = next->d_name;
wchar_t *suffix;
if( !get_hidden && fn[0] == L'_' )
continue;
suffix = wcsrchr( fn, L'.' );
if( suffix && (wcscmp( suffix, L".fish" ) == 0 ) )
{
const wchar_t *dup;
*suffix = 0;
dup = intern( fn );
if( !dup )
die_mem();
al_push( out, dup );
}
}
closedir(dir);
}
al_foreach( &path_list, (void (*)(const void *))&free );
al_destroy( &path_list );
}
/**
Free all contents of an entry to the function hash table
@@ -92,7 +172,8 @@ void function_add( const wchar_t *name,
d->desc = desc?wcsdup( desc ):0;
d->is_binding = is_binding;
d->definition_file = intern(reader_current_filename());
d->is_autoload = is_autoload;
hash_put( &function, intern(name), d );
for( i=0; i<al_get_count( events ); i++ )
@@ -104,20 +185,27 @@ void function_add( const wchar_t *name,
int function_exists( const wchar_t *cmd )
{
if( parser_is_reserved(cmd) )
return 0;
load( cmd );
return (hash_get(&function, cmd) != 0 );
}
void function_remove( const wchar_t *name )
{
void *key;
const void *dv;
function_data_t *d;
event_t ev;
hash_remove( &function,
name,
(const void **) &key,
(const void **)&d );
&dv );
d=(function_data_t *)dv;
if( !key )
return;
@@ -130,8 +218,9 @@ void function_remove( const wchar_t *name )
const wchar_t *function_get_definition( const wchar_t *argv )
{
function_data_t *data =
(function_data_t *)hash_get( &function, argv );
function_data_t *data;
load( argv );
data = (function_data_t *)hash_get( &function, argv );
if( data == 0 )
return 0;
return data->cmd;
@@ -139,18 +228,20 @@ const wchar_t *function_get_definition( const wchar_t *argv )
const wchar_t *function_get_desc( const wchar_t *argv )
{
function_data_t *data =
(function_data_t *)hash_get( &function, argv );
function_data_t *data;
load( argv );
data = (function_data_t *)hash_get( &function, argv );
if( data == 0 )
return 0;
return data->desc;
return _(data->desc);
}
void function_set_desc( const wchar_t *name, const wchar_t *desc )
{
function_data_t *data =
(function_data_t *)hash_get( &function, name );
function_data_t *data;
load( name );
data = (function_data_t *)hash_get( &function, name );
if( data == 0 )
return;
@@ -173,6 +264,8 @@ static void get_names_internal( const void *key,
void function_get_names( array_list_t *list, int get_hidden )
{
autoload_names( list, get_hidden );
if( get_hidden )
hash_get_keys( &function, list );
else
@@ -182,8 +275,9 @@ void function_get_names( array_list_t *list, int get_hidden )
const wchar_t *function_get_definition_file( const wchar_t *argv )
{
function_data_t *data =
(function_data_t *)hash_get( &function, argv );
function_data_t *data;
load( argv );
data = (function_data_t *)hash_get( &function, argv );
if( data == 0 )
return 0;
@@ -193,13 +287,12 @@ const wchar_t *function_get_definition_file( const wchar_t *argv )
int function_get_definition_offset( const wchar_t *argv )
{
function_data_t *data =
(function_data_t *)hash_get( &function, argv );
function_data_t *data;
load( argv );
data = (function_data_t *)hash_get( &function, argv );
if( data == 0 )
return -1;
return data->definition_offset;
}

View File

@@ -69,8 +69,15 @@ int function_exists( const wchar_t *name );
void function_get_names( array_list_t *list,
int get_hidden );
/**
Returns tha absolute path of the file where the specified function
was defined. Returns 0 if the file was defined on the commandline.
*/
const wchar_t *function_get_definition_file( const wchar_t *name );
/**
Returns the linenumber where the definition of the specified function started
*/
int function_get_definition_offset( const wchar_t *name );
#endif

163
halloc.c
View File

@@ -8,71 +8,166 @@
#include "config.h"
#include <stdlib.h>
#include <unistd.h>
#include "fallback.h"
#include "util.h"
#include "common.h"
#include "halloc.h"
#define HALLOC_BLOCK_SIZE 128
#define HALLOC_SCRAP_SIZE 16
#ifdef HALLOC_DEBUG
static int child_count=0;
static int child_size=0;
static int alloc_count =0;
static int alloc_spill = 0;
static pid_t pid=0;
static int parent_count=0;
#endif
typedef struct halloc
{
array_list_t children;
array_list_t hchildren;
void *scratch;
size_t scratch_free;
long long data[0];
}
halloc_t;
static halloc_t *halloc_from_data( void *data )
{
return (halloc_t *)(data - sizeof( halloc_t ) );
return (halloc_t *)(((char *)data) - sizeof( halloc_t ) );
}
static void late_free( void *data)
{
}
#ifdef HALLOC_DEBUG
static void woot()
{
if( getpid() == pid )
{
debug( 1, L"%d parents, %d children with average child size of %.2f bytes caused %d allocs, average spill of %.2f bytes",
parent_count, child_count, (double)child_size/child_count,
parent_count+alloc_count, (double)alloc_spill/(parent_count+alloc_count) );
}
}
#endif
void *halloc( void *context, size_t size )
{
{
halloc_t *me, *parent;
me = (halloc_t *)calloc( 1, sizeof(halloc_t) + size );
if( !me )
return 0;
al_init( &me->children );
if( context )
{
parent = halloc_from_data( context );
al_push( &parent->hchildren, &me->data );
}
{
void *res;
return &me->data;
}
#ifdef HALLOC_DEBUG
if( !child_count )
{
pid = getpid();
atexit( woot );
}
child_count++;
child_size += size;
#endif
parent = halloc_from_data( context );
if( size <= parent->scratch_free )
{
res = parent->scratch;
parent->scratch_free -= size;
parent->scratch = ((char *)parent->scratch)+size;
}
else
{
void *halloc_register( void *context, void *data )
{
halloc_t *me;
if( !context )
return data;
#ifdef HALLOC_DEBUG
alloc_count++;
#endif
if( parent->scratch_free < HALLOC_SCRAP_SIZE )
{
#ifdef HALLOC_DEBUG
alloc_spill += parent->scratch_free;
#endif
res = calloc( 1, size + HALLOC_BLOCK_SIZE );
parent->scratch = (char *)res + size;
parent->scratch_free = HALLOC_BLOCK_SIZE;
}
else
{
res = calloc( 1, size );
}
al_push( &parent->children, &late_free );
al_push( &parent->children, res );
}
return res;
me = halloc_from_data( context );
al_push( &me->children, data );
return data;
}
else
{
me = (halloc_t *)calloc( 1, sizeof(halloc_t) + size + HALLOC_BLOCK_SIZE );
if( !me )
return 0;
#ifdef HALLOC_DEBUG
parent_count++;
#endif
me->scratch = ((char *)me) + sizeof(halloc_t) + size;
me->scratch_free = HALLOC_BLOCK_SIZE;
al_init( &me->children );
return &me->data;
}
}
void halloc_free( void *context )
void halloc_register_function( void *context, void (*func)(void *), void *data )
{
halloc_t *me;
if( !context )
return;
me = halloc_from_data( context );
al_foreach( &me->hchildren, (void (*)(const void *))&halloc_free );
al_foreach( &me->children, (void (*)(const void *))&free );
al_destroy( &me->children );
al_destroy( &me->hchildren );
free(me);
al_push( &me->children, func );
al_push( &me->children, data );
}
void halloc_free( void *context )
{
halloc_t *me;
int i;
if( !context )
return;
me = halloc_from_data( context );
#ifdef HALLOC_DEBUG
alloc_spill += me->scratch_free;
#endif
for( i=0; i<al_get_count(&me->children); i+=2 )
{
void (*func)(void *) = (void (*)(void *))al_get( &me->children, i );
void * data = (void *)al_get( &me->children, i+1 );
if( func != &late_free )
func( data );
}
for( i=0; i<al_get_count(&me->children); i+=2 )
{
void (*func)(void *) = (void (*)(void *))al_get( &me->children, i );
void * data = (void *)al_get( &me->children, i+1 );
if( func == &late_free )
free( data );
}
al_destroy( &me->children );
free(me);
}

View File

@@ -1,35 +1,48 @@
/** \file halloc.h
A hierarchical memory allocation system. Works just like talloc
A hierarchical memory allocation system. Works mostly like talloc
used in Samba, except that an arbitrary block allocated with
malloc() can be registered to be freed by halloc_free.
*/
#ifndef FISH_HALLOC_H
#define FISH_HALLOC_H
/**
Allocate new memory using specified parent memory context. If \c
context is null, a new root context is created. Context _must_ be
either 0 or the result of a previous call to halloc.
Allocate new memory using specified parent memory context. Context
_must_ be either 0 or the result of a previous call to halloc.
If \c context is null, the resulting block must be freed with a
call to halloc_free().
If \c context is null, the resulting block is a root block, and
must be freed with a call to halloc_free().
If \c context is not null, the resulting memory block must never be
If \c context is not null, context must be a halloc root block. the
resulting memory block is a child context, and must never be
explicitly freed, it will be automatically freed whenever the
parent context is freed.
parent context is freed. Child blocks can also never be used as the
context in calls to halloc_register_function, halloc_free, etc.
*/
void *halloc( void *context, size_t size );
/**
Make the specified function run whenever context is free'd, using data as argument.
\c context a halloc root block
*/
void halloc_register_function( void *context, void (*func)(void *), void *data );
/**
Free memory context and all children contexts. Only root contexts
may be freed explicitly.
All functions registered with halloc_register_function are run in
the order they where added. Afterwards, all memory allocated using
halloc itself is free'd.
\c context a halloc root block
*/
void halloc_free( void *context );
/**
Free the memory pointed to by \c data when the memory pointed to by
\c context is free:d. Note that this will _not_ turn the specified
memory area into a valid halloc context. Only memory areas created
using a call to halloc() can be used as a context.
*/
void *halloc_register( void *context, void *data );
#endif

97
halloc_util.c Normal file
View File

@@ -0,0 +1,97 @@
/** \file halloc.c
A hierarchical memory allocation system. Works just like talloc
used in Samba, except that an arbitrary block allocated with
malloc() can be registered to be freed by halloc_free.
*/
#include "config.h"
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include "fallback.h"
#include "util.h"
#include "common.h"
#include "halloc.h"
void *global_context=0;
void halloc_util_init()
{
global_context = halloc( 0, 0 );
}
void halloc_util_destroy()
{
halloc_free( global_context );
}
array_list_t *al_halloc( void *context )
{
array_list_t *res = halloc( context, sizeof( array_list_t ) );
if( !res )
die_mem();
al_init( res );
halloc_register_function( context, (void (*)(void *)) &al_destroy, res );
return res;
}
string_buffer_t *sb_halloc( void *context )
{
string_buffer_t *res = halloc( context, sizeof( string_buffer_t ) );
if( !res )
die_mem();
sb_init( res );
halloc_register_function( context, (void (*)(void *)) &sb_destroy, res );
return res;
}
static void halloc_passthrough( void *f )
{
void (*func)() = (void (*)() )f;
func();
}
void halloc_register_function_void( void *context, void (*func)() )
{
halloc_register_function( context, &halloc_passthrough, (void *)func );
}
void *halloc_register( void *context, void *data )
{
if( !data )
return 0;
halloc_register_function( context, &free, data );
return data;
}
wchar_t *halloc_wcsdup( void *context, wchar_t *in )
{
size_t len=wcslen(in);
wchar_t *out = halloc( context, sizeof( wchar_t)*(len+1));
if( out == 0 )
{
die_mem();
}
memcpy( out, in, sizeof( wchar_t)*(len+1));
return out;
}
wchar_t *halloc_wcsndup( void * context, const wchar_t *in, int c )
{
wchar_t *res = halloc( context, sizeof(wchar_t)*(c+1) );
if( res == 0 )
{
die_mem();
}
wcslcpy( res, in, c+1 );
res[c] = L'\0';
return res;
}

66
halloc_util.h Normal file
View File

@@ -0,0 +1,66 @@
/**
\file halloc_util.h
Various halloc-related utility functions.
*/
#ifndef FISH_HALLOC_UTIL_H
#define FISH_HALLOC_UTIL_H
/**
This pointer is a valid halloc context that will be freed right
before program shutdown. It may be used to allocate memory that
should be freed when the program shuts down.
*/
extern void *global_context;
/**
Create the global_context halloc object
*/
void halloc_util_init();
/**
Free the global_context halloc object
*/
void halloc_util_destroy();
/**
Allocate a array_list_t that will be automatically disposed of when
the specified context is free'd
*/
array_list_t *al_halloc( void *context );
/**
Allocate a string_buffer_t that will be automatically disposed of
when the specified context is free'd
*/
string_buffer_t *sb_halloc( void *context );
/**
Register the specified function to run when the specified context
is free'd. This function is related to halloc_register_function,
but the specified function dowes not take an argument.
*/
void halloc_register_function_void( void *context, void (*func)() );
/**
Free the memory pointed to by \c data when the memory pointed to by
\c context is free:d. Note that this will _not_ turn the specified
memory area into a valid halloc context. Only memory areas created
using a call to halloc( 0, size ) can be used as a context.
*/
void *halloc_register( void *context, void *data );
/**
Make a copy of the specified string using memory allocated using
halloc and the specified context
*/
wchar_t *halloc_wcsdup( void *context, wchar_t *str );
/**
Make a copy of the specified substring using memory allocated using
halloc and the specified context
*/
wchar_t *halloc_wcsndup( void * context, const wchar_t *in, int c );
#endif

View File

@@ -12,7 +12,10 @@
#include <signal.h>
#include "config.h"
#include "fallback.h"
#include "util.h"
#include "wutil.h"
#include "highlight.h"
#include "tokenizer.h"
@@ -130,10 +133,10 @@ void highlight_shell( wchar_t * buff,
/*
Command. First check that the command actually exists.
*/
wchar_t *cmd =
(last_type == TOK_STRING) ?
expand_one(wcsdup(tok_last( &tok )),EXPAND_SKIP_SUBSHELL | EXPAND_SKIP_VARIABLES) :
wcsdup(tok_last( &tok ));
wchar_t *cmd = expand_one( 0,
wcsdup(tok_last( &tok )),
EXPAND_SKIP_SUBSHELL | EXPAND_SKIP_VARIABLES);
if( cmd == 0 )
{
color[ tok_get_pos( &tok ) ] = HIGHLIGHT_ERROR;
@@ -145,7 +148,6 @@ void highlight_shell( wchar_t * buff,
int is_subcommand = 0;
int mark = tok_get_pos( &tok );
color[ tok_get_pos( &tok ) ] = HIGHLIGHT_COMMAND;
if( parser_is_subcommand( cmd ) )
{
@@ -248,7 +250,7 @@ void highlight_shell( wchar_t * buff,
{
case TOK_STRING:
{
target = expand_one( wcsdup( tok_last( &tok ) ), EXPAND_SKIP_SUBSHELL);
target = expand_one( 0, wcsdup( tok_last( &tok ) ), EXPAND_SKIP_SUBSHELL);
/*
Redirect filename may contain a subshell.
If so, it will be ignored/not flagged.

View File

@@ -12,13 +12,17 @@
#include "config.h"
#include "fallback.h"
#include "util.h"
#include "wutil.h"
#include "history.h"
#include "common.h"
#include "reader.h"
#include "env.h"
#include "sanity.h"
#include "signal.h"
/*
The history is implemented using a linked list. Searches are done
@@ -102,7 +106,7 @@ static void history_load()
is_loaded = 1;
block();
signal_block();
hash_init2( &used,
&hash_wcs_func,
&hash_wcs_cmp,
@@ -124,7 +128,7 @@ static void history_load()
fclose( in_stream );
free( fn );
free( buff );
unblock();
signal_unblock();
return;
}
@@ -181,7 +185,7 @@ static void history_load()
free( buff );
free( fn );
last_loaded = history_last;
unblock();
signal_unblock();
}
void history_init()
@@ -198,6 +202,10 @@ static void history_to_hash()
{
history_data *d;
if( !history_last )
return;
d = (history_data *)hash_get( &history_table,
mode_name );
@@ -287,7 +295,7 @@ static void history_save()
history_count=0;
past_end=1;
history_load( mode_name );
history_load();
if( real_pos != 0 )
{
/*

View File

@@ -1,8 +0,0 @@
#apm
complete -f -c apm -s V -l version -d (_ "Display version and exit")
complete -f -c apm -s v -l verbose -d (_ "Print APM info")
complete -f -c apm -s m -l minutes -d (_ "Print time remaining")
complete -f -c apm -s M -l monitor -d (_ "Monitor status info")
complete -f -c apm -s S -l standby -d (_ "Request APM standby mode")
complete -f -c apm -s s -l suspend -d (_ "Request APM suspend mode")
complete -f -c apm -s d -l debug -d (_ "APM status debugging info")

View File

@@ -1,21 +0,0 @@
function __fish_complete_apropos
if test (commandline -ct)
set str (commandline -ct)
apropos $str|sed -e "s/^\(.*$str\([^ ]*\).*\)$/$str\2\t\1/"
end
end
complete -xc apropos -a '(__fish_complete_apropos)' -d (_ "whatis entry")
complete -c apropos -s h -l help -d (_ "Display help and exit")
complete -f -c apropos -s d -l debug -d (_ "Print debugging info")
complete -f -c apropos -s v -l verbose -d (_ "Verbose mode")
complete -f -c apropos -s r -l regex -d (_ "Keyword as regex")
complete -f -c apropos -s w -l wildcard -d (_ "Keyword as wildwards")
complete -f -c apropos -s e -l exact -d (_ "Keyword as exactly match")
complete -x -c apropos -s m -l system -d (_ "Search for other system")
complete -x -c apropos -s M -l manpath -a '(echo $MANPATH)' -d (_ "Specify man path")
complete -x -c apropos -s C -l config-file -d (_ "Specify a configuration file")
complete -f -c apropos -s V -l version -d (_ "Display version and exit")

View File

@@ -1,29 +0,0 @@
#apt-build
complete -c apt-build -l help -d (_ "Display help and exit")
complete -f -c apt-build -a update -d (_ "Update list of packages")
complete -f -c apt-build -a upgrade -d (_ "Upgrade packages")
complete -f -c apt-bulid -a world -d (_ "Rebuild your system")
complete -x -c apt-build -a install -d (_ "Build and install a new package")
complete -x -c apt-build -a source -d (_ "Download and extract a source")
complete -x -c apt-build -a info -d (_ "Info on a package")
complete -x -c apt-build -a remove -d (_ "Remove packages")
complete -x -c apt-build -a clean-build -d (_ "Erase built packages")
complete -x -c apt-build -a build-source -d (_ "Build source without install")
complete -x -c apt-build -a clean-sources -d (_ "Clean source directories")
complete -x -c apt-build -a update-source -d (_ "Update source and rebuild")
complete -x -c apt-build -a update-repository -d (_ "Update the repository")
complete -f -c apt-build -l nowrapper -d (_ "Do not use gcc wrapper")
complete -f -c apt-build -l remove-builddep -d (_ "Remove build-dep")
complete -f -c apt-build -l no-source -d (_ "Do not download source")
complete -f -c apt-build -l build-dir -d (_ "Specify build-dir")
complete -f -c apt-build -l rebuild -d (_ "Rebuild a package")
complete -f -c apt-build -l reinstall -d (_ "Rebuild and install an installed package")
complete -r -f -c apt-build -l build-command -d (_ "Use <command> to build")
complete -r -c apt-build -l patch -d (_ "Apply <file> patch")
complete -c apt-build -s p -l patch-strip -d (_ "Prefix to strip on patch")
complete -c apt-build -s y -l yes -d (_ "Assume yes to all questions")
complete -c apt-build -l purge -d (_ "Use purge instead of remove")
complete -c apt-build -l noupdate -d (_ "Do not run update")
complete -r -c apt-build -l source-list -d (_ "Specify sources.list file")
complete -f -c apt-build -s v -l version -d (_ "Display version and exit")

View File

@@ -1,31 +0,0 @@
#apt-cache
complete -c apt-cache -s h -l help -d (_ "Display help and exit")
complete -f -c apt-cache -a gencaches -d (_ "Build apt cache")
complete -x -c apt-cache -a showpkg -d (_ "Show package info")
complete -f -c apt-cache -a stats -d (_ "Show cache statistics")
complete -x -c apt-cache -a showsrc -d (_ "Show source package")
complete -f -c apt-cache -a dump -d (_ "Show packages in cache")
complete -f -c apt-cache -a dumpavail -d (_ "Print available list")
complete -f -c apt-cache -a unmet -d (_ "List unmet dependencies in cache")
complete -x -c apt-cache -a show -d (_ "Display package record")
complete -x -c apt-cache -a search -d (_ "Search packagename by REGEX")
complete -c apt-cache -l full -a search -d (_ "Search full package name")
complete -x -c apt-cache -l names-only -a search -d (_ "Search packagename only")
complete -x -c apt-cache -a depends -d (_ "List dependencies for the package")
complete -x -c apt-cache -a rdepends -d (_ "List reverse dependencies for the package")
complete -x -c apt-cache -a pkgnames -d (_ "Print package name by prefix")
complete -x -c apt-cache -a dotty -d (_ "Generate dotty output for packages")
complete -x -c apt-cache -a policy -d (_ "Debug preferences file")
complete -r -c apt-cache -s p -l pkg-cache -d (_ "Select file to store package cache")
complete -r -c apt-cache -s s -l src-cache -d (_ "Select file to store source cache")
complete -f -c apt-cache -s q -l quiet -d (_ "Quiet mode")
complete -f -c apt-cache -s i -l important -d (_ "Print important dependencies")
complete -f -c apt-cache -s a -l all-versions -d (_ "Print full records")
complete -f -c apt-cache -s g -l generate -d (_ "Auto-gen package cache")
complete -f -c apt-cache -l all-names -d (_ "Print all names")
complete -f -c apt-cache -l recurse -d (_ "Dep and rdep recursive")
complete -f -c apt-cache -l installed -d (_ "Limit to installed")
complete -f -c apt-cache -s v -l version -d (_ "Display version and exit")
complete -r -c apt-cache -s c -l config-file -d (_ "Specify config file")
complete -x -c apt-cache -s o -l option -d (_ "Specify options")

View File

@@ -1,13 +0,0 @@
#apt-cdrom
complete -c apt-cdrom -s h -l help -d (_ "Display help and exit")
complete -r -c apt-cdrom -a add -d (_ "Add new disc to source list")
complete -x -c apt-cdrom -a ident -d (_ "Report identity of disc")
complete -r -c apt-cdrom -s d -l cdrom -d (_ "Mount point")
complete -f -c apt-cdrom -s r -l rename -d (_ "Rename a disc")
complete -f -c apt-cdrom -s m -l no-mount -d (_ "No mounting")
complete -f -c apt-cdrom -s f -l fast -d (_ "Fast copy")
complete -f -c apt-cdrom -s a -l thorough -d (_ "Thorough package scan")
complete -f -c apt-cdrom -s n -l no-act -d (_ "No changes")
complete -f -c apt-cdrom -s v -l version -d (_ "Display version and exit")
complete -r -c apt-cdrom -s c -l config-file -d (_ "Specify config file")
complete -x -c apt-cdrom -s o -l option -d (_ "Specify options")

View File

@@ -1,7 +0,0 @@
#apt-config
complete -c apt-config -s h -l help -d (_ "Display help and exit")
complete -c apt-config -a shell -d (_ "Access config file from shell")
complete -f -c apt-config -a dump -d (_ "Dump contents of config file")
complete -f -c apt-config -s v -l version -d (_ "Display version and exit")
complete -r -c apt-config -s c -l config-file -d (_ "Specify config file")
complete -x -c apt-config -s o -l option -d (_ "Specify options")

View File

@@ -1,7 +0,0 @@
#apt-extracttemplates
complete -c apt-extracttemplates -s h -l help -d (_ "Display help and exit")
complete -r -c apt-extracttemplates -s t -d (_ "Set temp dir")
complete -r -c apt-extracttemplates -s c -d (_ "Specifiy config file")
complete -r -c apt-extracttemplates -s o -d (_ "Specify options")

View File

@@ -1,17 +0,0 @@
#apt-file
complete -c apt-file -s h -l help -d (_ "Display help and exit")
complete -x -c apt-file -a update -d (_ "Resync package contents from source")
complete -r -c apt-file -a search -d (_ "Search package containing pattern")
complete -r -c apt-file -a list -d (_ "List contents of a package matching pattern")
complete -x -c apt-file -a purge -d (_ "Remove all gz files from cache")
complete -r -c apt-file -s c -l cache -d (_ "Set cache dir")
complete -f -c apt-file -s v -l verbose -d (_ "Verbose mode")
complete -c apt-file -s d -l cdrom-mount -d (_ "Use cdrom-mount-point")
complete -f -c apt-file -s i -l ignore-case -d (_ "Do not expand pattern")
complete -f -c apt-file -s x -l regexp -d (_ "Pattern is regexp")
complete -f -c apt-file -s V -l version -d (_ "Display version and exit")
complete -f -c apt-file -s a -l architecture -d (_ "Set arch")
complete -r -c apt-file -s s -l sources-list -a "(ls /etc/apt)" -d (_ "Set sources.list file")
complete -f -c apt-file -s l -l package-only -d (_ "Only display package name")
complete -f -c apt-file -s F -l fixed-string -d (_ "Do not expand pattern")
complete -f -c apt-file -s y -l dummy -d (_ "Run in dummy mode")

View File

@@ -1,17 +0,0 @@
#apt-ftparchive
complete -c apt-ftparchive -s h -l help -d (_ "Display help and exit")
complete -f -c apt-ftparchive -a packages -d (_ "Generate package from source")
complete -f -c apt-ftparchive -a sources -d (_ "Generate source index file")
complete -f -c apt-ftparchive -a contents -d (_ "Generate contents file")
complete -f -c apt-ftparchive -a release -d (_ "Generate release file")
complete -f -c apt-ftparchive -a clean -d (_ "Remove records")
complete -f -c apt-ftparchive -l md5 -d (_ "Generate MD5 sums")
complete -f -c apt-ftparchive -s d -l db -d (_ "Use a binary db")
complete -f -c apt-ftparchive -s q -l quiet -d (_ "Quiet mode")
complete -f -c apt-ftparchive -l delink -d (_ "Perform delinking")
complete -f -c apt-ftparchive -l contents -d (_ "Perform contents generation")
complete -c apt-ftparchive -s s -l source-override -d (_ "Use source override")
complete -f -c apt-ftparchive -l readonly -d (_ "Make caching db readonly")
complete -f -c apt-ftparchive -s v -l version -d (_ "Display version and exit")
complete -r -c apt-ftparchive -s c -l config-file -d (_ "Use config file")
complete -r -c apt-ftparchive -s o -l option -d (_ "Set config options")

View File

@@ -1,64 +0,0 @@
#completion for apt-get
function __fish_apt_no_subcommand -d (_ 'Test if apt has yet to be given the subcommand')
for i in (commandline -opc)
if contains -- $i update upgrade dselect-upgrade dist-upgrade install remove source build-dep check clean autoclean
return 1
end
end
return 0
end
function __fish_apt_use_package -d (_ 'Test if apt command should have packages as potential completion')
for i in (commandline -opc)
if contains -- $i contains install remove build-dep
return 0
end
end
return 1
end
complete -c apt-get -n '__fish_apt_use_package' -a '(__fish_print_packages)' -d (_ 'Package')
complete -c apt-get -s h -l help -d (_ 'Display help and exit')
complete -f -n '__fish_apt_no_subcommand' -c apt-get -a 'update' -d (_ 'Update sources')
complete -f -n '__fish_apt_no_subcommand' -c apt-get -a 'upgrade' -d (_ 'Upgrade or install newest packages')
complete -f -n '__fish_apt_no_subcommand' -c apt-get -a 'dselect-upgrade' -d (_ 'Use with dselect front-end')
complete -f -n '__fish_apt_no_subcommand' -c apt-get -a 'dist-upgrade' -d (_ 'Distro upgrade')
complete -f -n '__fish_apt_no_subcommand' -c apt-get -a 'install' -d (_ 'Install one or more packages')
complete -f -n '__fish_apt_no_subcommand' -c apt-get -a 'remove' -d (_ 'Remove one or more packages')
complete -f -n '__fish_apt_no_subcommand' -c apt-get -a 'source' -d (_ 'Fetch source packages')
complete -f -n '__fish_apt_no_subcommand' -c apt-get -a 'build-dep' -d (_ 'Install/remove packages for dependencies')
complete -f -n '__fish_apt_no_subcommand' -c apt-get -a 'check' -d (_ 'Update cache and check dependencies')
complete -f -n '__fish_apt_no_subcommand' -c apt-get -a 'clean' -d (_ 'Clean local caches and packages')
complete -f -n '__fish_apt_no_subcommand' -c apt-get -a 'autoclean' -d (_ 'Clean packages no longer be downloaded')
complete -c apt-get -s d -l download-only -d (_ 'Download Only')
complete -c apt-get -s f -l fix-broken -d (_ 'Correct broken dependencies')
complete -c apt-get -s m -l fix-missing -d (_ 'Ignore missing packages')
complete -c apt-get -l no-download -d (_ 'Disable downloading packages')
complete -c apt-get -s q -l quiet -d (_ 'Quiet mode')
complete -c apt-get -s s -l simulate -d (_ 'Perform a simulation')
complete -c apt-get -s y -l assume-yes -d (_ 'Automatic yes to prompts')
complete -c apt-get -s u -l show-upgraded -d (_ 'Show upgraded packages')
complete -c apt-get -s V -l verbose-versions -d (_ 'Show full versions for packages')
complete -c apt-get -s b -l compile -d (_ 'Compile source packages')
complete -c apt-get -s b -l build -d (_ 'Compile source packages')
complete -c apt-get -l ignore-hold -d (_ 'Ignore package Holds')
complete -c apt-get -l no-upgrade -d (_ "Do not upgrade packages")
complete -c apt-get -l force-yes -d (_ 'Force yes')
complete -c apt-get -l print-uris -d (_ 'Print the URIs')
complete -c apt-get -l purge -d (_ 'Use purge instead of remove')
complete -c apt-get -l reinstall -d (_ 'Reinstall packages')
complete -c apt-get -l list-cleanup -d (_ 'Erase obsolete files')
complete -c apt-get -s t -l target-release -d (_ 'Control default input to the policy engine')
complete -c apt-get -l trivial-only -d (_ 'Only perform operations that are trivial')
complete -c apt-get -l no-remove -d (_ 'Abort if any packages are to be removed')
complete -c apt-get -l only-source -d (_ 'Only accept source packages')
complete -c apt-get -l diff-only -d (_ 'Download only diff file')
complete -c apt-get -l tar-only -d (_ 'Download only tar file')
complete -c apt-get -l arch-only -d (_ 'Only process arch-dependant build-dependencies')
complete -c apt-get -l allow-unauthenticated -d (_ 'Ignore non-authenticated packages')
complete -c apt-get -s v -l version -d (_ 'Display version and exit')
complete -r -c apt-get -s c -l config-file -d (_ 'Specify a config file')
complete -r -c apt-get -s o -l option -d (_ 'Set a config option')

View File

@@ -1,5 +0,0 @@
#apt-key
complete -r -c apt-key -a add -d (_ "Add a new key")
complete -f -c apt-key -a del -d (_ "Remove a key")
complete -f -c apt-key -a list -d (_ "List trusted keys")

View File

@@ -1,25 +0,0 @@
#apt-listbugs
complete -c apt-listbugs -s h -l help -d (_ "Display help and exit")
complete -f -c apt-listbugs -s s -l severity -a "critical grave" -d (_ "Set severity")
complete -f -c apt-listbugs -s T -l tag -d (_ "Tags you want to see")
complete -f -c apt-listbugs -s S -l stats -a "outstanding 'pending upload' resolved done open" -d (_ "Bug-status you want to see")
complete -f -c apt-listbugs -s l -l showless -d (_ "Ignore bugs in your system")
complete -f -c apt-listbugs -s g -l showgreater -d (_ "Ignore newer bugs than upgrade packages")
complete -f -c apt-listbugs -s D -l show-downgrade -d (_ "Bugs for downgrade packages")
complete -f -c apt-listbugs -s H -l hostname -a "osdn.debian.or.jp" -d (_ "Bug Tracking system")
complete -f -c apt-listbugs -s p -l port -d (_ "Specify port for web interface")
complete -f -c apt-listbugs -s R -l release-critical -d (_ "Use daily bug report")
complete -f -c apt-listbugs -s I -l index -d (_ "Use the raw index.db")
complete -f -c apt-listbugs -s X -l indexdir -d (_ "Specify index dir")
complete -f -c apt-listbugs -s P -l pin-priority -d (_ "Specify Pin-Priority value")
complete -f -c apt-listbugs -l title -d (_ "Specify the title of rss")
complete -f -c apt-listbugs -s f -l force-download -d (_ "Retrieve fresh bugs")
complete -f -c apt-listbugs -s q -l quiet -d (_ "Do not display progress bar")
complete -f -c apt-listbugs -s c -l cache-dir -a "/var/cache/apt-listbugs/" -d (_ "Specify local cache dir")
complete -f -c apt-listbugs -s t -l timer -d (_ "Specify the expire cache timer")
complete -c apt-listbugs -s C -l aptconf -d (_ "Specify apt config file")
complete -f -c apt-listbugs -s y -l force-yes -d (_ "Assume yes to all questions")
complete -f -c apt-listbugs -s n -l force-no -d (_ "Assume no to all questions")
complete -c apt-listbugs -a list -d (_ "List bugs from packages")
complete -c apt-listbugs -a rss -d (_ "List bugs in rss format")

View File

@@ -1,13 +0,0 @@
#apt-listchanges
complete -c apt-listchanges -l help -d (_ "Display help and exit")
complete -c apt-listchanges -l apt -d (_ "Read filenames from pipe")
complete -f -c apt-listchanges -s v -l verbose -d (_ "Verbose mode")
complete -f -c apt-listchanges -s f -l frontend -a "pager browser xterm-pager xterm-browser text mail none" -d (_ "Select frontend interface")
complete -r -f -c apt-listchanges -l email-address -d (_ "Specify email address")
complete -f -c apt-listchanges -s c -l confirm -d (_ "Ask confirmation")
complete -f -c apt-listchanges -s a -l all -d (_ "Display all changelogs")
complete -r -c apt-listchanges -l save_seen -d (_ "Avoid changelogs from db in named file")
complete -r -f -c apt-listchanges -l which -a "news changelogs both" -d (_ "Select display")
complete -f -c apt-listchanges -s h -l headers -d (_ "Insert header")
complete -f -c apt-listchanges -l debug -d (_ "Display debug info")
complete -r -c apt-listchanges -l profile -d (_ "Select an option profile")

View File

@@ -1,22 +0,0 @@
#apt-move
complete -c apt-move -a get -d (_ "Generate master file")
complete -c apt-move -a getlocal -d (_ "Alias for 'get'")
complete -f -c apt-move -a move -d (_ "Move packages to local tree")
complete -f -c apt-move -a delete -d (_ "Delete obsolete package files")
complete -f -c apt-move -a packages -d (_ "Build new local files")
complete -f -c apt-move -a fsck -d (_ "Rebuild index files")
complete -f -c apt-move -a update -d (_ "Move packages from cache to local mirror")
complete -f -c apt-move -a local -d (_ "Alias for 'move delete packages'")
complete -f -c apt-move -a localupdate -d (_ "Alias for 'update'")
complete -f -c apt-move -a mirror -d (_ "Download package missing from mirror")
complete -f -c apt-move -a sync -d (_ "Sync packages installed")
complete -f -c apt-move -a exclude -d 'test $LOCALDIR/.exclude file'
complete -c apt-move -a movefile -d (_ "Move file specified on commandline")
complete -f -c apt-move -a listbin -d (_ "List packages that may serve as input to mirrorbin or mirrorsource" )
complete -f -c apt-move -a mirrorbin -d (_ "Fetch package from STDIN")
complete -f -c apt-move -a mirrorsrc -d (_ "Fetch source package from STDIN")
complete -f -c apt-move -s a -d (_ "Process all packages")
complete -c apt-move -s c -d (_ "Use specific conffile")
complete -f -c apt-move -s f -d (_ "Force deletion")
complete -f -c apt-move -s q -d (_ "Suppresses normal output")
complete -f -c apt-move -s t -d (_ "Test run")

View File

@@ -1,10 +0,0 @@
#apt-proxy-import
complete -c apt-proxy-import -s h -l help -d (_ 'Display help and exit')
complete -f -c apt-proxy-import -s V -l version -d (_ 'Display version and exit')
complete -f -c apt-proxy-import -s v -l verbose -d (_ 'Verbose mode')
complete -f -c apt-proxy-import -s q -l quiet -d (_ 'No message to STDOUT')
complete -f -c apt-proxy-import -s r -l recursive -d (_ 'Recurse into subdir')
complete -r -c apt-proxy-import -s i -l import-dir -a '(ls -Fp|grep /$)' -d (_ 'Dir to import')
complete -r -c apt-proxy-import -s u -l user -a '(__fish_complete_users)' -d (_ 'Change to user')
complete -r -c apt-proxy-import -s d -l debug -d (_ 'Debug level[default 0]')

View File

@@ -1,13 +0,0 @@
#apt-rdepends
complete -c apt-rdepends -l help -d (_ "Display help and exit")
complete -f -c apt-rdepends -s b -l build-depends -d (_ "Show build dependencies")
complete -f -c apt-rdepends -s d -l dotty -d (_ "Generate a dotty graph")
complete -f -c apt-rdepends -s p -l print-state -d (_ "Show state of dependencies")
complete -f -c apt-rdepends -s r -l reverse -d (_ "List packages depending on")
complete -r -f -c apt-rdepends -s f -l follow -d (_ "Comma-separated list of dependancy types to follow recursively")
complete -r -f -c apt-rdepends -s s -l show -d (_ "Comma-separated list of dependancy types to show")
complete -r -f -c apt-rdepends -l state-follow -d (_ "Comma-separated list of package installation states to follow recursively")
complete -r -f -c apt-rdepends -l state-show -d (_ "Comma-separated list of package installation states to show")
complete -f -c apt-rdepends -l man -d (_ "Display man page")
complete -f -c apt-rdepends -l version -d (_ "Display version and exit")

View File

@@ -1,4 +0,0 @@
#apt-setup
complete -c apt-setup -a probe -d (_ "Probe a CD")
complete -c apt-setup -s N -d (_ "Run in noninteractive mode")

View File

@@ -1,10 +0,0 @@
#apt-show-source
complete -c apt-show-source -s h -l help -d (_ 'Display help and exit')
complete -r -c apt-show-source -l status-file -d (_ 'Read package from file') -f
complete -r -c apt-show-source -o stf -d (_ 'Read package from file') -f
complete -r -c apt-show-source -l list-dir -a '(ls -Fp .|grep /$) /var/lib/apt/lists' -d (_ 'Specify APT list dir')
complete -r -c apt-show-source -o ld -a '(ls -Fp .|grep /$) /var/lib/apt/lists' -d (_ 'Specify APT list dir')
complete -r -c apt-show-source -s p -l package -a '(apt-cache pkgnames)' -d (_ 'List PKG info')
complete -f -c apt-show-source -l version-only -d (_ 'Display version and exit')
complete -f -c apt-show-source -s a -l all -d (_ 'Print all source packages with version')
complete -f -c apt-show-source -s v -l verbose -d (_ 'Verbose mode')

View File

@@ -1,14 +0,0 @@
#apt-show-versions
complete -c apt-show-source -s h -l help -d (_ 'Display help and exit')
complete -r -c apt-show-versions -s p -l packages -a '(apt-cache pkgnames)' -d (_ 'Print PKG versions')
complete -f -c apt-show-versions -s r -l regex -d (_ 'Using regex')
complete -f -c apt-show-versions -s u -l upgradeable -d (_ 'Print only upgradeable packages')
complete -f -c apt-show-versions -s a -l allversions -d (_ 'Print all versions')
complete -f -c apt-show-versions -s b -l brief -d (_ 'Print package name/distro')
complete -f -c apt-show-versions -s v -l verbose -d (_ 'Print verbose info')
complete -f -c apt-show-versions -s i -l initialize -d (_ 'Init or update cache only')
complete -r -c apt-show-versions -l status-file -d (_ 'Read package from file')
complete -r -c apt-show-versions -o stf -d (_ 'Read package from file')
complete -r -c apt-show-versions -l list-dir -a '(ls -Fp .|grep /$) /var/lib/apt/lists /var/state/apt/lists' -d (_ 'Specify APT list dir')
complete -r -c apt-show-versions -o ld -a '(ls -Fp .|grep /$) /var/lib/apt/lists /var/state/apt/lists' -d (_ 'Specify APT list dir')

View File

@@ -1,7 +0,0 @@
#apt-sortpkgs
complete -c apt-sortpkgs -s h -l help -d (_ "Display help and exit")
complete -f -c apt-sortpkgs -s s -l source -d (_ "Use source index field")
complete -f -c apt-sortpkgs -s v -l version -d (_ "Display version and exit")
complete -r -c apt-sortpkgs -s c -l conf-file -d (_ "Specify conffile")
complete -r -f -c apt-sortpkgs -s o -l option -d (_ "Set config options")

View File

@@ -1,20 +0,0 @@
#apt-spy
complete -c apt-spy -s h -d (_ "Display help and exit")
complete -f -c apt-spy -s d -a "stable testing unstable" -d (_ "Debian distribution")
complete -f -c apt-spy -s a -a "Africa Asia Europe North-America Oceania South-America" -d (_ "Servers in the areas")
complete -c apt-spy -s c -d (_ "Conf file")
complete -f -c apt-spy -s e -d (_ "Finish after number of servers")
complete -c apt-spy -s f -d (_ "File to grab servers")
complete -c apt-spy -s i -d (_ "File as input")
complete -c apt-spy -s m -d (_ "Mirror-list file")
complete -c apt-spy -s o -d (_ "Output sources.list file")
complete -f -c apt-spy -s p -d (_ "Use proxy server")
complete -f -c apt-spy -s s -d (_ "Comma separated country list")
complete -f -c apt-spy -s t -d (_ "How long in sec to download")
complete -f -c apt-spy -s u -d (_ "Custom URL to get mirror list")
complete -c apt-spy -s w -d (_ "Write top servers to file")
complete -f -c apt-spy -s n -d (_ "Number of top servers")
complete -f -c apt-spy -a "update" -d (_ "Update mirror list")
complete -f -c apt-spy -s v -d (_ "Version number")

View File

@@ -1,24 +0,0 @@
#apt-src
complete -c apt-src -s h -l help -d (_ "Display help and exit")
complete -f -c apt-src -a "update" -d (_ "Update list of source packages")
complete -f -c apt-src -a "install" -d (_ "Install source packages")
complete -f -c apt-src -a "upgrade" -d (_ "Upgrade source packages")
complete -f -c apt-src -a "remove" -d (_ "Remove source packages")
complete -f -c apt-src -a "build" -d (_ "Build source packages")
complete -f -c apt-src -a "clean" -d (_ "Clean source packages")
complete -f -c apt-src -a "import" -d (_ "Detect known source tree")
complete -f -c apt-src -a "list" -d (_ "List installed source package\(s\)")
complete -f -c apt-src -a "location" -d (_ "Root source tree")
complete -f -c apt-src -a "version" -d (_ "Version of source package")
complete -f -c apt-src -a "name" -d (_ "Name of the source package")
complete -f -c apt-src -s b -l build -d (_ "Build source packages")
complete -f -c apt-src -s i -l installdebs -d (_ "Install after build")
complete -f -c apt-src -s p -l patch -d (_ "Patch local changes")
complete -r -c apt-src -s l -l location -d (_ "Specify a dir")
complete -c apt-src -s c -l here -d (_ "Run on current dir")
complete -f -c apt-src -l upstream-version -d (_ "Omit debian version")
complete -f -c apt-src -s k -l keep-built -d (_ "Do not del built files")
complete -f -c apt-src -s n -l no-delete-source -d (_ "Do not del source files")
complete -f -c apt-src -l version -d (_ "Source tree version")
complete -f -c apt-src -s q -l quiet -d (_ "Output to /dev/null")
complete -f -c apt-src -s t -l trace -d (_ "Output trace")

View File

@@ -1,10 +0,0 @@
#apt-zip-inst
complete -c apt-zip-inst -s h -l help -d (_ "Display help and exit")
complete -f -c apt-zip-inst -s V -l version -d (_ "Display version and exit")
complete -c apt-zip-inst -s m -l medium -d (_ "Removable medium")
complete -f -c apt-zip-inst -s a -l aptgetaction -a "dselect-upgrade upgrade dist-upgrade" -d (_ "Select an action")
complete -c apt-zip-inst -s p -l packages -d (_ "List of packages to install")
complete -f -c apt-zip-inst -s f -l fix-broken -d (_ "Fix broken option")
complete -c apt-zip-inst -l skip-mount -d (_ "Specify a non-mountpoint dir")

View File

@@ -1,13 +0,0 @@
#apt-zip-list
complete -c apt-zip-list -s h -l help -d (_ "Display help and exit")
complete -f -c apt-zip-list -s V -l version -d (_ "Display version and exit")
complete -c apt-zip-list -s m -l medium -d (_ "Removable medium")
complete -f -c apt-zip-list -s a -l aptgetaction -a "dselect-upgrade upgrade dist-upgrade" -d (_ "Select an action")
complete -c apt-zip-list -s p -l packages -d (_ "List of packages to install")
complete -f -c apt-zip-list -s f -l fix-broken -d (_ "Fix broken option")
complete -c apt-zip-list -l skip-mount -d (_ "Specify a non-mountpoint dir")
complete -c apt-zip-list -s M -l method -d (_ "Select a method")
complete -c apt-zip-list -s o -l options -a "tar restart" -d (_ "Specify options")
complete -c apt-zip-list -s A -l accept -a "http ftp" -d (_ "Accept protocols")
complete -c apt-zip-list -s R -l reject -a "http ftp" -d (_ "Reject protocols")

View File

@@ -1,11 +0,0 @@
#completion for arp
complete -c arp -s v -l verbose -d (_ "Verbose mode")
complete -c arp -s n -l numeric -d (_ "Numerical address")
complete -x -c arp -s H -l tw-type -a "ether arcnet pronet ax25 netrom" -d (_ "Class of hw type")
complete -c arp -s a -l display -x -a "(__fish_print_hostnames)" -d (_ "Show arp entries")
complete -x -c arp -s d -l delete -a "(__fish_print_hostnames)" -d (_ "Remove an entry for hostname")
complete -c arp -s D -l use-device -d (_ "Use hardware address")
complete -x -c arp -s i -l device -a "(__fish_print_interfaces)" -d (_ "Select interface")
complete -x -c arp -s s -l set -d (_ "Manually create ARP address") -a "(__fish_print_hostnames)"
complete -f -c arp -s f -l file -d (_ "Take addr from filename, default /etc/ethers")

View File

@@ -1,10 +0,0 @@
#at
complete -f -c at -s V -d (_ "Display version and exit")
complete -f -c at -s q -d (_ "Use specified queue")
complete -f -c at -s m -d (_ "Send mail to user")
complete -c at -s f -x -a "(__fish_complete_suffix (commandline -ct) '' 'At job')" -d (_ "Read job from file")
complete -f -c at -s l -d (_ "Alias for atq")
complete -f -c at -s d -d (_ "Alias for atrm")
complete -f -c at -s v -d (_ "Show the time")
complete -f -c at -s c -d (_ "Print the jobs listed")

View File

@@ -1,6 +0,0 @@
#atd
complete -f -c atd -s l -d (_ "Limiting load factor")
complete -f -c atd -s b -d (_ "Minimum interval in seconds")
complete -f -c atd -s d -d (_ "Debug mode")
complete -f -c atd -s s -d (_ "Process at queue only once")

View File

@@ -1,4 +0,0 @@
#atq
complete -f -c atq -s V -d (_ "Display version and exit")
complete -f -c atq -s q -d (_ "Use specified queue")

View File

@@ -1,2 +0,0 @@
#atrm
complete -f -c atrm -s V -d (_ "Display version and exit")

View File

@@ -1,9 +0,0 @@
# Completions for the binary calculator
complete -c bc -s i -l interactive -d (_ "Force interactive mode")
complete -c bc -s l -l math-lib -d (_ "Define math library")
complete -c bc -s w -l warn -d (_ "Give warnings for extensions to POSIX bc")
complete -c bc -s s -l standard -d (_ "Process exactly POSIX bc")
complete -c bc -s q -l quiet -d (_ "Do not print the GNU welcome")
complete -c bc -s v -l version -d (_ "Display version and exit")
complete -c bc -s h -l help -d (_ "Display help and exit")

View File

@@ -1,2 +0,0 @@
complete -y btdownloadheadless.py

View File

@@ -1,33 +0,0 @@
# Bittorrent commands
for i in btdownloadcurses.py btdownloadheadless.py;
complete -c $i -l max_uploads -x -d (_ "Maximum uploads at once")
complete -c $i -l keepalive_interval -x -d (_ "Number of seconds between keepalives")
complete -c $i -l download_slice_size -x -d (_ "Bytes per request")
complete -c $i -l request_backlog -x -d (_ "Requests per pipe")
complete -c $i -l max_message_length -x -d (_ "Maximum length prefix encoding")
complete -c $i -l ip -d (_ "IP to report to the tracker") -x -a "(__fish_print_addresses)"
complete -c $i -l minport -d (_ "Minimum port to listen to")
complete -c $i -l maxport -d (_ "Maximum port to listen to")
complete -c $i -l responsefile -r -d (_ "File for server response")
complete -c $i -l url -x -d (_ "URL to get file from")
complete -c $i -l saveas -r -d (_ "Local file target")
complete -c $i -l timeout -x -d (_ "Time to close inactive socket")
complete -c $i -l timeout_check_interval -x -d (_ "Time between checking timeouts")
complete -c $i -l max_slice_length -x -d (_ "Maximum outgoing slice length")
complete -c $i -l max_rate_period -x -d (_ "Maximum time to guess rate")
complete -c $i -l bind -x -d (_ "IP to bind to locally") -a "(__fish_print_addresses)"
complete -c $i -l display_interval -x -d (_ "Time between screen updates")
complete -c $i -l rerequest_interval -x -d (_ "Time to wait between requesting more peers")
complete -c $i -l min_peers -x -d (_ "Minimum number of peers to not do requesting")
complete -c $i -l http_timeout -x -d (_ "Number of seconds before assuming http timeout")
complete -c $i -l max_initiate -x -d (_ "Number of peers at which to stop initiating new connections")
complete -c $i -l max_allow_in -x -d (_ "Maximum number of connections to allow")
complete -c $i -l check_hashes -x -d (_ "Whether to check hashes on disk")
complete -c $i -l max_upload_rate -x -d (_ "Maximum kB/s to upload at")
complete -c $i -l snub_time -x -d (_ "Seconds to wait for data to come in before assuming choking")
complete -c $i -l spew -x -d (_ "Whether to display diagnostic info")
complete -c $i -l rarest_first_cutoff -x -d (_ "Number of downloads at which to switch from random to rarest first")
complete -c $i -l min_uploads -x -d (_ "Number of uploads to fill out to with optimistic unchokes")
complete -c $i -l report_hash_failiures -x -d (_ "Whether to inform the user that hash failures occur")
end;

View File

@@ -1,15 +0,0 @@
complete -c bunzip2 -x -a "(
__fish_complete_suffix (commandline -ct) .bz 'Compressed file'
__fish_complete_suffix (commandline -ct) .bz2 'Compressed file'
__fish_complete_suffix (commandline -ct) .tbz 'Compressed archive'
__fish_complete_suffix (commandline -ct) .tbz2 'Compressed archive'
)
"
complete -c bunzip2 -s c -l stdout -d (_ "Decompress to stdout")
complete -c bunzip2 -s f -l force -d (_ "Overwrite")
complete -c bunzip2 -s k -l keep -d (_ "Do not overwrite")
complete -c bunzip2 -s s -l small -d (_ "Reduce memory usage")
complete -c bunzip2 -s v -l verbose -d (_ "Print compression ratios")
complete -c bunzip2 -s L -l license -d (_ "Print license")
complete -c bunzip2 -s V -l version -d (_ "Display version and exit")

View File

@@ -1,19 +0,0 @@
complete -c bzip2 -s c -l stdout -d (_ "Compress to stdout")
complete -c bzip2 -s d -l decompress -x -a "(
__fish_complete_suffix (commandline -ct) .bz 'Compressed file'
__fish_complete_suffix (commandline -ct) .bz2 'Compressed file'
__fish_complete_suffix (commandline -ct) .tbz 'Compressed archive'
__fish_complete_suffix (commandline -ct) .tbz2 'Compressed archive'
)
"
complete -c bzip2 -s z -l compress -d (_ "Compress file")
complete -c bzip2 -s t -l test -d (_ "Check integrity")
complete -c bzip2 -s f -l force -d (_ "Overwrite")
complete -c bzip2 -s k -l keep -d (_ "Do not overwrite")
complete -c bzip2 -s s -l small -d (_ "Reduce memory usage")
complete -c bzip2 -s q -l quiet -d (_ "Supress errors")
complete -c bzip2 -s v -l verbose -d (_ "Print compression ratios")
complete -c bzip2 -s L -l license -d (_ "Print license")
complete -c bzip2 -s V -l version -d (_ "Display version and exit")
complete -c bzip2 -s 1 -l fast -d (_ "Small block size")
complete -c bzip2 -s 9 -l best -d (_ "Large block size")

View File

@@ -1,12 +0,0 @@
complete -c cat -s A -l show-all -d (_ "Escape all non-printing characters")
complete -c cat -s b -l number-nonblank -d (_ "Number nonblank lines")
complete -c cat -s e -d (_ "Escape non-printing characters except tab")
complete -c cat -s E -l show-ends -d (_ "Display \$ at end of line")
complete -c cat -s n -l number -d (_ "Number all lines")
complete -c cat -s s -l squeeze-blank -d (_ "Never more than single blank line")
complete -c cat -s t -d (_ "Escape non-printing characters except newline")
complete -c cat -s T -l show-tabs -d (_ "Escape tab")
complete -c cat -s v -d (_ "Escape non-printing except newline and tab")
complete -c cat -l help -d (_ "Display help and exit")
complete -c cat -l version -d (_ "Display version and exit")

View File

@@ -1,12 +0,0 @@
complete -c chgrp -s c -l changes -d (_ "Output diagnostic for changed files")
complete -c chgrp -l dereference -d (_ "Dereferense symbolic links")
complete -c chgrp -s h -l no-dereference -d (_ "Do not dereference symbolic links")
complete -c chgrp -l from -d (_ "Change from owner/group")
complete -c chgrp -s f -l silent -d (_ "Supress errors")
complete -c chgrp -l reference -d (_ "Use same owner/group as file") -r
complete -c chgrp -s R -l recursive -d (_ "Operate recursively")
complete -c chgrp -s v -l verbose -d (_ "Output diagnostic for every file")
complete -c chgrp -s h -l help -d (_ "Display help and exit")
complete -c chgrp -l version -d (_ "Display version and exit")
complete -c chgrp -d Group -a "(__fish_complete_groups)"

View File

@@ -1,12 +0,0 @@
complete -c chown -s c -l changes -d (_ "Output diagnostic for changed files")
complete -c chown -l dereference -d (_ "Dereferense symbolic links")
complete -c chown -s h -l no-dereference -d (_ "Do not dereference symbolic links")
complete -c chown -l from -d (_ "Change from owner/group")
complete -c chown -s f -l silent -d (_ "Supress errors")
complete -c chown -l reference -d (_ "Use same owner/group as file") -r
complete -c chown -s R -l recursive -d (_ "Operate recursively")
complete -c chown -s v -l verbose -d (_ "Output diagnostic for every file")
complete -c chown -s h -l help -d (_ "Display help and exit")
complete -c chown -l version -d (_ "Display version and exit")
complete -c chown -d (_ "Username") -a "(__fish_print_users):"
complete -c chown -d (_ "Username") -a "(echo (commandline -ct)|grep -o '.*:')(cat /etc/group |cut -d : -f 1)"

View File

@@ -1,12 +0,0 @@
complete -c commandline -s a -l append -d (_ "Add text to the end of the selected area")
complete -c commandline -s i -l insert -d (_ "Add text at cursor")
complete -c commandline -s r -l replace -d (_ "Replace selected part")
complete -c commandline -s j -l current-job -d (_ "Select job under cursor")
complete -c commandline -s p -l current-process -d (_ "Select process under cursor")
complete -c commandline -s t -l current-token -d (_ "Select token under cursor")
complete -c commandline -s b -l current-buffer -d (_ "Select entire command line (default)")
complete -c commandline -s c -l cut-at-cursor -d (_ "Only return that part of the command line before the cursor")
complete -c commandline -s f -l function -d (_ "Inject readline functions to reader")

View File

@@ -1,14 +0,0 @@
complete -c complete -s c -l command -d (_ "Command to add completion to") -r
complete -c complete -s p -l path -d (_ "Path to add completion to")
complete -c complete -s s -l short-option -d (_ "Posix-style option to complete")
complete -c complete -s l -l long-option -d (_ "GNU-style option to complete")
complete -c complete -s o -l old-option -d (_ "Old style long option to complete")
complete -c complete -s f -l no-files -d (_ "Do not use file completion")
complete -c complete -s r -l require-parameter -d (_ "Require parameter")
complete -c complete -s x -l exclusive -d (_ "Require parameter and do not use file completion")
complete -c complete -s a -l arguments -d (_ "A list of possible arguments")
complete -c complete -s d -l description -d (_ "Description of this completions")
complete -c complete -s u -l unauthorative -d (_ "Option list is not complete")
complete -c complete -s e -l erase -d (_ "Remove completion")
complete -c complete -s h -l help -d (_ "Display help and exit")
complete -c complete -s C -l do-complete -d (_ "Print all completions for the specified commandline")

View File

@@ -1,12 +0,0 @@
complete -c configure -s h -l help -x -a "short recursive" -d (_ "Display help and exit")
complete -c configure -s V -l version -d (_ "Display version and exit")
complete -c configure -s q -l quiet -d (_ "Quiet mode")
complete -c configure -l cache-file -f -d (_ "Cache test results in specified file")
complete -c configure -s C -l config-cache -d (_ "Cache test results in file config.cache")
complete -c configure -s n -l no-create -d (_ "Do not create output files")
complete -c configure -l srcdir -d (_ "Set source directory") -a "__fish_complete_directory (commandline -ct)" -x
complete -c configure -l prefix -d (_ "Architecture-independent install directory") -a "__fish_complete_directory (commandline -ct)" -x
complete -c configure -l exec-prefix -d (_ "Architecture-dependent install directory") -a "__fish_complete_directory (commandline -ct)" -x
complete -c configure -l build -d (_ "Configure for building on BUILD") -x
complete -c configure -l host -d (_ "Cross-compile to build programs to run on HOST") -x
complete -c configure -l target -d (_ "Configure for building compilers for TARGET") -x -u

View File

@@ -1,10 +0,0 @@
complete -c cut -s b -l bytes -x -d (_ "Output byte range")
complete -c cut -s c -l characters -x -d (_ "Output character range")
complete -c cut -s d -l delimiter -x -d (_ "Select field delimiter")
complete -c cut -s d -l fields -x -d (_ "Select fields")
complete -c cut -s n -d (_ "Dont split mutibyte characters")
complete -c cut -s s -l only-delimited -d (_ "Do not print lines without delimiter")
complete -c cut -l output-delimiter -d (_ "Select output delimiter")
complete -c cut -l help -d (_ "Display help and exit")
complete -c cut -l version -d (_ "Display version and exit")

View File

@@ -1,53 +0,0 @@
#
# I don't use CVS, so these completions are probably not all that good.
#
complete -c cvs -x -a 'add' -d (_ "Add a new file/directory to the repository")
complete -c cvs -x -a 'admin' -d (_ "Administration front end for rcs")
complete -c cvs -x -a 'annotate' -d (_ "Show last revision where each line was modified")
complete -c cvs -x -a 'checkout' -d (_ "Checkout sources for editing")
complete -c cvs -x -a 'commit' -d (_ "Check files into the repository")
complete -c cvs -x -a 'diff' -d (_ "Show differences between revisions")
complete -c cvs -x -a 'edit' -d (_ "Get ready to edit a watched file")
complete -c cvs -x -a 'editors' -d (_ "See who is editing a watched file")
complete -c cvs -x -a 'export' -d (_ "Export sources from CVS, similar to checkout")
complete -c cvs -x -a 'history' -d (_ "Show repository access history")
complete -c cvs -x -a 'import' -d (_ "Import sources into CVS, using vendor branches")
complete -c cvs -x -a 'init' -d (_ "Create a CVS repository if it doesnt exist")
complete -c cvs -x -a 'kserver' -d (_ "Kerberos server mode")
complete -c cvs -x -a 'log' -d (_ "Print out history information for files")
complete -c cvs -x -a 'login' -d (_ "Prompt for password for authenticating server")
complete -c cvs -x -a 'logout' -d (_ "Removes entry in .cvspass for remote repository")
complete -c cvs -x -a 'pserver' -d (_ "Password server mode")
complete -c cvs -x -a 'rannotate' -d (_ "Show last revision where each line of module was modified")
complete -c cvs -x -a 'rdiff' -d (_ "Create "patch" format diffs between releases")
complete -c cvs -x -a 'release' -d (_ "Indicate that a Module is no longer in use")
complete -c cvs -x -a 'remove' -d (_ "Remove an entry from the repository")
complete -c cvs -x -a 'rlog' -d (_ "Print out history information for a module")
complete -c cvs -x -a 'rtag' -d (_ "Add a symbolic tag to a module")
complete -c cvs -x -a 'server' -d (_ "Server mode")
complete -c cvs -x -a 'status' -d (_ "Display status information on checked out files")
complete -c cvs -x -a 'tag' -d (_ "Add a symbolic tag to checked out version of files")
complete -c cvs -x -a 'unedit' -d (_ "Undo an edit command")
complete -c cvs -x -a 'update' -d (_ "Bring work tree in sync with repository")
complete -c cvs -x -a 'version' -d (_ "Display version and exit")
complete -c cvs -x -a 'watch' -d (_ "Set watches")
complete -c cvs -x -a 'watchers' -d (_ "See who is watching a file")
complete -c cvs -x -s H -d (_ "Displays usage information for command")
complete -c cvs -x -s Q -d (_ "Cause CVS to be really quiet")
complete -c cvs -x -s q -d (_ "Cause CVS to be somewhat quiet")
complete -c cvs -x -s r -d (_ "Make checked-out files read-only")
complete -c cvs -x -s w -d (_ "Make checked-out files read-write (default)")
complete -c cvs -x -s n -d (_ "Do not change any files")
complete -c cvs -x -s t -d (_ "Show trace of program execution -- try with -n")
complete -c cvs -x -s v -d (_ "Display version and exit")
complete -c cvs -x -s T -r -d (_ "Use "tmpdir" for temporary files")
complete -c cvs -x -s e -r -d (_ "Use "editor" for editing log information")
complete -c cvs -x -s d -r -d (_ "Overrides $CVSROOT as the root of the CVS tree")
complete -c cvs -x -s f -d (_ "Do not use the ~/.cvsrc file")
complete -c cvs -x -s z -d (_ "Compression level for net traffic") -x -a '1 2 3 4 5 6 7 8 9'
complete -c cvs -x -s x -d (_ "Encrypt all net traffic")
complete -c cvs -x -s a -d (_ "Authenticate all net traffic")
complete -c cvs -x -s s -d (_ "Set CVS user variable") -x

View File

@@ -1,236 +0,0 @@
#
# Completions for the darcs VCS command
#
# Incomplete, the number of switches for darcs is _huge_
#
#
# Test if a non-switch argument has been given
#
function __fish_use_subcommand
set -l -- cmd (commandline -poc)
set -e cmd[1]
for i in $cmd
switch $i
case '-*'
continue
end
return 1
end
return 0
end
#
# If no subcommand has been specified, complete using all available subcommands
#
complete -c darcs -n '__fish_use_subcommand' -xa 'initialize\t"'(_ "Create new project")'"'
complete -c darcs -n '__fish_use_subcommand' -xa 'get\t"'(_ "Create a local copy of another repository")'"'
complete -c darcs -n '__fish_use_subcommand' -xa 'add\t"'(_ "Add one or more new files or directories")'"'
complete -c darcs -n '__fish_use_subcommand' -xa 'remove\t"'(_ "Remove one or more files or directories from the repository")'"'
complete -c darcs -n '__fish_use_subcommand' -xa 'mv\t"'(_ "Move/rename one or more files or directories")'"'
complete -c darcs -n '__fish_use_subcommand' -xa 'replace\t"'(_ "Replace a token with a new value for that token")'"'
complete -c darcs -n '__fish_use_subcommand' -xa 'record\t"'(_ "Save changes in the working copy to the repository as a patch")'"'
complete -c darcs -n '__fish_use_subcommand' -xa 'pull\t"'(_ "Copy and apply patches from another repository to this one")'"'
complete -c darcs -n '__fish_use_subcommand' -xa 'send\t"'(_ "Send by email a bundle of one or more patches")'"'
complete -c darcs -n '__fish_use_subcommand' -xa 'apply\t"'(_ "Apply patches (from an email bundle) to the repository")'"'
complete -c darcs -n '__fish_use_subcommand' -xa 'push\t"'(_ "Copy and apply patches from this repository to another one")'"'
complete -c darcs -n '__fish_use_subcommand' -xa 'whatsnew\t"'(_ "Display unrecorded changes in the working copy")'"'
complete -c darcs -n '__fish_use_subcommand' -xa 'changes\t"'(_ "Gives a changelog style summary of the repo history")'"'
complete -c darcs -n '__fish_use_subcommand' -xa 'unrecord\t"'(_ "Remove recorded patches without changing the working copy")'"'
complete -c darcs -n '__fish_use_subcommand' -xa 'amend-record\t"'(_ "Replace a recorded patch with a better version")'"'
complete -c darcs -n '__fish_use_subcommand' -xa 'revert\t"'(_ "Revert to the recorded version (safe the first time only)" )'"'
complete -c darcs -n '__fish_use_subcommand' -xa 'unrevert\t"'(_ "Undo the last revert (may fail if changes after the revert)")'"'
complete -c darcs -n '__fish_use_subcommand' -xa 'unpull\t"'(_ "Opposite of pull; unsafe if the patch is not in remote repo")'"'
complete -c darcs -n '__fish_use_subcommand' -xa 'rollback\t"'(_ "Record an inverse patch without changing the working copy" )'"'
complete -c darcs -n '__fish_use_subcommand' -xa 'tag\t"'(_ "Tag the contents of the repository with a version name")'"'
complete -c darcs -n '__fish_use_subcommand' -xa 'setpref\t"'(_ "Set a value for a preference (test, predist, ...)")'"'
complete -c darcs -n '__fish_use_subcommand' -xa 'diff\t"'(_ "Create a diff between two versions of the repository")'"'
complete -c darcs -n '__fish_use_subcommand' -xa 'annotate\t"'(_ "Display which patch last modified something")'"'
complete -c darcs -n '__fish_use_subcommand' -xa 'optimize\t"'(_ "Optimize the repository")'"'
complete -c darcs -n '__fish_use_subcommand' -xa 'check\t"'(_ "Check the repository for consistency")'"'
complete -c darcs -n '__fish_use_subcommand' -xa 'resolve\t"'(_ "Mark any conflicts to the working copy for manual resolution")'"'
complete -c darcs -n '__fish_use_subcommand' -xa 'dist\t"'(_ "Create a distribution tarball")'"'
complete -c darcs -n '__fish_use_subcommand' -xa 'trackdown\t"'(_ "Locate the most recent version lacking an error")'"'
complete -c darcs -n '__fish_use_subcommand' -xa 'repair\t"'(_ "Repair the corrupted repository")'"'
#
# These switches are universal
#
complete -c darcs -s h -l help -d (_ "Shows brief description of command and its arguments")
complete -c darcs -l disable -d (_ "Disable this command")
complete -c darcs -l repodir -d (_ "Specify the repository directory in which to run") -x -a '(__fish_complete_directory (commandline -ct))'
complete -c darcs -s v -l verbose -d (_ "Verbose mode")
complete -c darcs -l standard-verbosity -d (_ "Neither verbose nor quiet output")
#
# Here follows a huge list of subcommand-specific completions. These are incomplete.
#
set -l record_opt -c darcs -n 'contains record (commandline -poc)'
complete $record_opt -s m -l patch-name -d (_ "Name of patch") -x
complete $record_opt -s A -l author -d (_ "Specify author id") -x
complete $record_opt -l logfile -d (_ "Give patch name and comment in file") -r
complete $record_opt -s a -l all -d (_ "Answer yes to all patches")
complete $record_opt -s l -l look-for-adds -d (_ "In addition to modifications, look for files that are not boring, and thus are potentially pending addition")
complete $record_opt -l delete-logfile -d (_ "Delete the logfile when done")
complete $record_opt -l no-test -d (_ "Don't run the test script")
complete $record_opt -l test -d (_ "Run the test script")
complete $record_opt -l leave-test-directory -d (_ "Don't remove the test directory")
complete $record_opt -l remove-test-directory -d (_ "Remove the test directory")
complete $record_opt -l compress -d (_ "Create compressed patches")
complete $record_opt -l dont-compress -d (_ "Don't create compressed patches")
complete $record_opt -l pipe -d (_ "Expect to receive input from a pipe")
complete $record_opt -l interactive -d (_ "Prompt user interactively")
complete $record_opt -l ask-deps -d (_ "Ask for extra dependencies")
complete $record_opt -l no-ask-deps -d (_ "Don't ask for extra dependencies")
complete $record_opt -l edit-long-comment -d (_ "Edit the long comment by default")
complete $record_opt -l skip-long-comment -d (_ "Don't give a long comment")
complete $record_opt -l prompt-long-comment -d (_ "Prompt for whether to edit the long comment")
complete $record_opt -l ignore-times -d (_ "Don't trust the file modification times")
complete $record_opt -l dont-look-for-adds -d (_ "Don't look for any files or directories that could be added, and don't add them automatically")
set -l pull_opt -c darcs -n 'contains pull (commandline -poc)'
complete $pull_opt -s p -l patches -d (_ "Select patches matching REGEXP") -x
complete $pull_opt -s t -l tags -d (_ "Select tags matching REGEXP") -x
complete $pull_opt -s a -l all -d (_ "Answer yes to all patches")
complete $pull_opt -s s -l summary -d (_ "Summarize changes")
complete $pull_opt -s q -l quiet -d (_ "Suppress informational output")
complete $pull_opt -l matches -d (_ "Select patches matching PATTERN") -x
complete $pull_opt -l external-merge -d (_ "Use external tool to merge conflicts") -x
complete $pull_opt -l interactive -d (_ "Prompt user interactively")
complete $pull_opt -l compress -d (_ "Create compressed patches")
complete $pull_opt -l dont-compress -d (_ "Don't create compressed patches")
complete $pull_opt -l test -d (_ "Run the test script")
complete $pull_opt -l no-test -d (_ "Don't run the test script")
complete $pull_opt -l dry-run -d (_ "Don't actually take the action")
complete $pull_opt -l no-summary -d (_ "Don't summarize changes")
complete $pull_opt -l ignore-times -d (_ "Don't trust the file modification times")
complete $pull_opt -l no-deps -d (_ "Don't automatically fulfill dependencies")
complete $pull_opt -l set-default -d (_ "Set default repository [DEFAULT]")
complete $pull_opt -l no-set-default -d (_ "Don't set default repository")
complete $pull_opt -l set-scripts-executable -d (_ "Make scripts executable")
complete $pull_opt -l dont-set-scripts-executable -d (_ "Don't make scripts executable")
set -l apply_opt -c darcs -n 'contains apply (commandline -poc)'
complete $apply_opt -s a -l all -d (_ "Answer yes to all patches")
complete $apply_opt -l verify -d (_ "Verify that the patch was signed by a key in PUBRING") -r
complete $apply_opt -l verify-ssl -d (_ "Verify using openSSL with authorized keys from specified file") -r
complete $apply_opt -l sendmail-command -d (_ "Specify sendmail command") -r
complete $apply_opt -l reply -d (_ "Reply to email-based patch using FROM address") -x
complete $apply_opt -l cc -d (_ "Mail results to additional EMAIL(s). Requires --reply") -x
complete $apply_opt -l external-merge -d (_ "Use external tool to merge conflicts") -r
complete $apply_opt -l no-verify -d (_ "Don't verify patch signature")
complete $apply_opt -l ignore-times -d (_ "Don't trust the file modification times")
complete $apply_opt -l compress -d (_ "Create compressed patches")
complete $apply_opt -l dont-compress -d (_ "Don't create compressed patches")
complete $apply_opt -l interactive -d (_ "Prompt user interactively")
complete $apply_opt -l mark-conflicts -d (_ "Mark conflicts")
complete $apply_opt -l allow-conflicts -d (_ "Allow conflicts, but don't mark them")
complete $apply_opt -l dont-allow-conflicts -d (_ "Fail on patches that create conflicts [DEFAULT]")
complete $apply_opt -l no-test -d (_ "Don't run the test script")
complete $apply_opt -l test -d (_ "Run the test script")
complete $apply_opt -l happy-forwarding -d (_ "Forward unsigned messages without extra header")
complete $apply_opt -l leave-test-directory -d (_ "Don't remove the test directory")
complete $apply_opt -l remove-test-directory -d (_ "Remove the test directory")
complete $apply_opt -l set-scripts-executable -d (_ "Make scripts executable")
complete $apply_opt -l dont-set-scripts-executable -d (_ "Don't make scripts executable")
set -l check_opt -c darcs -n 'contains check (commandline -poc)'
complete $check_opt -s v -l verbose -d (_ "Verbose mode")
complete $check_opt -s q -l quiet -d (_ "Suppress informational output")
complete $check_opt -l complete -d (_ "Check the entire repository")
complete $check_opt -l partial -d (_ "Check patches since latest checkpoint")
complete $check_opt -l no-test -d (_ "Don't run the test script")
complete $check_opt -l test -d (_ "Run the test script")
complete $check_opt -l leave-test-directory -d (_ "Don't remove the test directory")
complete $check_opt -l remove-test-directory -d (_ "Remove the test directory")
set -l mv_opt -c darcs -n 'contains mv (commandline -poc)'
complete $mv_opt -s v -l verbose -d (_ "Verbose mode")
complete $mv_opt -l case-ok -d (_ "Don't refuse to add files differing only in case")
set -l send_opt -c darcs -n 'contains send (commandline -poc)'
complete $send_opt -s v -l verbose -d (_ "Verbose mode")
complete $send_opt -s q -l quiet -d (_ "Suppress informational output")
complete $send_opt -xs p -l patches -d (_ "Select patches matching REGEXP")
complete $send_opt -xs t -l tags -d (_ "Select tags matching REGEXP")
complete $send_opt -s a -l all -d (_ "Answer yes to all patches")
complete $send_opt -xs A -l author -d (_ "Specify author id")
complete $send_opt -rs o -l output -d (_ "Specify output filename")
complete $send_opt -s u -l unified -d (_ "Output patch in a darcs-specific format similar to diff -u")
complete $send_opt -s s -l summary -d (_ "Summarize changes")
complete $send_opt -xl matches -d (_ "Select patches matching PATTERN")
complete $send_opt -l interactive -d (_ "Prompt user interactively")
complete $send_opt -xl from -d (_ "Specify email address")
complete $send_opt -xl to -d (_ "Specify destination email")
complete $send_opt -xl cc -d (_ "Mail results to additional EMAIL(s). Requires --reply")
complete $send_opt -l sign -d (_ "Sign the patch with your gpg key")
complete $send_opt -xl sign-as -d (_ "Sign the patch with a given keyid")
complete $send_opt -rl sign-ssl -d (_ "Sign the patch using openssl with a given private key")
complete $send_opt -l dont-sign -d (_ "Do not sign the patch")
complete $send_opt -l dry-run -d (_ "Don't actually take the action")
complete $send_opt -l no-summary -d (_ "Don't summarize changes")
complete $send_opt -rl context -d (_ "Send to context stored in FILENAME")
complete $send_opt -l edit-description -d (_ "Edit the patch bundle description")
complete $send_opt -l set-default -d (_ "Set default repository [DEFAULT]")
complete $send_opt -l no-set-default -d (_ "Don't set default repository")
complete $send_opt -rl sendmail-command -d (_ "Specify sendmail command")
set -l init_opt -c darcs -n 'contains initialize (commandline -poc)'
complete $init_opt -l plain-pristine-tree -d (_ "Use a plain pristine tree [DEFAULT]")
complete $init_opt -l no-pristine-tree -d (_ "Use no pristine tree")
set -l annotate_opt -c darcs -n 'contains annotate (commandline -poc)'
complete $annotate_opt -s s -l summary -d (_ "Summarize changes")
complete $annotate_opt -l no-summary -d (_ "Don't summarize changes")
complete $annotate_opt -s u -l unified -d (_ "Output patch in a darcs-specific format similar to diff -u")
complete $annotate_opt -l human-readable -d (_ "Give human readable output")
complete $annotate_opt -l xml-output -d (_ "Generate XML formatted output")
complete $annotate_opt -l match -x -d (_ "Select patch matching PATTERN")
complete $annotate_opt -s p -l patch -x -d (_ "Select patch matching REGEXP")
complete $annotate_opt -s t -l tag -x -d (_ "Select tag matching REGEXP")
complete $annotate_opt -l creator-hash -x -d (_ "Specify hash of creator patch (see docs)")
set -l changes_opt -c darcs -n 'contains changes (commandline -poc)'
complete $changes_opt -l to-match -x -d (_ "Select changes up to a patch matching PATTERN")
complete $changes_opt -l to-patch -x -d (_ "Select changes up to a patch matching REGEXP")
complete $changes_opt -l to-tag -x -d (_ "Select changes up to a tag matching REGEXP")
complete $changes_opt -l from-match -x -d (_ "Select changes starting with a patch matching PATTERN")
complete $changes_opt -l from-patch -x -d (_ "Select changes starting with a patch matching REGEXP")
complete $changes_opt -l from-tag -x -d (_ "Select changes starting with a tag matching REGEXP")
complete $changes_opt -l last -x -d (_ "Select the last NUMBER patches")
complete $changes_opt -l matches -x -d (_ "Select patches matching PATTERN")
complete $changes_opt -s p -l patches -x -d (_ "Select patches matching REGEXP")
complete $changes_opt -s t -l tags -x -d (_ "Select tags matching REGEXP")
complete $changes_opt -l context -d (_ "Give output suitable for get --context")
complete $changes_opt -l xml-output -d (_ "Generate XML formatted output")
complete $changes_opt -l human-readable -d (_ "Give human-readable output")
complete $changes_opt -s s -l summary -d (_ "Summarize changes")
complete $changes_opt -l no-summary -d (_ "Don't summarize changes")
complete $changes_opt -s q -l quiet -d (_ "Suppress informational output")
complete $changes_opt -l reverse -d (_ "Show changes in reverse order")
complete $changes_opt -l repo -x -d (_ "Specify the repository URL")
set -l add_opt -c darcs -n 'contains add (commandline -poc)'
complete $add_opt -l boring -d (_ "Don't skip boring files")
complete $add_opt -l case-ok -d (_ "Don't refuse to add files differing only in case")
complete $add_opt -s r -l recursive -d (_ "Add contents of subdirectories")
complete $add_opt -l not-recursive -d (_ "Don't add contents of subdirectories")
complete $add_opt -l date-trick -d (_ "Add files with date appended to avoid conflict. [EXPERIMENTAL]")
complete $add_opt -l no-date-trick -d (_ "Don't use experimental date appending trick. [DEFAULT]")
complete $add_opt -s q -l quiet -d (_ "Suppress informational output")
complete $add_opt -l dry-run -d (_ "Don't actually take the action")
complete $add_opt -s q -l quiet -d (_ "Suppress informational output")

View File

@@ -1,11 +0,0 @@
complete -c date -s d -l date -d (_ "Display date described by string") -x
complete -c date -s f -l file -d (_ "Display date for each line in file") -r
complete -c date -s I -l iso-8601 -d (_ "Output in ISO 8601 format") -x -a "date hours minutes seconds"
complete -c date -s s -l set -d (_ "Set time") -x
complete -c date -s R -l rfc-2822 -d (_ "Output RFC-2822 compliant date string")
complete -c date -s r -l reference -d (_ "Display the last modification time of file") -r
complete -c date -s u -l utc -d (_ "Print or set Coordinated Universal Time")
complete -c date -l universal -d (_ "Print or set Coordinated Universal Time")
complete -c date -s h -l help -d (_ "Display help and exit")
complete -c date -s v -l version -d (_ "Display version and exit")

View File

@@ -1,43 +0,0 @@
#
# Completions for df
#
#
# Completions for mount define the $__fish_filesystems variable
#
complete -y mount
#
# Test if we are using GNU sed
#
set -l is_gnu
df --version >/dev/null ^/dev/null; and set is_gnu --is-gnu
__fish_gnu_complete -c df -s h -l human-readable -d (_ "Human readable sizes") $is_gnu
__fish_gnu_complete -c df -s i -l inodes -d (_ "List inode information") $is_gnu
__fish_gnu_complete -c df -s k -d (_ "Use 1kB block size") $is_gnu
__fish_gnu_complete -c df -s l -l local -d (_ "List only local filesystems") $is_gnu
__fish_gnu_complete -c df -s P -l portability -d (_ "Use Posix format") $is_gnu
__fish_gnu_complete -c df -s t -l type -r -d (_ "Show filesystems of specified type") $is_gnu -x -a $__fish_filesystems
if test -n "$is_gnu"
complete -c df -s a -l all -d (_ "Include empty filesystems")
complete -c df -s B -l block-size -r -d (_ "Block size")
complete -c df -s H -l si -d (_ "Human readable sizes, powers of 1000")
complete -c df -l no-sync -d (_ "Do not sync before getting usage info")
complete -c df -l sync -d (_ "Sync before getting usage info")
complete -c df -s T -l print-type -d (_ "Print filesystem type")
complete -c df -s x -l exclude-type -d (_ "Excluded filesystem type") -r -x -a $__fish_filesystems
complete -c df -l help -d (_ "Display help and exit")
complete -c df -l version -d (_ "Display version and exit")
else
complete -c df -s a -d (_ "Show all filesystems")
complete -c df -s g -d (_ "Show sizes in gigabytes")
complete -c df -s m -d (_ "Show sizes in megabytes")
complete -c df -s n -d (_ "Print out the previously obtained statistics from the file systems")
end

View File

@@ -1,26 +0,0 @@
# Completions for diff
complete -c diff -s i -l ignore-case -d (_ "Ignore case differences")
complete -c diff -l ignore-file-name-case -d (_ "Ignore case when comparing file names")
complete -c diff -l no-ignore-file-name-case -d (_ "Consider case when comparing file names")
complete -c diff -s E -l ignore-tab-expansion -d (_ "Ignore changes due to tab expansion")
complete -c diff -s b -l ignore-space-change -d (_ "Ignore changes in the amount of white space")
complete -c diff -s w -l ignore-all-space -d (_ "Ignore all white space")
complete -c diff -s B -l ignore-blank-lines -d (_ "Ignore changes whose lines are all blank")
complete -c diff -s I -l ignore-matching-lines -x -d (_ "Ignore changes whose lines match the REGEX")
complete -c diff -s a -l text -d (_ "Treat all files as text")
complete -c diff -s r -l recursive -d (_ "Recursively compare subdirectories")
complete -c diff -s N -l new-file -d (_ "Treat absent files as empty")
complete -c diff -s C -l context -x -d (_ "Output NUM lines of copied context")
complete -c diff -s c -d (_ "Output 3 lines of copied context")
complete -c diff -s U -l unified -x -d (_ "Output NUM lines of unified context")
complete -c diff -s u -d (_ "Output 3 lines of unified context")
complete -c diff -s q -l brief -d (_ "Output only whether the files differ")
complete -c diff -l normal -d (_ "Output a normal diff")
complete -c diff -s y -l side-by-side -d (_ "Output in two columns")
complete -c diff -s W -l width -x -d (_ "Output at most NUM print columns")
complete -c diff -s d -l minimal -d (_ "Try to find a smaller set of changes")
complete -c diff -l from-file -r -d (_ "Compare FILE1 to all operands")
complete -c diff -l to-file -r -d (_ "Compare FILE2 to all operands")
complete -c diff -s l -l paginate -d (_ "Pass the output through 'pr'")
complete -c diff -s v -l version -d (_ "Display version and exit")
complete -c diff -l help -d (_ "Display help and exit")

View File

@@ -1,20 +0,0 @@
complete -c du -s a -l all -d (_ "Write size for all files")
complete -c du -l apparent-size -d (_ "Print file size, not disk usage")
complete -c du -s B -l block-size -d (_ "Block size")
complete -c du -s b -l bytes -d (_ "Use 1B block size")
complete -c du -s c -l total -d (_ "Produce grand total")
complete -c du -s D -l dereference-args -d (_ "Dereference file symlinks")
complete -c du -s h -l human-readable -d (_ "Human readable sizes")
complete -c du -s H -l si -d (_ "Human readable sizes, powers of 1000")
complete -c du -s k -d (_ "Use 1kB block size")
complete -c du -s l -l count-links -d (_ "Count hard links multiple times")
complete -c du -s L -l dereference -d (_ "Dereference all symlinks")
complete -c du -s S -l separate-dirs -d (_ "Do not include subdirectory size")
complete -c du -s s -l summarize -d (_ "Display only a total for each argument")
complete -c du -s x -l one-file-system -d (_ "Skip other filesystems")
complete -c du -s X -l exclude-from -r -d (_ "Exclude files thet match pattern in file")
complete -c du -l exclude -r -d (_ "Exclude files that match pattern")
complete -c du -l max-depth -r -d (_ "Recursion limit")
complete -c du -l help -d (_ "Display help and exit")
complete -c du -l version -d (_ "Display version and exit")

View File

@@ -1,5 +0,0 @@
complete -c echo -s n -d (_ "No newline")
complete -c echo -s e -d (_ "Use backslash escaped characters")
complete -c echo -s E -d (_ "Do not use backslash escaped characters")
complete -c echo -l help -d (_ "Display help and exit")
complete -c echo -l version -d (_ "Display version and exit")

View File

@@ -1 +0,0 @@
complete -y tex

View File

@@ -1,10 +0,0 @@
#
# These completions are uncomplete
#
complete -c emacs -s q -d (_ "Do not load init files")
complete -c emacs -s u -d (_ "Load users init file") -xa "(__fish_complete_users)"
complete -c emacs -s t -d (_ "Use file as terminal") -r
complete -c emacs -s f -d (_ "Execute Lisp function") -x
complete -c emacs -s l -d (_ "Load Lisp code from file") -r
complete -c emacs -o nw -d (_ "Do not use X interface")
complete -uc emacs -s d -o display -d (_ "Create window on the specified display") -x

View File

@@ -1,68 +0,0 @@
#Completions for emerge
function __fish_emerge_use_package -d (_ 'Test if emerge command should have packages as potential completion')
for i in (commandline -opc)
if contains -- $i -a --ask -p --pretend --oneshot -O --nodeps -f --fetchonly
return 0
end
end
return 1
end
function __fish_emerge_manipulate_package -d (_ 'Tests if emerge command should have package as potential completion for removal')
for i in (commandline -opc)
if contains -- $i -u --update -C --unmerge -P --prune
return 0
end
end
return 1
end
function __fish_emerge_print_installed_pkgs -d (_ 'Prints completions for installed packages on the system from /var/db/pkg')
if test -d /var/db/pkg
find /var/db/pkg/ -type d | cut -d'/' -f6 | sort | uniq | sed 's/-[0-9]\{1,\}\..*$//'
return
end
end
complete -f -c emerge -n '__fish_emerge_use_package' -a '(__fish_print_packages)' -d (_ 'Package')
complete -f -c emerge -n '__fish_emerge_manipulate_package' -a '(__fish_emerge_print_installed_pkgs)' -d (_ 'Package')
complete -c emerge -s h -l help -d (_ "Display help and exit")
complete -c emerge -s c -l clean -d (_ "Cleans the system by removing outdated packages")
complete -c emerge -l depclean -d (_ "Cleans the system by removing packages that are not associated with explicitly merged packages")
complete -c emerge -l info -d (_ "Displays important portage variables that will be exported to ebuild.sh when performing merges")
complete -c emerge -l metadata -d (_ "Causes portage to process all the metacache files as is normally done on the tail end of an rsync update using emerge --sync")
complete -c emerge -s P -l prune -d (_ "Removes all but the most recently installed version of a package from your system")
complete -c emerge -l regen -d (_ "Causes portage to check and update the dependency cache of all ebuilds in the portage tree")
complete -c emerge -s s -l search -d (_ "Searches for matches of the supplied string in the current local portage tree")
complete -c emerge -s C -l unmerge -d (_ "Removes all matching packages completely from your system")
complete -c emerge -s a -l ask -d (_ "Before performing the merge, display what ebuilds and tbz2s will be installed, in the same format as when using --pretend")
complete -c emerge -s b -l buildpkg -d (_ "Tell emerge to build binary packages for all ebuilds processed in addition to actually merging the packages")
complete -c emerge -s B -l buildpkgonly -d (_ "Creates a binary package, but does not merge it to the system")
complete -c emerge -s l -l changelog -d (_ "When pretending, also display the ChangeLog entries for packages that will be upgraded")
complete -c emerge -l columns -d (_ "Display the pretend output in a tabular form")
complete -c emerge -s d -l debug -d (_ "Tell emerge to run the ebuild command in --debug mode")
complete -c emerge -s D -l deep -d (_ "When used in conjunction with --update, this flag forces emerge to consider the entire dependency tree of packages, instead of checking only the immediate dependencies of the packages")
complete -c emerge -s e -l emptytree -d (_ "Virtually tweaks the tree of installed packages to contain nothing")
complete -c emerge -s f -l fetchonly -d (_ "Instead of doing any package building, just perform fetches for all packages (main package as well as all dependencies)")
complete -c emerge -l fetch-all-uri -d (_ "Same as --fetchonly except that all package files, including those not required to build the package, will be processed")
complete -c emerge -s g -l getbinpkg -d (_ "Using the server and location defined in PORTAGE_BINHOST, portage will download the information from each binary file there and it will use that information to help build the dependency list")
complete -c emerge -s G -l getbinpkgonly -d (_ "This option is identical to -g, except it will not use ANY information from the local machine")
complete -c emerge -s N -l newuse -d (_ "Tells emerge to include installed packages where USE flags have changed since installation")
complete -c emerge -l noconfmem -d (_ "Merge files in CONFIG_PROTECT to the live fs instead of silently dropping them")
complete -c emerge -s O -l nodeps -d (_ "Merge specified packages, but don't merge any dependencies")
complete -c emerge -s n -l noreplace -d (_ "Skip the packages specified on the command-line that have already been installed")
complete -c emerge -l nospinner -d (_ "Disables the spinner regardless of terminal type")
complete -c emerge -l oneshot -d (_ "Emerge as normal, but don't add packages to the world profile")
complete -c emerge -s o -l onlydeps -d (_ "Only merge (or pretend to merge) the dependencies of the specified packages, not the packages themselves")
complete -c emerge -s p -l pretend -d (_ "Do not merge, display what ebuilds and tbz2s would have been installed")
complete -c emerge -s q -l quiet -d (_ "Reduced output from portage's displays")
complete -c emerge -l resume -d (_ "Resumes the last merge operation")
complete -c emerge -s S -l searchdesc -d (_ "Matches the search string against the description field as well the package's name")
complete -c emerge -l skipfirst -d (_ "Remove the first package in the resume list so that a merge may continue in the presence of an uncorrectable or inconsequential error")
complete -c emerge -s t -l tree -d (_ "Shows the dependency tree using indentation for dependencies")
complete -c emerge -s u -l update -d (_ "Updates packages to the best version available")
complete -c emerge -s k -l usepkg -d (_ "Tell emerge to use binary packages (from $PKGDIR) if they are available, thus possibly avoiding some time-consuming compiles")
complete -c emerge -s K -l usepkgonly -d (_ "Like --usepkg, except this only allows the use of binary packages, and it will abort the emerge if the package is not available at the time of dependency calculation")
complete -c emerge -s v -l verbose -d (_ "Increased or expanded display of content in portage's displays")
complete -c emerge -s V -l version -d (_ "Displays the currently installed version of portage along with other information useful for quick reference on a system")

View File

@@ -1 +0,0 @@
complete -y tex

View File

@@ -1,6 +0,0 @@
complete -c fish -s c -l "command" -d (_ "Run fish with this command")
complete -c fish -s h -l help -d (_ "Display help and exit")
complete -c fish -s v -l version -d (_ "Display version and exit")
complete -c fish -s i -l interactive -d (_ "Run in interactive mode")
complete -c fish -s l -l login -d (_ "Run in login mode")
complete -c fish -s p -l profile -d (_ "Output profiling information to specified file") -f

View File

@@ -1,8 +0,0 @@
complete -c function -s d -l description -d (_ "Set function description") -x
complete -c function -xa "(functions -n)" -d (_ "Function")
complete -c function -xa "(builtin -n)" -d (_ "Builtin")
complete -c function -s j -l on-job-exit -d (_ "Make the function a job exit event handler") -x
complete -c function -s p -l on-process-exit -d (_ "Make the function a process exit event handler") -x
complete -c function -s s -l on-signal -d (_ "Make the function a signal event handler") -x
complete -c function -s v -l on-variable -d (_ "Make the function a variable update event handler") -x
complete -c function -s b -l key-binding -d (_ "Allow dash (-) in function name")

View File

@@ -1,6 +0,0 @@
complete -c functions -s e -l erase -d (_ "Erase function") -x -a "(functions -n)"
complete -c functions -xa "(functions -na)" -d (_ "Function")
complete -c functions -s a -l all -d (_ "Show hidden functions")
complete -c functions -s h -l help -d (_ "Display help and exit")
complete -c functions -s d -l description -d (_ "Set function description") -x

Some files were not shown because too many files have changed in this diff Show More