Segfault City

R

Richard Heathfield

[X-posted, and followups set]

I found something interesting on the Web today, purely by chance.

It would be funny if it weren't so sad. Or sad if it weren't so funny. I'm
not sure which.

http://www.developerdotstar.com/community/node/291

This "teacher of C" demonstrates his prowess with a masterful display of
incompetence in a 200-line program that travels as swiftly as possible to
Segfault City.

(Actually, using my normal gcc switches, it doesn't even get past TP3, but
it will at least compile if you just use gcc -o foo foo.c, after hacking it
around a bit to do things like mending the line-spanning single-line
comments and string literals, which - in fairness to the author - are
probably an artifact of the Webification of the code.)

I wonder how long I'll take to stop laughing.
 
K

Keith Thompson

Richard Heathfield said:
[X-posted, and followups set]

I found something interesting on the Web today, purely by chance.

It would be funny if it weren't so sad. Or sad if it weren't so funny. I'm
not sure which.

http://www.developerdotstar.com/community/node/291

This "teacher of C" demonstrates his prowess with a masterful display of
incompetence in a 200-line program that travels as swiftly as possible to
Segfault City.

(Actually, using my normal gcc switches, it doesn't even get past TP3, but
it will at least compile if you just use gcc -o foo foo.c, after hacking it
around a bit to do things like mending the line-spanning single-line
comments and string literals, which - in fairness to the author - are
probably an artifact of the Webification of the code.)

I wonder how long I'll take to stop laughing.

Interesting. I just tried it myself. Copy-and-pasting the program
was tedious, but once I did that there were no line-wrapping errors.
Perhaps it's a function of which browser you use.

Obviously the "//" comments won't work if you use strict C90 mode.

With "gcc -g -std=c99 -pedantic -Wall -W -O3 sieve.c -o sieve", I got:

sieve.c: In function `string2Number':
sieve.c:64: warning: comparison between signed and unsigned
sieve.c: In function `main':
sieve.c:202: warning: int format, time_t arg (arg 2)

The first is a comparison between an int and the result of strlen();
assuming no strings longer than 2**31-1 characters (on my 32-bit
system), this bug shouldn't cause any visible symptoms. Likewise, I
left the second bug in place, since both int and time_t happen to be
32-bit signed integers on the system I'm using. (If I were actually
going to use the program, I'd fix both bugs first.)

I got a quick seg fault when I ran it, because of the following really
dumb statement:

printf( strcat(strcat("Sieve of Eratosthenes primes from least prime >= %d ",
"to greatest prime <= %d\n"),
"Sieve contains %d entries\n"),
MAX(intStart, 3),
intFinish,
intSieveLimit );

Using "-fwritable-strings" avoided the seg fault, but messed up the
output (obviously it was still invoking undefined behavior).

I changed the above to use string literal catenation rather than
strcat():

printf( "Sieve of Eratosthenes primes from least prime >= %d "
"to greatest prime <= %d\n"
"Sieve contains %d entries\n",
MAX(intStart, 3),
intFinish,
intSieveLimit );

With that change, the program seems to work (its failure to indicate
that 2 is prime seems to be an intentional design flaw rather than a
coding error).

It's still a good example of ugly C (they're called argc and argv, not
intArgCount and strArgValues), and it could probably be written more
clearly in no more than half the space, but it's not nauseatingly bad.
 
A

Andrew Poelstra

[X-posted, and followups set]

I found something interesting on the Web today, purely by chance.

Just out of curiousity, did you stumble upon that while Googling your own
name? I'm not accusing you of arrogance, but it's interesting that he
mentions and insults you specifically in his preamble.
It would be funny if it weren't so sad. Or sad if it weren't so funny. I'm
not sure which.

http://www.developerdotstar.com/community/node/291

This "teacher of C" demonstrates his prowess with a masterful display of
incompetence in a 200-line program that travels as swiftly as possible to
Segfault City.

Ooh. Segfault City. Where all bad programs go to die. :)
(Actually, using my normal gcc switches, it doesn't even get past TP3, but
it will at least compile if you just use gcc -o foo foo.c, after hacking it
around a bit to do things like mending the line-spanning single-line
comments and string literals, which - in fairness to the author - are
probably an artifact of the Webification of the code.)

I wonder how long I'll take to stop laughing.

