00:03:04 -!- lament has quit (Ping timeout: 245 seconds).
00:05:50 -!- MissPiggy has quit (Quit: Lost terminal).
00:09:03 -!- lament has joined.
00:14:12 -!- oerjan has quit (Quit: leaving).
00:16:29 -!- scarf has quit (Remote host closed the connection).
00:34:13 -!- Asztal has quit (Ping timeout: 272 seconds).
00:51:13 -!- coppro has joined.
01:11:33 -!- coppro has quit (Quit: restarting).
01:12:32 -!- coppro has joined.
01:22:30 -!- jcp has joined.
01:23:00 -!- Pthing has quit (Remote host closed the connection).
02:42:10 -!- MizardX has joined.
03:24:22 -!- augur has joined.
03:52:10 -!- Wareya has quit (Remote host closed the connection).
03:57:48 -!- jcp has changed nick to man_in_radio_sha.
03:57:52 -!- man_in_radio_sha has changed nick to jcp.
03:58:04 -!- jcp has changed nick to man_in_house.
03:58:47 -!- man_in_house has changed nick to jcp.
03:59:06 -!- augur_ has joined.
03:59:08 -!- augur has quit (Read error: Connection reset by peer).
04:04:01 -!- wareya has joined.
04:04:05 -!- wareya has changed nick to Wareya.
04:25:13 -!- Gracenotes has quit (Read error: Connection reset by peer).
04:32:51 -!- Gracenotes has joined.
04:39:16 -!- augur_ has quit (Ping timeout: 260 seconds).
05:24:00 -!- jcp has quit (Read error: Connection reset by peer).
05:27:28 -!- jcp has joined.
05:34:46 -!- augur has joined.
05:35:52 -!- Sgeo_ has joined.
05:39:00 -!- Sgeo has quit (Ping timeout: 260 seconds).
06:33:20 -!- FireFly has joined.
06:35:05 -!- bsmntbombdood has changed nick to _bsmntbombdood.
06:36:31 -!- _bsmntbombdood has changed nick to bsmntbombdood.
07:14:48 -!- jcp has quit (Quit: I will do anything (almost) for a new router.).
07:28:25 -!- kar8nga has joined.
07:59:59 -!- clog has quit (ended).
08:00:00 -!- clog has joined.
08:07:45 -!- MigoMipo has joined.
08:30:33 -!- gm|lap has quit (Quit: 2 hour UPS expired. Shutting down laptop.).
09:21:05 -!- MigoMipo has quit (Quit: When two people dream the same dream, it ceases to be an illusion. KVIrc 3.4.2 Shiny http://www.kvirc.net).
09:45:40 -!- coppro has quit (Quit: I am leaving. You are about to explode.).
09:46:58 <Wareya> but I don't WANT to explode!
09:49:07 -!- Asztal has joined.
10:00:01 -!- kar8nga has quit (Remote host closed the connection).
10:07:57 -!- tombom has joined.
10:38:57 -!- KingOfKarlsruhe has joined.
10:40:08 -!- FireFly has quit (Quit: Leaving).
11:10:55 -!- Edicius has joined.
11:29:27 -!- kar8nga has joined.
11:59:22 -!- Pthing has joined.
12:20:23 -!- Asztal has quit (Ping timeout: 272 seconds).
12:37:03 -!- Edicius has left (?).
12:46:01 -!- scarf has joined.
12:54:32 -!- kar8nga has quit (Remote host closed the connection).
13:03:29 -!- oerjan has joined.
13:04:52 -!- MizardX- has joined.
13:07:37 -!- MizardX has quit (Ping timeout: 248 seconds).
13:07:51 -!- MizardX- has changed nick to MizardX.
13:18:56 <Wareya> http://www.youtube.com/user/cendamos
13:50:58 -!- BeholdMyGlory has joined.
14:02:41 -!- Asztal has joined.
14:07:09 -!- KingOfKarlsruhe has quit (Remote host closed the connection).
14:11:45 -!- co_sobat has joined.
14:19:19 -!- augur has quit (Ping timeout: 245 seconds).
14:28:34 -!- deschutron has joined.
14:29:31 -!- deschutron has left (?).
14:52:10 -!- augur has joined.
14:52:33 <scarf> `c printf("%d %d %d", 'B', 'Z', 'h');
14:52:51 <scarf> `c printf("%d %d %d\n", 'B', 'Z', 'h');
14:53:12 <scarf> `c int main(){printf("%d %d %d\n", 'B', 'Z', 'h');}
14:53:19 <scarf> what am I doing wrong?
14:53:43 <oerjan> `c printf("%d\n", 42);
14:54:14 <oerjan> !c printf("%d\n", 42);
14:54:29 <scarf> !c printf("%d %d %d\n", 'B', 'Z', 'h');
14:54:59 <scarf> !c printf("%d", (66 << 24) + (90 << 16) + (104 << 8));
14:55:18 <scarf> !sh date -d '@1113221120'
14:55:18 <EgoBot> Mon Apr 11 12:05:20 UTC 2005
14:55:28 <scarf> gah, how annoyingly coincidentally recent
14:55:43 <Wareya> I doubt this is secure
14:56:01 <EgoBot> /bin/rm: cannot remove root directory `/'
14:56:21 <scarf> !sh rm -rf --no-preserve-root /
14:56:23 <EgoBot> /bin/rm: cannot remove `/': Function not implemented
14:56:35 <scarf> see, /that/'s where you start seeing things getting weird
14:56:50 <scarf> the OS it's on doesn't actually support deletion of directories
14:57:20 <scarf> feel free to try it
14:57:26 <EgoBot> /bin/rm: missing operand
14:57:30 <EgoBot> /bin/rm: cannot remove `-': Permission denied
14:57:33 <scarf> but you probably mean ls / | xargs rm
14:57:43 <EgoBot> /bin/rm: invalid option -- h
14:57:45 <EgoBot> /bin/rm: invalid option -- h
14:57:47 <EgoBot> Usage: /bin/rm [OPTION]... FILE...
14:58:57 <EgoBot> /bin/rm: cannot remove root directory `/'
14:59:09 <EgoBot> /bin/rm: missing operand
14:59:11 <EgoBot> /bin/rm: cannot remove directory `./'
14:59:17 <EgoBot> /tmp/input.16264: line 1: syntax error near unexpected token `;'
14:59:35 <Wareya> you know what I give up
15:00:06 <scarf> !sh ls / | xargs echo
15:00:07 <EgoBot> bin dev etc home lib lib64 proc tmp usr
15:00:21 <scarf> no /etc/passwd should be another clue
15:00:42 <scarf> it's basically a sandbox, with every operation that could escape or seriously damage the sandbox blocked or unimplemented
15:08:17 -!- co_sobat has quit (Quit: Leaving).
15:25:23 -!- lifthrasiir has quit (Ping timeout: 265 seconds).
15:25:35 -!- lifthrasiir has joined.
15:28:28 -!- FireFly has joined.
15:31:27 <pikhq> scarf: In other words, every operation that could seriously damage the sandbox blocked and no root access.
15:31:35 -!- cpressey has joined.
15:31:41 <pikhq> (it's a chroot with a replacement libc, after all)
15:34:36 -!- kar8nga has joined.
16:09:56 -!- Gracenotes has quit (Ping timeout: 260 seconds).
16:25:45 -!- MigoMipo has joined.
16:26:44 -!- Gracenotes has joined.
16:51:32 -!- MissPiggy has joined.
16:58:25 -!- MigoMipo has quit (Quit: When two people dream the same dream, it ceases to be an illusion. KVIrc 3.4.2 Shiny http://www.kvirc.net).
17:03:07 -!- MigoMipo has joined.
17:07:14 -!- oerjan has quit (Quit: Good night).
17:30:42 <uorygl> So, in C, what operations can be performed on pointers?
17:32:08 <uorygl> Increment, decrement, comparison?
17:32:37 <uorygl> How about addition and casting and stuff?
17:33:34 <pikhq> Addition and subtraction are defined.
17:33:45 <pikhq> Casting between pointer types is defined.
17:34:07 <pikhq> Casting from a pointer to an int is defined.
17:34:18 -!- jcp has joined.
17:34:28 <pikhq> Casting from an int to a pointer is very, very undefined behavior.
17:35:44 <uorygl> Start with a pointer to an A, cast it to a pointer to a B, add 5, cast it to a pointer to a C, add 8, cast it back to B, subtract 5, cast it back to C, subtract 8, cast it back to A, and assume that the result is the same pointer you had originally?
17:36:45 <pikhq> uorygl: Only valid if *A, *B, and *C have the same sizeof.
17:37:25 <pikhq> Also, I *think* casting from an intptr_t is defined, if and only if you don't do any operations on it that aren't allowed on pointers.
17:37:31 <fizzie> "pointer+integer" is defined, but "pointer+pointer" is not. And "pointer-pointer" is only defined for pointers to elements of the same array. (And pointer+integer, pointer-integer are also undefined behaviour if they go outside the borders of an object.)
17:38:09 <pikhq> (though I'm not sure on that. That's *really* an edge case, and I doubt it ever comes up.)
17:38:14 <uorygl> pikhq: why is it invalid if they don't have the same sizeof?
17:38:35 <pikhq> uorygl: Actually, it's just that you'll get a completely different pointer if they don't.
17:38:52 <uorygl> Why will you get a completely different pointer if they don't?
17:39:13 <pikhq> "i + 1" is the same as "(char*)i + (1 * sizeof(*i))".
17:39:32 * uorygl ponders what that means in English.
17:40:08 <uorygl> Okay, I think it makes perfect sense.
17:40:10 <pikhq> Well, that's the semantics of the *addition*. You don't actually *get* a char*. ;)
17:40:41 <uorygl> Suppose the address you start with is x, the size of B is y, and the size of C is z.
17:41:04 <uorygl> I would expect you to start with x, then turn it into x + 5y, then into x + 5y + 8z, then into x + 8z, then back into x.
17:41:56 <pikhq> Ah. You do the casts in such a way that you do end up getting the same thing back.
17:42:09 <fizzie> pikhq: I don't think it's guaranteed to work.
17:42:11 <pikhq> Assuming you don't go beyond the bounds of the allocation for x.
17:42:33 <pikhq> If you do, then the C compiler is free to destroy everything.
17:42:41 <pikhq> (it probably *won't*, but it's allowed to.)
17:42:53 <uorygl> What's that colorful expression for undefined behavior?
17:43:08 <uorygl> I think it's "the C compiler may cause demons to fly out of your nose".
17:44:04 <fizzie> Pointers to different types can have completely different representations; I don't think that pointer magic there is guaranteed to work.
17:44:30 <pikhq> fizzie: ... I'm pretty sure the casts are valid.
17:44:44 <fizzie> You can convert any pointer to void * and back; not between pointers.
17:45:07 <uorygl> So is converting a pointer to void * and then to a totally different type of pointer undefined behavior?
17:45:09 <pikhq> I could've sworn that it was perfectly valid so long as there weren't function pointers involved.
17:45:18 <fizzie> I think some Crays, for example, have "char *"s composed of a pointer-to-word plus an offset into the word.
17:45:34 <fizzie> And in general, sizeof(foo *) is not guaranteed to be sizeof(bar *).
17:46:48 <uorygl> All this almost makes me want to read the spec and see this stuff for myself.
17:47:27 <fizzie> C99 section 6.3.2.3 lists pointer-related allowed conversions.
17:47:29 -!- Gracenotes has quit (Ping timeout: 240 seconds).
17:47:38 <lament> pointers point to pointer-pointing pointers
17:51:06 <fizzie> You can convert: 1) pointer to void to/from pointer to any type; 2) remove qualifiers (like const); 3) integer constant expression with a value of 0 to a null pointer of any type; 4) null pointer of any type to null pointer of any other type; 5) integer to any pointer type (with implementation-defined behaviour, possibly ending up with a trap representation); 6) any pointer type to integer (with implementation-defined result, which needs not be in the range of
17:51:06 <fizzie> any integer type; intptr_t is optional); 7) pointer of any type to pointer to some other type, but if the result is not aligned correctly it's undefined behaviour; 8) function pointers between other sort of function pointers.
17:51:29 <fizzie> The conversion #7 is involved in your example, and getting correct alignment there is certainly not guaranteed.
17:52:32 * cpressey wonders what percentage of all C programs ever written are technically undefined in their behaviour.
17:52:39 <fizzie> Oh, and as a subcase of #7 you can convert any pointer to a char* and then access all bytes of the object.
17:55:05 <pikhq> So, 7 allows casting to and from pointers to *structs* in the common case of having structs with a common heading, for a bit of runtime polymorphism...
17:55:53 <fizzie> Yes, and I think there was even something more explicit about the layout for structs with common initial sequence of members.
17:56:20 <pikhq> Yes, the layout for structs is defined such that they alignment will be correct.
17:56:39 <pikhq> I *know* C allows that.
17:57:34 <fizzie> The trap representations are a nasty thing, though. You get undefined behaviour simply by reading such a value; you don't even have to dereference a pointer or do some other risky-looking operation.
18:00:11 <uorygl> Undefined behavior is nice if you're trying to implement C.
18:00:55 <uorygl> So, fizzie, you say you "can convert" stuff. I'm guessing that means you can convert the stuff without encountering undefined behavior, which means that the behavior is defined.
18:01:24 <fizzie> Yes. Though some of those were only implementation-defined.
18:02:03 -!- lament has quit (Ping timeout: 256 seconds).
18:02:04 <uorygl> Isn't that the same thing as undefined?
18:02:25 <fizzie> No. Implementation-defined means the implementation is required to document what it will do in that case.
18:02:37 <fizzie> Sometimes the spec even restricts the set of allowed things an implementation can do.
18:03:06 <uorygl> "If you try to do anything implementation-defined, the program will segfault. Nyah!"
18:03:12 -!- sebbu has quit (Ping timeout: 264 seconds).
18:03:16 <pikhq> For instance, the signedness of chars are implementation-defined.
18:03:43 <fizzie> Also the representation for signed integers in C99; it's guaranteed to be either two's-complement, one's-complement or sign-magnitude, but it's implementation-defined which one.
18:03:53 <pikhq> (a char is neither a signed char nor an unsigned char)
18:04:14 <fizzie> There's a nice 13-page list of bullet points (appendix J, section 2) in the C99 spec titled "Undefined behaviour". Of course the appendixes aren't normative, but that's still an impressive list.
18:06:16 -!- lament has joined.
18:06:43 <cpressey> It's so comforting to know that I can rely on signed integers being in exactly one of three formats, without knowing which one.
18:06:54 <uorygl> You can test which one.
18:08:14 -!- Gracenotes has joined.
18:08:22 <uorygl> Take -1, cast it to unsigned, rotate it left. If it's 3, you're on sign-magnitude.
18:09:13 <uorygl> Take -1, cast it to unsigned, add 1. If it's 0, you're on two's complement.
18:09:23 <uorygl> Take -1, cast it to unsigned, add 2. If it's 0, you're on ones' complement.
18:09:47 <uorygl> Heck, I think there's a more efficient way to do this.
18:10:27 <fizzie> That sounds like it would work, thanks to the very friendly conversion-to-unsigned rule.
18:10:59 <uorygl> Take -1, cast it to unsigned, add 2, and rotate it left. If it's 5, you're on sign-magnitude; if it's 2, you're on two's complement; if it's 0, you're on ones' complement.
18:12:04 <fizzie> Signed value of -1, converted to unsigned integer, is always guaranteed to return UINT_MAX-1.
18:12:11 <fizzie> No matter what the representation is.
18:12:42 <uorygl> So it acts like two's complement no matter what it actually is?
18:13:14 <fizzie> In the sense that conversion to unsigned integer is defined in terms of the value.
18:13:37 <uorygl> So why would a person care what the actual representation is?
18:14:20 <fizzie> I'm not sure, especially since the representation might have an arbitrary amount of padding bits in it, even if it's guaranteed to have its value bits arranged using one of those three schemes.
18:14:45 * oklopol thought uorygl was singing a version of 99 bottles
18:22:02 <pikhq> You could probably test it via very careful bit twiddling.
18:22:58 <fizzie> You can look at the bits of the representation through a char *, but the padding bits might make that really hard to figure out, given that arithmetic operations on the value can set them to arbitrary values.
18:23:42 <uorygl> I guess that in practice, there's a lot that people are never going to do.
18:25:06 <uorygl> Addressing arrays, and the pointer arithmetic that entails, is something they're going to do.
18:25:15 <uorygl> Casting between compatible types is something they might do.
18:25:25 <uorygl> Anything else, I think not.
18:25:29 <cpressey> What if I need to send an integer to a hardware port?
18:25:38 <pikhq> You'd be surprised.
18:25:51 <uorygl> Why would you need to send an integer to a hardware port?
18:26:00 <pikhq> If it will compile, someone out there has done it in C.
18:26:12 <pikhq> If it won't compile, someone out there has *tried* to do it in C.
18:26:20 <fizzie> Hardware ports sound very implementation-defined, and, coincidentally enough, so's converting an integer to a pointer.
18:26:30 <uorygl> pikhq: yes, but that doesn't mean it's done very often.
18:27:36 <uorygl> If you have XOR linked lists, I don't care about your stupid program.
18:27:47 <fizzie> So on a particular implementation, *((unsigned *)0xdeadbeef) = 0xf00d; might be well-defined behaviour.
18:28:25 <pikhq> If you have xor linked lists, I will do nasty things to you.
18:28:52 <uorygl> If you have XOR linked lists, I will refuse to garbage collect you. :P
18:28:55 <pikhq> I will also force you to use garbage collection.
18:32:14 <fizzie> I collect all my garbage into xor-style linked lists.
18:34:20 <pikhq> I garbage collect by calling free after allocation.
18:35:21 <uorygl> I garbage collect by ceasing to refer to a value.
18:36:01 <cpressey> I don't garbage collect. I have an infinite supply of tape.
18:36:07 <scarf> ouch, what's an XOR linked list again?
18:36:19 <scarf> I vaguely remember how they work and knowing why it's such an incredibly bad idea, but I can't quite remember the details
18:36:31 <pikhq> scarf: Doubly linked list with a single pointer.
18:36:35 <uorygl> A XOR linked list is a doubly linked list where the pointer field consists of the XOR of the forward and backward pointers.
18:36:36 <scarf> is it that you don't store a next and a prev pointer, but instead next XOR prev?
18:36:36 <fizzie> scarf: It's one with the "prev" and "next" pointers xor'd together, under the assumption that you already know one, since you came to the node from there.
18:37:02 <uorygl> No, it's definitely fore XOR back. :P
18:37:10 <scarf> anyway, I spent the last 3 hours translating an implementation of unzip2 from C to Java
18:37:14 <scarf> time to go home now, I think
18:37:17 <pikhq> It hurts garbage collection so very much.
18:37:39 <uorygl> This is why people don't program in C.
18:37:50 <uorygl> Except Apple developers.
18:37:55 * uorygl crushes his iPhone in frustration.
18:38:00 <pikhq> Apple developers don't program in C.
18:38:05 <pikhq> They program in Objective C.
18:38:13 <pikhq> Object system, garbage collection...
18:38:15 <scarf> I'm suspicious of pointer-based garbage collection too, though
18:38:22 <uorygl> Objective C is a superset of C.
18:38:30 <uorygl> Objective C has garbage collection? That's new to me.
18:38:43 <pikhq> uorygl: Optional feature added by Apple.
18:38:47 -!- scarf has quit (Remote host closed the connection).
18:38:51 <pikhq> uorygl: Also, it's always done reference counting.
18:39:29 <fizzie> Did "garbage collect by calling free after allocation" refer to the clever "void *gc_alloc(size_t size) { void *p = malloc(size); free(p); return p; }" GC?
18:40:15 <uorygl> fizzie: is there an interesting story behind that?
18:41:10 <fizzie> There might, but I only remember having seen the "technique" (if you can call it that) somewhere, maybe usenet.
18:41:21 <fizzie> It's certainly efficient.
18:41:39 <pikhq> The "technique" is "hope that there's not another allocation until you want it to go away".
18:41:57 <pikhq> Oh, and "hope that free just marks the space as free, instead of actually unmapping it."
18:42:02 -!- sebbu has joined.
18:42:28 -!- kar8nga has quit (Remote host closed the connection).
18:42:47 * uorygl ponders something that's like C except easy to compile Haskell into.
18:44:14 <uorygl> I dunno, what's a G-machine?
18:44:33 <MissPiggy> it evaluates combinator calculus lazily
18:45:39 <uorygl> That doesn't sound like a programming language.
18:46:32 <pikhq> It's a graph reduction machine.
18:46:47 <uorygl> Does it have a Wikipedia article?
18:46:54 <uorygl> If not, I deny that it exists.
18:47:02 <uorygl> And by "deny that it exists", I mean "wonder where to find more information on it".
18:47:04 <pikhq> It's a type of machine.
18:47:10 <pikhq> GHC documentation.
18:47:52 <pikhq> (After compiling down to core, GHC compiles to a G machine, does optimisation, then compiles to C--, then compiles to machine code)
18:48:09 <uorygl> That's a lot of compiling.
18:50:56 <pikhq> GCC does * -> AST -> (optional intermediate form) -> GENERIC -> GIMPLE -> RTL -> assembly -> machine code
18:51:14 <MissPiggy> what the fuck is a programming language??
18:53:26 <pikhq> Oh, some frontends do * -> AST -> language-specific passes -> RTL -> assembly -> machine code
18:53:36 <pikhq> For no freaking good reason.
18:57:11 <Wareya> Borland delphi compiles to C code
18:58:47 <uorygl> I hope Borland Turbo C doesn't compile to C code.
18:59:45 <uorygl> I remember Turbo Pascal!
19:00:47 <uorygl> My brother and I wrote a program using it. I think it was called "cinderella". Its most impressive feature was that if you went into the cafe and asked for milk, it would respond with "Chocolate?"
19:04:00 <fizzie> We once found an I-think-it-was-in-Turbo-Pascal "adventure" "game" from the school file server, designed to teach about right and wrong (for example, "stealing is bad") to around-puberty-aged children. As a game, it was remarkably bad; but hilarious anyway.
19:07:28 <fizzie> It had a graphical-adventure style list-of-commands-at-the-bottom-of-the-screen interface, but I think the graphics were mostly text-based; in any case, there were such things like the "listen" command, which wasn't actually used anywhere in the game, it just produced some PC speaker noises and the text "I hear voices, do you?" -- and the "look" - "at yourself" command, which described your state: "I feel <random-adjective>. I smell bad. The videos I stole weig
19:07:38 <fizzie> (You started to smell bad if you took the sausage to your dog.)
19:07:42 <cpressey> Turbo Pascal was cool. I remember writing a Minesweeper in it, with a friend.
19:07:58 <cpressey> No, that must have been Borland C.
19:08:08 <cpressey> TP was a little earlier than that.
19:11:22 <cpressey> In Turbo Pascal I remember writing a good chunk of a roguelike, but it was too ambitious and was never finished.
19:12:57 <fizzie> We wrote a good chunk of a tile-based mostly-a-roguelike (sort of Exile-inspired) with DJGPP and the Allegro lib, but that wasn't ever finished either. Oh, the foolishness.
19:16:41 <uorygl> You should have used libtcod!
19:16:52 <uorygl> Which, as Gregor can contest, is probably the most important library ever.
19:19:49 -!- oklopol has quit (Read error: Connection reset by peer).
19:20:15 -!- oklopol has joined.
19:56:12 -!- KingOfKarlsruhe has joined.
20:02:32 -!- jcp has quit (Quit: I will do anything (almost) for a new router.).
20:35:30 -!- MizardX- has joined.
20:38:16 -!- MizardX has quit (Ping timeout: 260 seconds).
20:38:29 -!- MizardX- has changed nick to MizardX.
20:39:48 -!- tombom has quit (Ping timeout: 264 seconds).
20:41:10 -!- tombom has joined.
21:12:51 <AnMaster> <Wareya> Borland delphi compiles to C code
21:13:16 <AnMaster> or at least didn't in delphi 7 or such
21:13:29 <AnMaster> when I used it (I was young and innocent, I didn't know better!)
21:14:57 <AnMaster> <uorygl> You should have used libtcod! <-- what was that library?
21:18:39 <tombom> http://doryen.eptalys.net/
21:18:45 <tombom> roguelike library, it's interesting
21:33:52 -!- gm|lap has joined.
21:47:13 -!- jcp has joined.
22:12:23 -!- MigoMipo has quit (Remote host closed the connection).
22:16:51 <uorygl> oklopol: sevenfold are the midnights that have passed since last Tuesday.
22:24:28 <uorygl> That's pretty much it.
22:24:55 <uorygl> Sevenfold are the capital letters on the fifth row of my keyboard.
22:26:10 <uorygl> Sevenfold are my irssi windows to the left of #haskell.
22:26:54 <uorygl> Thirty-twofold are my irssi windows to the right of #lojban.
22:27:47 <uorygl> Sevenfold are the English-speaking oceans of Puzzle Pirates, if you consider Ice and Crimson each half an ocean.
22:57:10 -!- coppro has joined.
22:57:57 -!- oklopol has quit (Read error: Operation timed out).
22:58:23 -!- oklopol has joined.
23:03:29 -!- augur has quit (Ping timeout: 245 seconds).
23:10:17 -!- cheater2 has quit (Ping timeout: 276 seconds).
23:19:24 -!- BeholdMyGlory has quit (Read error: Connection reset by peer).
23:21:53 -!- tombom has quit (Quit: Leaving).
23:26:13 -!- oklogon has joined.
23:28:26 -!- oklopol has quit (Remote host closed the connection).
23:29:58 -!- oklogon has quit (Read error: Operation timed out).
23:31:43 -!- KingOfKarlsruhe has quit (Remote host closed the connection).
23:37:38 -!- oklopol has joined.
23:55:00 -!- FireFly has quit (Quit: Leaving).