Candide
-Candide
-About Candide
-Candide is an IRC bot written in Perl in pragma_'s spare time. -
-Trigger
-All of candide's commands may begin with its name or its trigger, or be followed by its name. -
The trigger character defaults to exclaimation mark [!]; the freenode instance uses a comma [,]. -
Note that commands need not be submitted to the channel; you can /msg it instead. If you /msg candide, - it will respond with a private message in return. In private message, -you do not need to specify its name or one of the trigger symbols. -
-Examples: - <pragma_> !hi (or ,hi if on freenode) - <pragma_> hi, candide - <pragma_> candide: hi --
Source
-Candide's source may be found at http://code.google.com/p/pbot2-pl/. It can be browsed at http://code.google.com/p/pbot2-pl/source/browse/#svn/trunk/.
-The URL for the source of any loaded modules may be found by using the factinfo command:
-
<pragma_> factinfo ##c faq - <candide> faq: Module loaded by pragma_ on Fri Dec 31 02:34:04 2004 -> - http://code.google.com/p/pbot2-pl/source/browse/trunk/modules/cfaq.pl, used 512 times (last by ecrane) --
Bot Channel
-You may test/play with the bot in the #pbot2 channel on irc.freenode.net. -
-Directing output to a user
-You may direct candide to prepend the nickname of a specific person -to a factoid in the channel by stating the nickname after the factoid -(if the factoid doesn't take arguments): -
-<pragma_> candide: version defrost - <candide> defrost: PBot revision 387 2012-10-07 --
tell
-You may also use the `tell <nick> about <command>` syntax (which is necessary if the factoid does take arguments): -
-<pragma_> candide: tell defrost about help cc - <candide> defrost: To learn all about cc, see http://www.iso-9899.info/wiki/Candide#cc --
Factoids
-List of factoids
-The most recent exported list of factoids can be found here: -http://www.iso-9899.info/candide/factoids.html. -
-Channel namespaces
-Factoids added in one channel may be called/triggered in another -channel or in private message, providing that the other channel doesn't -already have a factoid of the same name. -
Factoids may also be added to a special channel named .*. -Factoids that are set in this channel will be accessible to any channel, - including private messages. However, factoids that are set in a -specific channel will override factoids of the same name that are set in - the .* channel or other channels. -
For example, a factoid named 'malloc' set in ##c will be called -instead of 'malloc' set in .*, -if the factoid were triggered in ##c; otherwise, the latter 'malloc' -will be triggered if the factoid were triggered in another channel. -
Similiarily, if there were no 'malloc' factoid in the .* -namespace, but only in ##c and you attempted to use this factoid in a -channel other than ##c, that channel will invoke ##c's version of -'malloc', providing that channel doesn't have its own 'malloc' factoid. -
Likewise, if there is a 'malloc' factoid set in ##c++ and the factoid is triggered in the ##c++ channel, -then this version of 'malloc' will be called instead of the ##c or the .* factoid. -
However, if you are in a channel that doesn't have a 'malloc' -factoid and there is no 'malloc' factoid in the global .* channel, and -you attempt to call 'malloc' then the bot will display a message -notifying you that 'malloc' is ambiguous and which channels it belongs -to so that you may use the fact command to call the correct factoid. -
-Adding a factoid
-There are two ways to add a factoid. The first is: -
-<factoid> is <description> --
In this case, the factoid will be created as belonging to -the channel in which the command was executed. If this is done via private message, then the factoid will belong to the special .* channel. -
-factadd
-The second method allows you to add a factoid to any channel. This -method is suitable to add to a specific channel from a private message: -
-factadd <channel> <keyword> is <description> --
In this method, you may add factoids to any channel, including the special .* channel, which stands for all channels. -
Examples: -
-<pragma_> factadd ##c c is /say C rocks! - <pragma_> c is /say C rocks! --
Special commands
-/say
-If a factoid begins with "/say " then candide will not use -the "<factoid> is <description>" format when displaying the -factoid. -
-Example: - <pragma_> hi is /say Well, hello there, $nick. - <candide> 'hi' added. - <prec> candide, hi - <candide> Well, hello there, prec. --
/me
-If a factoid begins with "/me " then candide will ACTION the factoid. -
-Example: - <pragma_> bounce is /me bounces around. - <candide> 'bounce' added. - <pragma_> bounce - *candide bounces around. --
/call
-If a factoid begins with "/call " then candide will call an existing command. -
-Example: - <pragma_> boing is /call bounce - <candide> 'boing' added. - <pragma_> boing - *candide bounces around. --
/msg
-If a factoid begins with "/msg <nick> " then candide will /MSG the factoid -text to <nick> -
-Special variables
-Currently there are three special variables: -
-$nick
-$nick: expands to the nick of the caller --
$args
-$args: expands to any text following the keyword --
$channel
-$channel: expands to the name of the channel in which the command is used --
adlib list variables
-You may create a list of adlib words by using the normal factoid creation method. -Also note that multiple words can be surrounded with double quotes to constitute one element. -
-Example: - <pragma_> colors is red green blue "bright yellow" pink "dark purple" orange - <candide> 'colors' added --
Then you can instruct candide to pick a random word from this list to use in another factoid by -inserting the list as a variable. -
-Example: - <pragma_> sky is /say The sky is $colors. - <candide> 'sky' added. - <pragma_> sky - <candide> The sky is dark purple. - <pragma_> sky - <candide> The sky is green. --
A practical example, creating the RTFM trigger: -
-<pragma_> sizes is big large tiny small huge gigantic teeny - <candide> 'sizes' added. - <pragma_> attacks is whaps thwacks bashes smacks punts whacks - <candide> 'attacks' added. - <pragma_> rtfm is /me $attacks $args with a $sizes $colors manual. - <candide> 'rtfm' added. - <pragma_> rtfm mauke - * candide thwacks mauke with a big red manual. --
action_with_args
-You can use the factset command to -set a special factoid meta-data key named "action_with_args" to trigger -an alternate message if an argument has been supplied. -
-Example: - <pragma_> snack is /me eats a cookie. - <candide> 'snack' added. - <pragma_> factset #channel snack action_with_args /me gives $args a cookie. - <candide> [Factoids] (#channel) snack: 'action_with_args' set to '/me gives $args a cookie.' - <pragma_> snack - * candide eats a cookie. - <pragma_> snack orbitz - * candide gives orbitz a cookie. --
add_nick
-You can use the factset command to -set a special factoid meta-data key named "add_nick" to prepend the nick - of the caller to the output. This is mostly useful for modules. -
-Deleting a factoid
-factrem
-forget
-To remove a factoid, use the factrem or forget command. The syntax is: -
-factrem <channel> <keyword> - forget <channel> <keyword> --
Viewing/triggering a factoid
-To view or trigger a factoid, one merely issues its keyword as a command. -
-<pragma_> candide, c? - <candide> C rocks! --
Viewing/triggering another channel's factoid
-fact
-To view or trigger a factoid belonging to a specific channel, use the fact command: -
-fact <channel> <keyword> [arguments] --
Aliasing a factoid
-factalias
-To create an factoid that acts as an alias for a command, use the -'factalias' command or '<alias> is /call <command>'. -
-<newalias> is /call <command> --
The syntax for 'factalias' is: -
-factalias <channel> <new keyword> <command> --
Example: - <pragma_> book is /me points accusingly at $args, "Where is your book?!" - <candide> 'book' added. - <pragma_> book newbie - *candide points accusingly at newbie, "Where is your book?!" - <pragma_> rafb is /call book - <candide> 'rafb' added. - <pragma_> rafb runtime - *candide points accusingly at runtime, "Where is your book?!" --
Another example: - <pragma_> offtopic is /say In this channel, '$args' is off-topic. - <pragma_> offtopic C++ - <candide> In this channel, 'C++' is off-topic. - <pragma_> factalias ##c C++ offtopic C++ (or: C++ is /call offtopic C++) - <pragma_> C++ - <candide> In this channel, 'C++' is off-topic. --
Changing a factoid
-factchange
-To change a factoid, use the 'factchange' command: -
-Usage: factchange <channel> <keyword> s/<pattern>/<change to>/-
- <pragma_> c - <candide> C rocks! - <pragma_> factchange ##c c s/rocks/rules/ - <candide> c changed. - <pragma_> c - <candide> C rules! -
Note that the final argument is a Perl-style substitution regex. See 'man perlre'. -
-For instance, it is possible to append to a factoid by using: - 'factchange channel factoid s/$/text to append/' --
Likewise, you can prepend to a factoid by using: - 'factchange channel factoid s/^/text to prepend/' --
Alternatively, you may append to a factoid by using 'is also': -
-<pragma_> candide, c is also See FAQ at http://www.eskimo.com/~scs/C-faq/top.html - <candide> Changed: c is /say C rules! ; See FAQ at http://www.eskimo.com/~scs/C-faq/top.html --
factset
-To view or set factoid meta-data, such as owner, rate-limit, etc, use the 'factset' command. -
-Usage: factset <channel> <factoid> [<key> [value]] --
Omit <key> and <value> to list all the keys and values -for a factoid. Specify <key>, but omit <value> to see the -value for a specific key. -
-factunset
-To unset factoid meta-data, use the 'factunset' command. -
-Usage: factunset <channel> <factoid> <key> --
Finding a factoid
-factfind
-To search the database for a factoid, you may use the 'factfind' command. You may optionally -specify whether to narrow by channel and/or include factoid owner and/or last referenced by in the search. -
If there is only one match for the query, it will display that factoid, otherwise it will list all matches. -
-Usage: factfind [-channel channel] [-owner nick] [-by nick] [text] -Example: - <pragma_> candide, factfind cast - <candide> 3 factoids match: [##c] NULL casting dontcastmalloc --
Information about a factoid
-factinfo
-To get information about a factoid, such as who submitted it and when, use the 'factinfo' command: -
-factinfo <channel> <keyword> --
<pragma_> candide, factinfo ##c NULL - <candide> NULL: Factoid submitted by Major-Willard for all channels on Sat Jan 1 16:17:42 2005 - [5 years and 178 days ago], referenced 39 times (last by pragma_ on Sun Jun 27 04:40:32 2010 [5 seconds ago]) --
If the factoid has been submitted for the special .* channel, then it will be shown as 'submitted for all channels'. Otherwise, -it will be shown as 'submitted for #channel'. -
-factshow
-To see the factoid string literal, use the 'factshow' command: -
-factshow <channel> <keyword> --
<pragma_> factshow ##c hi - <candide> hi: /say $greetings, $nick. --
factset
-To view factoid meta-data, such as owner, rate-limit, etc, use the 'factset' command. -
-Usage: factset <channel> <factoid> [<key> [value]] --
Omit <key> and <value> to list all the keys and values -for a factoid. Specify <key>, but omit <value> to see the -value for a specific key. -
-count
-To see how many factoids and what percentage of the database <nick> has submitted, use the 'count' command: -
-<pragma_> count prec - <candide> prec has submitted 28 factoids out of 233 (12%) - <pragma_> count twkm - <candide> twkm has submitted 74 factoids out of 233 (31%) - <pragma_> count pragma - <candide> pragma has submitted 27 factoids out of 233 (11%) --
histogram
-To see a histogram of the top 10 factoid submitters, use the 'histogram' command: -
-<pragma_> histogram - <candide> 268 factoids, top 10 submitters: twkm: 74 (27%) Major-Willard: - 64 (23%) pragma_: 40 (14%) prec: 39 (14%) defrost: 14 (5%) - PoppaVic: 10 (3%) infobahn: 7 (2%) orbitz: 3 (1%) mauke: 3 - (1%) Tom^: 2 (1%) --
top20
-To see the top 20 most popular factoids, use the 'top20' command. -
-Commands
-To see all the currently available commands, use the list commands command. -
Some commands are: -
-Quotegrabs
-Table of quotegrabs
-A table of grabbed quotes can be found here: http://www.iso-9899.info/candide/quotegrabs.html -
-grab
-Grabs a message someone says, and adds it to the quotegrabs database. - You may grab multiple nicks/messages in one quotegrab by separating -the arguments with a plus sign (the nicks need not be different -- you -can grab multiple messages by the same nick by specifying a different -history for each grab). -
You can use the recall command to test the arguments before grabbing (please use a private message). -
-Usage: grab <nick> [history [channel]] - where [history] is an optional argument that is an integral index into the recent messages OR a regular expression used to search message contents; - e.g., to grab the 3rd most recent message for nick, use: grab nick 3 - OR to grab a message containing the text "pizza", use: grab nick pizza --
Examples: --
<bob> Clowns are scary. - <pragma-> grab bob clowns - <candide> Quote grabbed: 1: <bob> Clowns are scary. --
<alice> Please put that in the right place. - <bob> That's what she said! - <pragma-> grab alice place + bob said - <candide> Quote grabbed 2: <alice> Please put that in the right place. <bob> That's what she said! --
<charlie> I know a funny programming knock-knock joke. - <charlie> Knock knock! - <charlie> Race condition. - <charlie> Who's there? - <pragma-> grab charlie knock + charlie race + charlie there - <candide> Quote grabbed 3: <charlie> Knock knock! <charlie> Race condition. <charlie> Who's there? --
recall
-Recalls messages from the chat history and displays them with a relative time-stamp. -
Usage is identical to grab. -
-<pragma-> recall alice + bob - <candide> [20 seconds ago] <alice> Please put that in the right place. [8 seconds ago] <bob> That's what she said! --
getq
-Retrieves and displays a specific grabbed quote from the quotegrabs database. -
-Usage: getq <quote-id> --
rq
-Retrieves and displays a random grabbed quote from the quotegrabs database. You may filter by nick, channel and/or quote text. -
-Usage: rq [nick regex [channel regex [text regex]]] - rq <nick regex> [-channel <channel regex>] [-text <text regex>] --
delq
-Deletes a specific grabbed quote from the quotegrabs database. You -can only delete quotes you have grabbed unless you are logged in as an -admin. -
-Usage: delq <quote-id> --
Modules
-{}
-This is just an alias for the cc command. Can take an optional nick argument in front in order to address the output to said nick. -
-Example: - <pragma_> { puts("hello"); } - <candide> hello - <pragma_> somebody: { puts("hi"); } - <candide> somebody: hi --
cc
-Code compiler (and executor). This command will compile and execute -user-provided code in a number of languages, and then display the -compiler and/or program output. -
The program is executed within a gdb debugger instance, which may - be interacted with via the gdb macros described below or with the -gdb("command") function. -
The compiler and program are executed inside a virtual machine. -After each run, the virtual machine is restored to a previous state. No - system calls have been disallowed. You can write to and read from the -filesystem, provided you do it in the same program. The network cable -has been unplugged. You are free to write and test any code you like. -Have fun. -
Uses gcc 4.9.0 and gdb 7.7. -
-Usage
-Usage: cc [compiler options] [-paste] [-nomain] [-lang=<language>] <code> [-input=<stdin input>] - cc <run|undo|show|paste|copy|replace|prepend|append|remove|s/// [and ...]> - cc <diff> - [nick] { <same as above without the cc in front> } --
- You can pass any gcc compiler options. By default, -Wall -Wextra -std=c11 -pedantic are passed unless an option is specified. -
- The -paste option will pretty-format and paste the code/output - to a paste site and display the URL (useful to preserve newlines in -output, and to refer to line-numbers). -
- The -nomain flag will prevent the code from being wrapped with a main() function. -
- The -input=<stdin input> option provides STDIN input -(i.e., scanf(), getc(stdin), etc.); MUST be the last option after any -code (otherwise the code will be considered to be input). -
- The run, undo, show, replace, etc commands are part of interactive-editing. See below. -
- The diff command can be used to display the differences between the two most recent snippets. -
- You can use { } instead of cc; the options/flags/comments must - be inside the braces. Can take an optional nick argument in front in -order to address the output to said nick. -
Supported Languages
-The -lang option accepts the following languages: C, C99 and C11. -Alternatively, you may use the -std=<c89|gnu89|c99|gnu99|etc> -compiler option to specify which standard to follow. -
Support for additional languages coming soon. -
-Default Language
-The default language (e.g., without an explicit -lang or -std option) - is C11 pedantic; which is gcc -Wall -Wextra -std=c11 -pedantic. -
-Disallowed system calls
-None. The network cable has been unplugged. Other than that, anything goes. Have fun. -
-Program termination with no output
-If there is no output, information about the local variables will be displayed. -
-<pragma_> cc int x = 5, y = 16; x ^= y, y ^= x, x ^= y; - <candide> pragma_: <no output: x = 16; y = 5> --
<pragma_> cc #include <sys/utsname.h> struct utsname u; uname(&u); - <candide> pragma_: <no output: u = {sysname = "Linux", nodename = "compiler", release = "3.2.0-8-generic", version = "#15-Ubuntu SMP Wed Jan 11 13:57:44 UTC 2012", machine = "x86_64", __domainname = "(none)"}> --
Abnormal program termination
-If a signal is detected, the bot will display useful information. -
Example session: -
-< pragma_> ,cc char *p = 0; *p = 1; -< candide> pragma_: Program received signal 11 (SIGSEGV) at statement: *p = 1; <local variables: p = 0x0> --
< pragma_> ,cc void bang() { char *p = 0, s[] = "lol"; strcpy(p, s); } bang(); -< candide> pragma_: Program received signal 11 (SIGSEGV) in bang () at statement: strcpy(p, s); <local variables: p = 0x0, s = "lol"> --
< pragma_> ,cc int a = 2 / 0; -< candide> pragma_: [In function 'main': warning: division by zero] Program received signal 8 (SIGFPE) at statement: int a = 2 / 0; --
C and C++ Functionality
-Using the preprocessor
-Default #includes
-These are the default includes for C11. To get the most up-to-date list of #includes, use the `cc paste` command. -
-#define _XOPEN_SOURCE 9001 -#define __USE_XOPEN -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <math.h> -#include <limits.h> -#include <sys/types.h> -#include <stdint.h> -#include <stdbool.h> -#include <stddef.h> -#include <stdarg.h> -#include <stdnoreturn.h> -#include <stdalign.h> -#include <ctype.h> -#include <inttypes.h> -#include <float.h> -#include <errno.h> -#include <time.h> -#include <assert.h> -#include <complex.h> --
Using #include
-In C and C++, you may #include <file.h> one after another on -the same line. The bot will automatically put them on separate lines. -If you do use #include, the files you specify will replace the default -includes. You do not need to append a \n after the #include. -
-<pragma_> cc #include <sys/utsname.h> struct utsname u; uname(&u); -<candide> pragma_: <no output: u = {sysname = "Linux", nodename = "compiler", release = "3.2.0-8-generic", version = "#15-Ubuntu SMP Wed Jan 11 13:57:44 UTC 2012", machine = "x86_64", __domainname = "(none)"}> --
<pragma_> cc #include <stdio.h> #include <stdlib.h> void func(void) { puts("Hello, world"); } func(); -<candide> pragma_: Hello, World --
In the previous examples, only the specified includes (e.g., -<sys/utsname.h> in the first example, <stdio.h> and -<stdlib.h> in the second, will be included instead of the default -includes. -
-Using #define
-You can also #define macros; however, #defines require an explicit -"\n" sequence to terminate, otherwise the remainder of the line will be -part of the macro. -
-<pragma_> cc #define GREETING "Hello, World"\n puts(GREETING); -<candide> pragma_: Hello, World --
main() Function Unnecessary
-In C and C++, if there is no main function, then a main function will - created and wrapped around the appropriate bits of your code (unless -the -nomain flag was specified); anything outside of any functions, -excluding preprocessor stuff, will be put into this new main function. -Here's an example: -
-<pragma_> cc -paste int add(int a, int b) { return a + b; } printf("4 + 6 = %d -- ", add(4, 6)); int add3(int a, int b, int c) - { return add(a, b) + c; } printf("7 + 8 + 9 = %d", add3(7, 8, 9)); - <candide> http://sprunge.us/ehRA?c --
The -paste flag causes the code to be pretty-formatted and pasted -with output in comments to a paste site, which displays the following: -
-#define _XOPEN_SOURCE 9001 -#define __USE_XOPEN -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <math.h> -#include <limits.h> -#include <sys/types.h> -#include <stdint.h> -#include <stdbool.h> -#include <stddef.h> -#include <stdarg.h> -#include <stdnoreturn.h> -#include <stdalign.h> -#include <ctype.h> -#include <inttypes.h> -#include <float.h> -#include <errno.h> -#include <time.h> -#include <assert.h> -#include <complex.h> -#include <prelude.h> - - -int add(int a, int b) { - return a + b; -} - -int add3(int a, int b, int c) { - return add(a, b) + c; -} - -int main(void) { - printf("4 + 6 = %d -- ", add(4, 6)); - - printf("7 + 8 + 9 = %d", add3(7, 8, 9)); - return 0; -} - -/************* OUTPUT ************* -4 + 6 = 10 -- 7 + 8 + 9 = 24 -************** OUTPUT *************/ --
Embedding Newlines
-In Assembler, you may start a newline in the code via a \n sequence or a semi-colon. -
In C and C++, #defines must be terminated by a \n sequence. -
In all other languages, you may embed a newline in the code by using |n. Yes, that's the pipe character followed by 'n'. -
-Printing in binary/base2
-A freenode ##c regular, Wulf, has provided a printf format specifier 'b' which can be used to print values in base2. -
-<Wulf> cc printf("%b", 1234567); - <candide> 000100101101011010000111 --
<Wulf> cc printf("%#'b", 1234567); - <candide> 0001.0010.1101.0110.1000.0111 --
Using the GDB debugger
-The program is executed within a gdb debugger instance, which may be interacted with via the following gdb macros. -
-The print() macro prints the values of expressions. Useful for printing out structures and arrays. -
-<pragma_> cc int a[] = { 1, 2, 3 }; print(a); -<candide> pragma_: <a = {1, 2, 3}> --
<pragma_> cc #include <sys/utsname.h> struct utsname u; uname(&u); print(u); -<candide> pragma_: <u = {sysname = "Linux", nodename = "compiler", release = "3.2.0-8-generic", version = "#15-Ubuntu SMP Wed Jan 11 13:57:44 UTC 2012", machine = "x86_64", __domainname = "(none)"}> --
<pragma_> cc print(sizeof(int)); -<candide> pragma_: <sizeof(int) = 4> --
<pragma_> cc print(2+2); -<candide> pragma_: <2 + 2 = 4> --
ptype
-The ptype() macro prints the types of expressions. -
-<pragma_> cc int *a[] = {0}; ptype(a); ptype(a[0]); ptype(*a[0]); - <candide> pragma_: <a = int *[1]> <a[0] = int *> <*a[0] = int> --
watch
-The watch() macro watches a variable and displays its value when it changes. -
-<pragma_> cc int n = 0, last = 1; watch(n); while(n <= 7000) { n += last; last = n - last; } /* fibonacci */ -<candide> pragma_: <n = 1> <n = 2> <n = 3> <n = 5> <n = 8> <n = 13> <n = 21> <n = 34> <n = 55> <n = 89> <n = 144> <n = 233> <n = 377> <n = 610> <n = 987> <n = 1597> <n = 2584> <n = 4181> <n = 6765> <n = 10946> --
trace
-The trace() macro traces a function's calls, displaying passed and returned values. -
-<pragma_> ,cc trace(foo); char *foo(int n) { puts("Hello, world"); return "Good-bye, world"; } foo(42); - <candide> pragma_: <entered [1] foo (n=42)> - Hello, world - <leaving [1] foo (n=42), returned 0x401006 "Good-bye, world"> --
<pragma_> ,cc int fib2(int n, int p0, int p1) { return n == 1 ? p1 : fib2(n - 1, p1, p0 + p1); } - int fib(int n) { return n == 0 ? 0 : fib2(n, 0, 1); } - trace(fib); trace(fib2); for(int i = 0; i < 20; i++) printf("%d ", fib(i)); - <candide> pragma_: <entered [1] fib (n=0)> - <leaving [1] fib (n=0), returned 0> - 1 - <entered [1] fib (n=2)> - <entered [2] fib2 (n=2, p0=0, p1=1)> - <entered [3] fib2 (n=1, p0=1, p1=1)> - <leaving [3] fib2 (n=1, p0=1, p1=1), returned 1> - <leaving [2] fib2 (n=2, p0=0, p1=1), returned 1> - <leaving [1] fib (n=2), returned 1> - 1 - <entered [1] fib (n=3)> - <entered [2] fib2 (n=3, p0=0, p1=1)> - <entered [3] fib2 (n=2, p0=1, p1=1)> - <entered [4] fib2 (n=1, p0=1, p1=2)> - <leaving [4] fib2 (n=1, p0=1, p1=2), returned 2> - <leaving [3] fib2 (n=2, p0=1, p1=1), returned 2> - <leaving [2] fib2 (n=3, p0=0, p1=1), returned 2> - <leaving [1] fib (n=3), returned 2> - 2 - <entered [1] fib (n=4)> - <entered [2] fib2 (n=4, p0=0, p1=1)> - <entered [3] fib2 (n=3, p0=1, p1=1)> - <entered [4] fib2 (n=2, p0=1, p1=2)> - <entered [5] fib2 (n=1, p0=2, p1=3)> - <leaving [5] fib2 (n=1, p0=2, p1=3), returned 3> - <leaving [4] fib2 (n=2, p0=1, p1=2), returned 3> - <leaving [3] fib2 (n=3, p0=1, p1=1), returned 3> - <leaving [2] fib2 (n=4, p0=0, p1=1), returned 3> - <leaving [1] fib (n=4), returned 3> - 3 - <entered [1] fib (n=5)> - <entered [2] fib2 (n=5, p0=0, p1=1)> - <entered [3] fib2 (n=4, p0=1, p1=1)> - <entered [4] fib2 (n=3, p0=1, p1=2)> - <entered [5] fib2 (n=2, p0=2, p1=3)> - <entered [6] fib2 (n=1, p0=3, p1=5)> - <leaving [6] fib2 (n=1, p0=3, p1=5), returned 5> - <leaving [5] fib2 (n=2, p0=2, p1=3), returned 5> - <leaving [4] fib2 (n=3, p0=1, p1=2), returned 5> - <leaving [3] fib2 (n=4, p0=1, p1=1), returned 5> - <leaving [2] fib2 (n=5, p0=0, p1=1), returned 5> - <leaving [1] fib (n=5), returned 5> - 5 - <entered [1] fib (n=6)> - <entered [2] fib2 (n=6, p0=0, p1=1)> - <entered [3] fib2 (n=5, p0=1, p1=1)> - <entered [4] fib2 (n=4, p0=1, p1=2)> - <entered [5] fib2 (n=3, p0=2, p1=3)> - <entered [6] fib2 (n=2, p0=3, p1=5)> - <entered [7] fib2 (n=1, p0=5, p1=8)> - <leaving [7] fib2 (n=1, p0=5, p1=8), returned 8> - <leaving [6] fib2 (n=2, p0=3, p1=5), returned 8> - <leaving [5] fib2 (n=3, p0=2, p1=3), returned 8> - <leaving [4] fib2 (n=4, p0=1, p1=2), returned 8> - <leaving [3] fib2 (n=5, p0=1, p1=1), returned 8> - <leaving [2] fib2 (n=6, p0=0, p1=1), returned 8> - <leaving [1] fib (n=6), returned 8> - 8 - ... etc ... --
gdb
-The gdb() function takes a string argument which it passes to the gdb debugger and then displays the output if any. -
-<pragma_> ,cc gdb("info macro NULL"); - <candide> pragma_: <Defined at /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h:402> <#define NULL ((void *)0)> --
<pragma_> ,cc void foo() { gdb("info frame"); } foo(); - <candide> pragma_: <Stack level 1, frame at 0x7fffffffe660:> rip = 0x400e28 in foo (); saved rip 0x400e43 called by frame at 0x7fffffffe680, caller of frame at 0x7fffffffe650 source language - c. Arglist at 0x7fffffffe650, args: Locals at 0x7fffffffe650, Previous frame's sp is 0x7fffffffe660 Saved registers: rbp at 0x7fffffffe650, rip at 0x7fffffffe658 --
Interactive Editing
-The cc command supports interactive-editing. The general syntax is: cc [command]. -
Each cc snippet is saved in a buffer which is named after the channel or nick it was used in. You can use show or diff with a buffer argument to view that buffer; otherwise you can use the copy - command to copy the most recent snippet of another buffer into the -current buffer and optionally chain it with another command -- for -example, to copy the ##c buffer and paste it: cc copy ##c and paste. -
The commands are: copy, show, diff, paste, run, undo, s//, replace, prepend, append, and remove. Most of the commands may be chained together by separating them with whitespace or "and". -
The commands are described in more detail below: -
-copy
-To copy a snippet from another buffer, use the copy command. Other commands can optionally be chained after this command. -
-Usage: cc copy <buffer> [and ...] --
show
-To show the latest code in the buffer, use the show command. This command can take an optional buffer argument. -
-<pragma_> cc show - <candide> pragma_: printf("Hello, world!"); --
This command is stand-alone and cannot be chained with other interactive-editing commands. -
-diff
-To see the differences between the two most recent snippets, use the diff command. This command can take an optional buffer argument. -
-<pragma_> cc diff - <candide> pragma: printf("<replaced `Hello` with `Good-bye`>, <replaced `world` with `void`>"); --
This command is stand-alone and cannot be chained with other interactive-editing commands. -
-paste
-To paste the full source of the latest code in the buffer as the compiler sees it, use the paste command: -
-<pragma_> cc paste - <candide> pragma_: http://some.random.paste-site.com/paste/results --
This command is stand-alone and cannot be chained with other interactive-editing commands. -
-run
-To attempt to compile and execute the latest code in the buffer, use the run command: -
-<pragma_> cc run - <candide> pragma_: Hello, world! --
This command is stand-alone and cannot be chained with other interactive-editing commands. -
-undo
-To undo any changes, use undo. The undo command must be the first command before any subsequent commands. -
-s//
-To change the latest code in the buffer, use the s/regex/substitution/[gi] pattern. -
-<pragma_> cc s/Hello/Good-bye/ and s/world/void/ - <candide> pragma_: Good-bye, void! - <pragma_> cc show - <candide> pragma_: printf("Good-bye, void!"); --
replace
-Alternatively, you may use the replace command. The usage is (note the required single-quotes): -
-cc replace [all, first, second, ..., tenth, last] 'from' with 'to' --
prepend
-Text may be prepended with the prepend command: -
-cc prepend 'text' --
append
-Text may be appended with the append command: -
-cc append 'text' --
remove
-Text may be deleted with the remove command: -
-cc remove [all, first, second, ..., tenth, last] 'text' --
Some Examples
-Examples: --
< pragma_> cc int fib2(int n, int p0, int p1) { return n == 1 ? p1 : fib2(n - 1, p1, p0 + p1); } - int fib(int n) { return n == 0 ? 0 : fib2(n, 0, 1); } for(int i = 0; i < 21; i++) printf("%d ", fib(i)); - < candide> pragma_: 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 --
< pragma_> cc int i = 0, last = 1; while(i <= 7000) { printf("%d ", i); i += last; last = i - last; } - <candide> pragma_: 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 --
<Icewing> cc int n=0, f[2]={0,1}; while(n<20) printf("%d ",f[++n&1]=f[0]+f[1]); // based on cehteh - <candide> Icewing: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 --
<3monkeys> cc @p=(0,1); until($#p>20) { print"$p[-2]\n"; push @p, $p[-2] + $p[-1] } -lang=Perl - <candide> 3monkeys: 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 --
<spiewak> cc -lang=Ruby p,c=0,1; 20.times{p p; c=p+p=c} - <candide> spiewak: 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 --
<Jafet> cc main = print $ take 20 $ let fibs = 0 : scanl (+) 1 fibs in fibs; -lang=Haskell - <candide> Jafet: [0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181] --
english
-Converts C code into English sentences. Understands only C89 code. -
-Usage: english <C snippet> --
Examples: - <pragma_> english char (*a)[10]; char *b[10]; - <candide> Let a be a pointer to an array of length 10 of type char. Let b be an array of length 10 of type pointer to char. - <pragma_> english for(;;); - <candide> Repeatedly compute nothing. - <pragma_> english typedef char Batman; char Bruce_Wayne; char superhero = (Batman) Bruce_Wayne; - <candide> Let Batman be another name for a character. Let Bruce_Wayne be a character. Let superhero be a character, with value being Bruce_Wayne cast to a Batman. --
expand
-Expands macros in C code and displays the resulting code. Macros -must be terminated by a \n sequence. You may #include headers to expand - macros defined within. -
-Usage: expand <C snippet> --
Example: - <pragma_> expand #define WHILE while ( \n #define DO ) { \n #define WEND } \n int i = 5; WHILE --i DO puts("hi"); WEND - <candide> pragma_: int i = 5; while ( --i ) { puts("hi"); } - <pragma_> expand #include <stdlib.h> NULL - <candide> pragma_: ((void *)0) --
prec
-paren
-Shows operator precedence in C99 expressions by adding parentheses. -
-Usage: prec <expression> - paren <expression> --
Examples: - <pragma_> prec *a++ - <candide> pragma_: *(a++) - <pragma_> prec a = b & c - <candide> pragma_: a = (b & c) - <pragma_> prec token = strtok(s, d) != NULL - <candide> pragma_: token = (strtok(s, d) != NULL) --
faq
-Displays questions from the comp.lang.c faq. - Some queries may return more than one result; if this happens, you may - use the 'match #' optional argument to specify the match you'd like to -view. -
-Usage: faq [match #] <search regex> - Examples: - <pragma_> faq cast malloc - <candide> 2 results, displaying #1: 7. Memory Allocation, 7.6 Why am - I getting ``warning: assignment of pointer from integer - lacks a cast for calls to malloc? : - http://www.eskimo.com/~scs/C-faq/q7.6.html - <pragma_> faq 2 cast malloc - <candide> 2 results, displaying #2: 7. Memory Allocation, 7.7 Why - does some code carefully cast the values returned by - malloc to the pointer type being allocated? : - http://www.eskimo.com/~scs/C-faq/q7.7.html - <pragma_> faq ^6.4 - <candide> 6. Arrays and Pointers, 6.4 Why are array and pointer - declarations interchangeable as function formal - parameters? : http://www.eskimo.com/~scs/C-faq/q6.4.html --
c99std
-Searches ISO/IEC 9899:TC3 (WG14/N1256), also known as the C99 draft standard. http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf -
-Usage: c99std [-list] [-n#] [section] [search regex] - If specified, 'section' must be in the form of X.YpZ where X and Y are section/chapter and, optionally, pZ is paragraph. - To display a specific section and all its paragraphs, specify just the 'section' without pZ. - To display just a specific paragraph, specify the full 'section' identifier (X.YpZ). - You may use -n # to skip to the #th match. - To list only the section numbers containing 'search text', add -list. - If both 'section' and 'search regex' are specified, then the search space will be within the specified section identifier. --
Examples: --
< pragma_> c99std pointer value - < candide> Displaying #1 of 64 matches: 5.1.2.2.1p1: [Program startup] If they are declared, the parameters to the - main function shall obey the following constraints: -- The value of argc shall be nonnegative. -- argv[argc] - shall be a null pointer. -- If the value of argc is greater than zero, the array members argv[0] through - argv[argc-1] inclusive shall contain pointers to st... truncated; see http://codepad.org/f2DULaGQ for full text. --
< pragma_> c99std pointer value -list - < candide> Sections containing 'pointer value': 5.1.2.2.1p2, 5.1.2.3p9, 6.2.5p20, 6.2.5p27, 6.3.2.1p3, 6.3.2.1p4, - 6.3.2.3p2, 6.3.2.3p6, 6.5.2.1p3, 6.5.2.2p5, 6.5.2.2p6, 6.5.2.4p1, 6.5.2.4p2, 6.5.3.1p1, 6.5.3.2p3, 6.5.3.2p4, - 6.5.3.3p5, 6.5.3.4p5, 6.5.6p8, 6.5.6p9, 6.5.8p5, 6.5.15p6, 6.6p7, 6.6p9, 6.7.2.2p5, 6.7.2.3p7, 6.7.2.3p3, - 6.7.5.1p3, 6.7.5.2p7, 7.1.1p1, 7.1.1p4, 7.1.4p1, 7... truncated; see http://codepad.org/qQlnJYJk for full text. --
< pragma_> Hmm, how about just section 6.3? --
< pragma_> c99std pointer value 6.3 - < candide> Displaying #1 of 4 matches: 6.3.2.1p1: [Lvalues, arrays, and function designators] Except when it is the operand - of the sizeof operator or the unary & operator, or is a string literal used to initialize an array, an expression - that has type ``array of type is converted to an expression with type ``pointer to type that points to the - initial element of the array ob... truncated; see http://codepad.org/mf1RNnr2 for full text. --
< pragma_> c99std pointer value 6.3 -list - < candide> Sections containing 'pointer value': 6.3.2.1p3, 6.3.2.1p4, 6.3.2.3p2, 6.3.2.3p6 --
< pragma_> c99std pointer value 6.3 -n3 - < candide> Displaying #3 of 4 matches: 6.3.2.3p1: [Pointers] For any qualifier q, a pointer to a non-q-qualified type may be - converted to a pointer to the q-qualified version of the type; the values stored in the original and converted - pointers shall compare equal. --
c11std
-Searches ISO/IEC 9811:201X (WG14/N1256), also known as the C11 draft standard. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf -
Usage is identical to c99std. -
-man
-Displays manpage summaries and/or C related tidbits (headers, -prototypes, specifications), as well as a link to the FreeBSD manpage. -
-Usage: man [section] query -Samples: - <pragma_> man fork - <candide> Includes: sys/types.h, unistd.h - pid_t fork(void); - SVr4, - SVID, POSIX, X/OPEN, BSD - fork creates a child process that - differs from the parent process only in its PID and PPID, and - in the fact that resource utilizations are set to 0 - - http://www.iso-9899.info/man?fork - <pragma_> man atexit - <candide> Includes: stdlib.h - int atexit(void (*function)(void)); - - SVID 3, BSD 4.3, ISO 9899 - atexit () function registers the - given function to be called at normal program termination, - whether via exit(3) or via return from the program's main - - http://www.iso-9899.info/man?atexit - <pragma_> man getcwd - <candide> Includes: unistd.h - char *getcwd(char *buf, size_t size); - - POSIX.1 - getcwd () function copies an absolute pathname of - the current working directory to the array pointed to by buf, - which is of length size - http://www.iso-9899.info/man?getcwd --
Displays google results for a query. -
-Usage: google [number of results] query -Samples: - <pragma_> google brian kernighan - <candide> brian kernighan (115,000): Brian Kernighan's Home Page: - (http://www.cs.princeton.edu/~bwk/) - <pragma_> google 3 brian kernighan - <candide> brian kernighan (115,000): Brian Kernighan's Home Page: - (http://www.cs.princeton.edu/~bwk/), An Interview with Brian - Kernighan: (http://www-2.cs.cmu.edu/~mihaib/kernighan-interview/), - Interview with Brian Kernighan | Linux Journal: - (http://www.linuxjournal.com/article.php?sid=7035), Brian W. - Kernighan: (http://www.lysator.liu.se/c/bwk/) ,Brian W. - Kernighan: Programming in C: A Tutorial: - (http://www.lysator.liu.se/c/bwk-tutor.html) --
define
-dict
-Displays dictionary defintions from http://dict.org using DICT protocol. -
Databases for the -d option are listed here: http://www.iso-9899.info/candide/dict_databases.txt - -- Note that there may be several commands aliased to one of these -databases; for example, the `foldoc` command is an alias to `dict -d -foldoc`. -
-Usage: dict [-d database] [-n start from definition number] [-t first letter of word class type (n]oun, v]erb, etc)] - [-search <regex> for definitions matching <regex>] <word> --
Examples: --
<pragma_> dict hit - <candide> hit: n: 1) (baseball) a successful stroke in an athletic contest (especially in baseball); - "he came all the way around on Williams' hit", 2) the act of contacting one thing with another; - "repeated hitting raised a large bruise"; "after three misses she finally got a hit" [syn: hitting, - striking], 3) a conspicuous success; "that song was his first hit and marked the beginning of his - career"; "that new Broadway show is a real smasher" --
<pragma_> dict -n 4 hit - <candide> hit: n: 4) (physics) an brief event in which two or more bodies come together; "the collision of the - particles resulted in an exchange of energy and a change of direction" [syn: collision], 5) a dose - of a narcotic drug, 6) a murder carried out by an underworld syndicate; "it has all the earmarks of - a Mafia hit", 7) a connection made via the internet to another website; "WordNet gets many hits from - users worldwide" --
<pragma_> dict -t v hit - <candide> hit: v: 1) cause to move by striking; "hit a ball", 2) hit against; come into sudden contact with; - "The car hit a tree"; "He struck the table with his elbow" [syn: strike, impinge on, run into, - collide with] [ant: miss], 3) affect or afflict suddenly, usually adversely; "We were hit by really - bad weather"; "He was stricken with cancer when he was still a teenager"; "The earthquake struck at - midnight" [syn: strike], 4) deal a blow to --
<pragma_> dict -search ball hit - <candide> hit: n: 1) (baseball) a successful stroke in an athletic contest (especially in baseball); "he came all - the way around on Williams' hit", v: 1) cause to move by striking; "hit a ball" --
<pragma_> dict -d eng-fra hit - <candide> hit: 1) [hit] battre, frapper, heurter frapper, heurter atteindre, frapper, parvenir, saisir --
foldoc
-This is just an alias for `dict -d foldoc`. -
-vera
-This is just an alias for `dict -d vera`. -
-
udict
-Displays dictionary definitions from http://urbandictionary.com. -
-Usage: udict query --
wdict
-Displays Wikipedia article abstracts (first paragraph). Note: case-sensitive and very picky. -
-Usage: wdict query --
acronym
-Displays expanded acronyms. -
-Usage: acronym query -Samples: - <pragma_> acronym posix - <candide> posix (3 entries): Portable Operating System for - Information Exchange, Portable Operating System Interface - Extensions (IBM), Portable Operating System Interface for - Unix - <pragma_> acronym linux - <candide> linux (1 entries): Linux Is Not UniX --
math
-Evaluate calculations. -
-Usage: math <expression> -Example: - <pragma_> math 5 + 5 - <candide> 5 + 5 = 10 --
compliment
-Displays a random Markov-chain compliment/insult. -
-Usage: compliment [nick] --
insult
-Displays a random insult. -
-Usage: insult [nick] --
excuse
-Displays a random excuse. -
-Usage: excuse [nick] --
horoscope
-Displays a horoscope for a Zodiac sign (google this if you don't know your sign). -
-Usage: horoscope <sign> --
horrorscope
-Displays a horrorscope for a Zodiac sign. -
-Usage: horrorscope <sign> --
quote
-Displays quotes from a popular quotation database. If you use -`quote` without arguments, it returns a random quote; if you use it -with an argument, it searches for quotes containing that text; if you -add --author <name> at the end, it searches for a quote by -that author; if you specify text and --author, it searches for quotes by - that author, containing that text. -
-Usage: quote [search text] [--author <author name>] -Samples: - <pragma_> quote - <candide> "Each success only buys an admission ticket to a more difficult problem." -- Henry Kissinger (1923 - ). - <pragma_> quote --author lao tzu - <candide> 41 matching quotes found. "A journey of a thousand miles begins with a single step." -- Lao-tzu (604 BC - 531 BC). - <pragma_> quote butterfly - <candide> 11 matching quotes found. "A chinese philosopher once had a dream that he was a butterfly. From that day on, he - was never quite certain that he was not a butterfly, dreaming that he was a man." -- Unknown. --
Informative
-list
-Lists information about specified argument -
-Usage: .list <modules|factoids|commands|admins> --
info
-Shows detailed information about a module or a factoid -
-Usage: .info <module|factoid> --
version
-Shows version information -
-source
-Shows candide's source information. -
-help
-Shows link to this page. -
-Administrative
-login
-You cannot use any of the admin commands unless you login first -
-Usage: login <password> --
Note that login requires that your nick and hostmask match candide's records. -
-logout
-Logs out of candide. -
-ignore
-Ignore a user -
-Usage: ignore <hostmask> [channel] [timeout] --
unignore
-Unignores a user -
-Usage: unignore <hostmask> [channel] --
ban
-Bans a user -
-Usage: ban <hostmask> [timeout seconds] --
If timeout is omitted, candide will ban the user for one hour. Timeout is in seconds. -
-unban
-Unbans a user -
-Usage: - unban <hostmask> --
Note that <hostmask> must EXACTLY match the hostmask in the ban list for the channel. -
-kick
-Removes a nick from the channel. -
-Usage from channel: kick <nick> <reason> - From private message: kick <channel> <nick> <reason> --
export
-exports specified list to web page -
-Usage: export <commands|factoids|admins|channels> --
##c
-C-Aphorisms
-The C Aphorisms can be triggered with c<n> where <n> is -an integer representing one of the aphorisms. For example, to quote C -Aphorism 1, use `c1`. -
-- The questioner's first description of the problem/question will be misleading. -
- All examples given by the questioner will be incomplete, -misleading, broken, wrong, and/or not representative of the actual -question. -
- The questioner will not read and apply the answers they are given but will instead continue to practice c1 and c2. -
- The ignorant will continually mis-educate the questioner. -
- When given a choice of solutions, the questioner will always choose the wrong one. -
- The questioner will always find a reason to say, "It doesn't work." -
- The questioner will paste code and say "I have a problem" or -"It doesn't work" without any further information or description of the -problem. -
- The more beginner they are, the more likely they are to be overcomplicating it. -
- The questioner will always have some excuse for doing it wrong. -
- The newbie will not accept the answer you give, no matter how right it is. -
- <skipped due to existing c11 factoid> -
- The newbie will think they are smarter than they really are. -
- The newbie will fail to recognize undefined behavior, and will - wrongly think that their program is correct because it appears to work. -
Flood control
-Candide can monitor the channel for excessive rapid traffic -originating from an individual and automatically ban the offender for a -certain length of time. -
-Message flood
-If four (4) or more messages are sent within ten (10) seconds, the -flood control is triggered. The offender will be muted for 30 seconds -for the first offense. Each additional offense will result in the -offender being muted for a much longer period. For example, the first -offense will result in 30 seconds, the 2nd offense will be 5 minutes, -the 3rd will be 1 hour, and so on. -
-Join flood
-If four (4) or more JOINs are observed within thirty (30) minutes without any messages in between joins, the offender will be forwarded to another channel for a limited time: 2^(number_of_offenses + 2) hours. -
In addition to private instructions from candide, this channel -will have a /topic and ChanServ on-join message with instructions -explaining to the offender how to remove the forwarding. The -instructions are to message candide with: unbanme <channel>. -
(Any messages sent to the public channel by the user at any time -will reset their JOIN counter back to zero. The unbanme command can -only be used for the first two offenses -- the offense counter is -decremented once every 24 hours.) -
-Enter key abuse
-If four (4) consecutive messages are sent with ten (10) seconds or -less between individual messages and without another person speaking, an - enter-key-abuse counter is incremented. This counter will then -continue to be incremented every two (2) consecutive messages with ten -(10) seconds or less in between until another person speaks or more than - ten (10) seconds have elapsed, whereupon it returns to requiring four -(4) consecutive messages. When this counter reaches three (3) or -greater, the offender will be muted using the same timeout rules as -message flooding. This counter is automatically decremented once per -hour. -
-Notification message
-Candide will send the following message to the offender each offense. -
-Message flooding
-"You have been muted due to flooding. Please use a web paste service such as http://codepad.org for lengthy pastes. You will be allowed to speak again in $timeout." -
-Join flooding
-"You have been banned from $channel due to join flooding. If your -connection issues have been resolved, or this was an accident, you may -request an unban at any time by responding to this message with: unbanme - $channel, otherwise you will be automatically unbanned in $timeout." -
-Enter key abuse
-"You have been muted due to abusing the enter key. Please do not -split your sentences over multiple messages. You will be allowed to -speak again in $timeout." -
-Opping/Deopping
-ChanServ will automagically op and deop Candide when necessary. -Candide will wait until about 5 minutes have elapsed before requesting a - deop from ChanServ. -
-- - - - - -