I stopped reading after the first function. I wasn't sure why he kept
casting chars to ints, as though there wasn't implicit casting going on
by default. Then he tested for > '9', which made no sense to me. Realizing
that I wouldn't be able to trace that logic, I stopped.

What, if anything, can it be guaranteed will be > '9' in standard C?
 
A

Alf P. Steinbach

* Richard Heathfield:
[X-posted, and followups set]

I found something interesting on the Web today, purely by chance.

It would be funny if it weren't so sad. Or sad if it weren't so funny. I'm
not sure which.

http://www.developerdotstar.com/community/node/291

This "teacher of C" demonstrates his prowess with a masterful display of
incompetence in a 200-line program that travels as swiftly as possible to
Segfault City.

(Actually, using my normal gcc switches, it doesn't even get past TP3, but
it will at least compile if you just use gcc -o foo foo.c, after hacking it
around a bit to do things like mending the line-spanning single-line
comments and string literals, which - in fairness to the author - are
probably an artifact of the Webification of the code.)

I wonder how long I'll take to stop laughing.

I can understand you responding, Rirchard, since the web page contains a
comment about you, but I think it would have been more helpful to Edward
Nilges if you'd just sent him a private e-mail pointing out some of the
errors, such as the use of strcat in

printf( strcat(strcat("The %s program calculates primes ",
"in a user-specifiable range. "),
"Use the following syntax: %s"),
strArgValues[0],
SYNTAX_REMINDER );

It's evident from the introductory text that Edward isn't a C
practitioner (e.g., he mentions how he had to figure out the declaration
syntax for arrays) and is used to more object-oriented languages, and
the code, such as the above, makes it painfully evident that he doesn't
have anybody doing quality assurance of the code -- which, one is led
to believe, is used in some C.Sc. course.

Perhaps he'd be glad to receive some help about that?


CC: (e-mail address removed), which I'm assuming is Edward G. Nilges.
 
A

Andrew Poelstra

["Followup-To:" header set to comp.lang.c.]
* Richard Heathfield:
[X-posted, and followups set]

I found something interesting on the Web today, purely by chance.

It would be funny if it weren't so sad. Or sad if it weren't so funny. I'm
not sure which.

http://www.developerdotstar.com/community/node/291

This "teacher of C" demonstrates his prowess with a masterful display of
incompetence in a 200-line program that travels as swiftly as possible to
Segfault City.

(Actually, using my normal gcc switches, it doesn't even get past TP3, but
it will at least compile if you just use gcc -o foo foo.c, after hacking it
around a bit to do things like mending the line-spanning single-line
comments and string literals, which - in fairness to the author - are
probably an artifact of the Webification of the code.)

I wonder how long I'll take to stop laughing.

I can understand you responding, Rirchard, since the web page contains a
comment about you, but I think it would have been more helpful to Edward
Nilges if you'd just sent him a private e-mail pointing out some of the
errors

Judging by the same comments, Edward Nilges has already receieved some
corrections from Richard and was less than happy about it:

"Richard acidulously explained my assisting John Nash with C as an
instance of the ape with the typewriter, in fact."
 
E

Eric Sosman

Andrew said:
[X-posted, and followups set]

I found something interesting on the Web today, purely by chance.


Just out of curiousity, did you stumble upon that while Googling your own
name? I'm not accusing you of arrogance, but it's interesting that he
mentions and insults you specifically in his preamble.

Oooh, what fun! Richard is the target of a vendetta!
He'd better check his bed for horses' heads -- or perhaps
he needn't bother; the vendettor seems like someone who's
better acquainted with the opposite end of the animal.
 
K

Keith Thompson

Andrew Poelstra said:
I stopped reading after the first function. I wasn't sure why he kept
casting chars to ints, as though there wasn't implicit casting going on
by default. Then he tested for > '9', which made no sense to me. Realizing
that I wouldn't be able to trace that logic, I stopped.

What, if anything, can it be guaranteed will be > '9' in standard C?

I probably would have if I'd read it before compiling it.

Here's the function you're probably talking about:
========================================
// Convert character to its numeric form
//
//
int char2Number( char chrInChar )
{
int intInCharValue = ( int )chrInChar;
int intZeroValue = ( int )'0';
if ( intInCharValue < intZeroValue
||
intInCharValue > ( int )'9' ) return -1;
return intInCharValue - intZeroValue;
}
========================================

If something is < '0' or > '9', it's not a digit, and the function
returns -1 as an error indication.

On first glance, I assumed that something that size would convert a
string to an integer ("123" --> 123). Then I realized it only
converts a single character.

It's really impressive how ugly this manages to be without actually
being incorrect.

I might have to read the rest of this thing, but I don't think I'll
burden the newsgroup with a critique that would probably be several
times as long as the actual code.
 
J

Jack Klein

* Richard Heathfield:
[X-posted, and followups set]

I found something interesting on the Web today, purely by chance.

It would be funny if it weren't so sad. Or sad if it weren't so funny. I'm
not sure which.

http://www.developerdotstar.com/community/node/291

This "teacher of C" demonstrates his prowess with a masterful display of
incompetence in a 200-line program that travels as swiftly as possible to
Segfault City.

(Actually, using my normal gcc switches, it doesn't even get past TP3, but
it will at least compile if you just use gcc -o foo foo.c, after hacking it
around a bit to do things like mending the line-spanning single-line
comments and string literals, which - in fairness to the author - are
probably an artifact of the Webification of the code.)

I wonder how long I'll take to stop laughing.

I can understand you responding, Rirchard, since the web page contains a
comment about you, but I think it would have been more helpful to Edward
Nilges if you'd just sent him a private e-mail pointing out some of the
errors, such as the use of strcat in

printf( strcat(strcat("The %s program calculates primes ",
"in a user-specifiable range. "),
"Use the following syntax: %s"),
strArgValues[0],
SYNTAX_REMINDER );

It's evident from the introductory text that Edward isn't a C
practitioner (e.g., he mentions how he had to figure out the declaration
syntax for arrays) and is used to more object-oriented languages, and
the code, such as the above, makes it painfully evident that he doesn't
have anybody doing quality assurance of the code -- which, one is led
to believe, is used in some C.Sc. course.

Perhaps he'd be glad to receive some help about that?

Nilges is a bombastic, pedantic, and quite ignorant troll who used to
spew a lot of nonsense into comp.programming, and perhaps other groups
that I do not read regularly.

Perhaps he still does, I haven't seen any of his arrogant gibberish
since I added him to my kill file, long ago.
 
F

Friedrich Dominicus

Alf P. Steinbach said:
* Richard Heathfield:
[X-posted, and followups set]
I found something interesting on the Web today, purely by chance.
It would be funny if it weren't so sad. Or sad if it weren't so
funny. I'm not sure which.
http://www.developerdotstar.com/community/node/291
This "teacher of C" demonstrates his prowess with a masterful
display of incompetence in a 200-line program that travels as
swiftly as possible to Segfault City.
(Actually, using my normal gcc switches, it doesn't even get past
TP3, but it will at least compile if you just use gcc -o foo foo.c,
after hacking it around a bit to do things like mending the
line-spanning single-line comments and string literals, which - in
fairness to the author - are probably an artifact of the
Webification of the code.)
I wonder how long I'll take to stop laughing.

I can understand you responding, Rirchard, since the web page contains
a comment about you, but I think it would have been more helpful to
Edward Nilges if you'd just sent him a private e-mail pointing out
some of the errors, such as the use of strcat in
Hardly I suggest you search for Nilges posts in the past and then you
know why Richard did what he did.
Perhaps he'd be glad to receive some help about that?
I doubt that really. He has shown a complete lack of insight in the
past. I doubt it has changed.

Regards
Friedrich
 
A

Andrew Poelstra

I probably would have if I'd read it before compiling it.

Here's the function you're probably talking about:
========================================
// Convert character to its numeric form
//
//
int char2Number( char chrInChar )
{
int intInCharValue = ( int )chrInChar;
int intZeroValue = ( int )'0';
if ( intInCharValue < intZeroValue
||
intInCharValue > ( int )'9' ) return -1;
return intInCharValue - intZeroValue;
}
========================================

If something is < '0' or > '9', it's not a digit, and the function
returns -1 as an error indication.

On first glance, I assumed that something that size would convert a
string to an integer ("123" --> 123). Then I realized it only
converts a single character.

It's really impressive how ugly this manages to be without actually
being incorrect.

I might have to read the rest of this thing, but I don't think I'll
burden the newsgroup with a critique that would probably be several
times as long as the actual code.

I missed the "< '0'" because he disguised '0' behind a temp variable.
Indeed, 'tis ugly but not incorrect.
 
F

Friedrich Dominicus

Friedrich Dominicus said:
Hardly I suggest you search for Nilges posts in the past and then you
know why Richard did what he did.
Well here's one message in which Nilges shows his "knowledge" in C:
http://groups.google.de/group/comp....="#define+MALLOCSTMT"&rnum=1#9860a66e44c4c65d

Agreed it's a terrible link but look google for
#define MALLOCSTMT and you'll find it.

Around that same time he has posted some other severly broken code and
blaimed C for it. Ah threads with Nilges tend to get a bit large over
time.

Regards
Friedrich
 
A

Al Balmer

I can understand you responding, Rirchard, since the web page contains a
comment about you, but I think it would have been more helpful to Edward
Nilges if you'd just sent him a private e-mail pointing out some of the
errors, such as the use of strcat in

<giggle> It's Nilges? You probably don't know, Alf, but people have
been helpfully pointing out his errors for years. So far, it's had no
discernible effect.
 
S

spibou

Keith said:
Richard Heathfield said:
[X-posted, and followups set]

I found something interesting on the Web today, purely by chance.

It would be funny if it weren't so sad. Or sad if it weren't so funny. I'm
not sure which.

http://www.developerdotstar.com/community/node/291

This "teacher of C" demonstrates his prowess with a masterful display of
incompetence in a 200-line program that travels as swiftly as possible to
Segfault City.

(Actually, using my normal gcc switches, it doesn't even get past TP3, but
it will at least compile if you just use gcc -o foo foo.c, after hacking it
around a bit to do things like mending the line-spanning single-line
comments and string literals, which - in fairness to the author - are
probably an artifact of the Webification of the code.)

I wonder how long I'll take to stop laughing.

Interesting. I just tried it myself. Copy-and-pasting the program
was tedious, but once I did that there were no line-wrapping errors.
Perhaps it's a function of which browser you use.

If you try the printer friendly version of the page copy and pasting
is easy with no line-wrapping.
I got a quick seg fault when I ran it, because of the following really
dumb statement:

printf( strcat(strcat("Sieve of Eratosthenes primes from least prime >= %d ",
"to greatest prime <= %d\n"),
"Sieve contains %d entries\n"),
MAX(intStart, 3),
intFinish,
intSieveLimit );

Using "-fwritable-strings" avoided the seg fault, but messed up the
output (obviously it was still invoking undefined behavior).

I changed the above to use string literal catenation rather than
strcat():

printf( "Sieve of Eratosthenes primes from least prime >= %d "
"to greatest prime <= %d\n"
"Sieve contains %d entries\n",
MAX(intStart, 3),
intFinish,
intSieveLimit );

His use of strcat was very puzzling for me. Even if he doesn't know
that the compiler will concatenate strings why not use multiple
printf's ? The use of nested strcat's make it a lot less readable even
if it was working.
With that change, the program seems to work (its failure to indicate
that 2 is prime seems to be an intentional design flaw rather than a
coding error).

I haven't tried compiling it but I tried to read it and understand it.
After
a while I gave up. His general verbosity and use of Hungarian notation
in particular made it unreadable for me. Based on what I could
understand
I doubt that it actually implements Eratosthenes's sieve. Here's a
programme which does:

#include <stdio.h>
#define LIMIT 1000

int main() {
int sieve[LIMIT+1] , i , j ;

for (i=2 ; i<=LIMIT ; i++) sieve=1 ;

for (i=2 ; i <= LIMIT/2 ; i++) {
for (j=2 ; i*j <= LIMIT ; j++) {
sieve[i*j] = 0 ;
}
}
for (i=2 ; i<=LIMIT ; i++) {
if (sieve) printf("%d\n",i) ;
}
}

Spiros Bousbouras
 
R

Richard Heathfield

Andrew Poelstra said:
[X-posted, and followups set]

I found something interesting on the Web today, purely by chance.

Just out of curiousity, did you stumble upon that while Googling your own
name? I'm not accusing you of arrogance,

....just of self-indulgence. Yes, I was actually looking for a specific Terry
Pratchett quote. I knew it was on a page of quotations that /also/ quoted
something by me, but that's all I could remember, so I googled for my name
+ quote and Google showed me:

Wayne's World of C Code (The Sieve of Eratosthenes) | developer ...
[Richard Heathfield and his team have some good advice in his book, ... I
wish I could quote the whole column (or link to it--it's not available
online), ...
www.developerdotstar.com/community/node/291 - 59k - Cached - Similar pages

which looked promising, but alas, turned out to be junk after all.

I stopped reading after the first function. I wasn't sure why he kept
casting chars to ints, as though there wasn't implicit casting going on
by default. Then he tested for > '9', which made no sense to me. Realizing
that I wouldn't be able to trace that logic, I stopped.

What, if anything, can it be guaranteed will be > '9' in standard C?

UCHAR_MAX + 1.0, I think, although if you have really amazingly colossal
chars you might manage to break it.
 
L

lovecreatesbeauty

Keith said:
Here's the function you're probably talking about:
// Convert character to its numeric form
int char2Number( char chrInChar )
{
int intInCharValue = ( int )chrInChar;
int intZeroValue = ( int )'0';
if ( intInCharValue < intZeroValue
||
intInCharValue > ( int )'9' ) return -1;
return intInCharValue - intZeroValue;
}

If something is < '0' or > '9', it's not a digit, and the function
returns -1 as an error indication.

Char constant expressions '9' or '0' are type of int. Even if
they aren't, they will be promoted as type of int in the operations.
I'm not very clear on that, could you please give more hints?

And how do you feel about the following code snippet?

int ctoi(char c)
{
int i = -1;
if (c >= '0' && c <= '9')
{
i = c - '0';
}
return i;
}

lovecreatesbeauty
 
P

pemo

Andrew said:
["Followup-To:" header set to comp.lang.c.]
* Richard Heathfield:
[X-posted, and followups set]

I found something interesting on the Web today, purely by chance.

It would be funny if it weren't so sad. Or sad if it weren't so
funny. I'm not sure which.

http://www.developerdotstar.com/community/node/291

This "teacher of C" demonstrates his prowess with a masterful
display of incompetence in a 200-line program that travels as
swiftly as possible to Segfault City.

(Actually, using my normal gcc switches, it doesn't even get past
TP3, but it will at least compile if you just use gcc -o foo foo.c,
after hacking it around a bit to do things like mending the
line-spanning single-line comments and string literals, which - in
fairness to the author - are probably an artifact of the
Webification of the code.)

I wonder how long I'll take to stop laughing.

I can understand you responding, Rirchard, since the web page
contains a comment about you, but I think it would have been more
helpful to Edward Nilges if you'd just sent him a private e-mail
pointing out some of the errors

Judging by the same comments, Edward Nilges has already receieved some
corrections from Richard and was less than happy about it:

"Richard acidulously explained my assisting John Nash with C as an
instance of the ape with the typewriter, in fact."

I followed the link, but alas couldn't find any such comment from Richard.
 
R

Richard Heathfield

(e-mail address removed) said:
I doubt that it actually implements Eratosthenes's sieve. Here's a
programme which does:

#include <stdio.h>
#define LIMIT 1000

int main() {
int sieve[LIMIT+1] , i , j ;

for (i=2 ; i<=LIMIT ; i++) sieve=1 ;

for (i=2 ; i <= LIMIT/2 ; i++) {
for (j=2 ; i*j <= LIMIT ; j++) {
sieve[i*j] = 0 ;
}
}
for (i=2 ; i<=LIMIT ; i++) {
if (sieve) printf("%d\n",i) ;
}
}


A good start, and a fine jumping-off point from which to start looking for
optimisations. (Because the Sieve is O(n*n), optimisations are actually
worth doing.)

For example, cutting down the number of times the inner loop is executed is
useful.

Here's an interesting fact about prime numbers for you:

Given any number-that-divides-by-6, n, we have the following cases:

n - multiple of 2, 3
n + 1 - might be prime
n + 2 - multiple of 2
n + 3 - multiple of 3
n + 4 - multiple of 2
n + 5 - might be prime

So if n >= 6 and n % 6 == 0, we can throw away two thirds of the cases
without even trial-dividing them.
 
S

spibou

Richard said:
(e-mail address removed) said:
I doubt that it actually implements Eratosthenes's sieve. Here's a
programme which does:

#include <stdio.h>
#define LIMIT 1000

int main() {
int sieve[LIMIT+1] , i , j ;

for (i=2 ; i<=LIMIT ; i++) sieve=1 ;

for (i=2 ; i <= LIMIT/2 ; i++) {
for (j=2 ; i*j <= LIMIT ; j++) {
sieve[i*j] = 0 ;
}
}
for (i=2 ; i<=LIMIT ; i++) {
if (sieve) printf("%d\n",i) ;
}
}


A good start, and a fine jumping-off point from which to start looking for
optimisations. (Because the Sieve is O(n*n), optimisations are actually
worth doing.)

For example, cutting down the number of times the inner loop is executed is
useful.

Here's an interesting fact about prime numbers for you:

Given any number-that-divides-by-6, n, we have the following cases:

n - multiple of 2, 3
n + 1 - might be prime
n + 2 - multiple of 2
n + 3 - multiple of 3
n + 4 - multiple of 2
n + 5 - might be prime

So if n >= 6 and n % 6 == 0, we can throw away two thirds of the cases
without even trial-dividing them.


I see no direct way of using this but there is an obvious improvement
to be made.

#include <stdio.h>
#define LIMIT 1000

int main() {
int sieve[LIMIT+1] , i , j ;

for (i=2 ; i<=LIMIT ; i++) sieve=1 ;

for (i=2 ; i <= LIMIT/2 ; i++) {
if (!sieve) continue ;
for (j=2 ; i*j <= LIMIT ; j++) {
sieve[i*j] = 0 ;
}
}
for (i=2 ; i<=LIMIT ; i++) {
if (sieve) printf("%d\n",i) ;
}
}

I wonder what's the complexity of this. O(n*logn) perhaps ?

Spiros Bousbouras
 
S

spinoza1111

Alf said:
* Richard Heathfield:
[X-posted, and followups set]

I found something interesting on the Web today, purely by chance.

It would be funny if it weren't so sad. Or sad if it weren't so funny. I'm
not sure which.

http://www.developerdotstar.com/community/node/291

This "teacher of C" demonstrates his prowess with a masterful display of
incompetence in a 200-line program that travels as swiftly as possible to
Segfault City.

(Actually, using my normal gcc switches, it doesn't even get past TP3, but
it will at least compile if you just use gcc -o foo foo.c, after hacking it
around a bit to do things like mending the line-spanning single-line
comments and string literals, which - in fairness to the author - are
probably an artifact of the Webification of the code.)

I wonder how long I'll take to stop laughing.

I can understand you responding, Rirchard, since the web page contains a
comment about you, but I think it would have been more helpful to Edward
Nilges if you'd just sent him a private e-mail pointing out some of the
errors, such as the use of strcat in

printf( strcat(strcat("The %s program calculates primes ",
"in a user-specifiable range. "),
"Use the following syntax: %s"),
strArgValues[0],
SYNTAX_REMINDER );

It's evident from the introductory text that Edward isn't a C
practitioner (e.g., he mentions how he had to figure out the declaration
syntax for arrays) and is used to more object-oriented languages, and

Actually, I started in machine language. And as it happened I had to
refigure the syntax since I had (briefly) started re-using C.
the code, such as the above, makes it painfully evident that he doesn't
have anybody doing quality assurance of the code -- which, one is led
to believe, is used in some C.Sc. course.

You are clearly a loser. You don't even know that a professional would
not feel right about using a management puff phrase like "quality
assurance" (which usually and in practice means the eradication of
anything like quality) but would instead post reasons why he felt the
code to be incorrect. It may be (code is like that) but after several
months' hiatus I see nothing wrong.

The code ran on the Navia compiler. Do illumine us.
Perhaps he'd be glad to receive some help about that?

Not from people whose main interest is establishing their shaky
self-confidence exclusively on sand (silicon) by tearing down others.

Who are afraid to make CONSTRUCTIVE suggestions for modification, since
they might recursively be flamed because when you make a CONSTRUCTIVE
suggestion it contains other than negative assertions, and each one is
recursively subject to lampoon by people as "wrong" who cannot even say
why in clear English, but must instead refer to the idiosyncrasies of
their favorite compiler.

This discussion is useless. I have written enough code to be far more
interested in my competence in more important areas of life (such as
common decency) than "competing" with thugs...who were not invited to
post at a moderated site, and will be excluded should they choose to do
so in this matter by the moderator.
 

Members online

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,236
Members
46,825
Latest member
VernonQuy6

Latest Threads

Top