Caesar

Ok so I’m a crazy stooge !

I spent the night trying to evade my allergies by implementing a simple rot13 program based on some super-short implemnetations of the algorithm from USENET.

Shes got interactive and file based rot13, a -r option set up to use a different rotation then 13… but I havn’t implemented those yet hehehe.

Had a lot of fun working on it and learned a few things while working on the manual page that even let me clean up rf.1 !

Diff and Patch

Tests have shown, that using diff to create a patch file and using the patch file to patch the origenal. Have been largly successful so long as the origenal has not been edited since the diff was made.

rf.c

Well I’ve done some correcting to my little back scratcher, including two bug fixes and changes to the man page.

/*-
* Copyright (C) 2007
* Terry *. P*****. All rights reserved.
*
* permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/


// vim: set noexpandtab ts=8 sw=4 ai :
// vi: set ai nu ts=8 sw=4 :

#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <unistd.h>

struct lnpos {
long nl;
struct lnpos *next;
};

static void readall( FILE *, int );
static void readtop( FILE *, int );
static void readbottom( FILE *, int );
static void usage( void );

/*
* rf - read file to standard out v1.1
*/

int
main( int argc, char *argv[] ) {

char *erptr;
int t_flag = 0, b_flag = 0;
int ch, lncnt;
FILE *fp;

extern char *optarg;
extern int optind;
extern int optopt;
extern int opterr;
extern int optreset;

while ( (ch = getopt(argc, argv, "b:t:")) != -1 ) {
switch (ch) {
case 'b':
b_flag++;
lncnt = strtol(optarg, &erptr, 10);
if ( *erptr || lncnt <= 0 )
errx( 1, "Improper line count -- %s", optarg );
break;
case 't':
t_flag++;
lncnt = strtol(optarg, &erptr, 10);
if ( *erptr || lncnt <= 0 )
errx( 1, "Improper line count -- %s", optarg );
break;
case '?':
default:
usage();
return 1;
}
}

if ( (t_flag < 1) && (b_flag < 1) ) {
fp = fopen( argv[1], "r" );
if ( fp == NULL )
errx( 1, "File can not be opened or"
" does not exist -- %sn", argv[1] );
readall( fp, lncnt );
} else if ( t_flag > 0 ) {
fp = fopen( argv[3], "r" );
if ( fp == NULL )
errx( 1, "File can not be opened or"
" does not exist -- %sn", argv[3] );
readtop( fp, lncnt );
} else if ( b_flag > 0 ) {
fp = fopen( argv[3], "r" );
if ( fp == NULL )
errx( 1, "File can not be opened or"
" does not exist -- %sn", argv[3] );
readbottom( fp, lncnt );
} else {
usage();
/* NOTREACHED */
}

fclose( fp );
return 0;
}

/*
* print out an open file to standard output
*/

static void
readall( FILE *fp, int lncnt ) {

while ( (lncnt = fgetc( fp )) != EOF ) {
printf( "%c", lncnt );
}
}

/* Read n lines from the top of the file.
* note that it was very inspired by the head(1) implementation of BSD
*/
static void
readtop( FILE *fp, int lncnt ) {

char *cp;
size_t error, rlen;
while ( lncnt && (cp = fgetln( fp, &rlen )) != NULL ) {
error = fwrite( cp, sizeof(char), rlen, stdout );
if ( error != rlen )
err( 1, "stdout" );
lncnt--;
}
}


/* Read n lines from the bottom of the file
*/
static void
readbottom( FILE *fp, int lncnt ) {

int hmany = lncnt;
long nlnum = 0;
long where;

struct lnpos *root;
struct lnpos *cur;

root = malloc( sizeof(struct lnpos) );
if ( root == NULL )
err( 1, "can't init the list" );
root->next = 0;
cur = root;

cur->next = malloc( sizeof(struct lnpos) );
if ( cur->next == NULL )
err( 1, "can't add nodes" );
cur = cur->next;

/* read the file, count every 'n' and store them in a new member of
* our linked list.
*/
while ( (lncnt = fgetc( fp )) != EOF ) {
if ( lncnt == 'n' ) {
nlnum++;
cur->nl = ftell( fp );
if ( cur->next != NULL )
cur = cur->next;
cur->next = malloc( sizeof(struct lnpos) );
if ( cur->next == NULL )
err( 1, "can't add nodes" );
cur = cur->next;
}
}

/* rewind our linked-list and seek to b_flag + 1 segments short of the
* end of the list _before_ calling readall. So readall _starts_ from
* the correct fseek offset to print till EOF.
*/
cur = root->next;
hmany++;
while ( hmany < nlnum ) {
cur = cur->next;
nlnum--;

}

where = fseek( fp, cur->nl, SEEK_SET );
if ( where != 0 )
err( 1, "could not seek through the filen" );

readall( fp, lncnt );
}

static void
usage( void ) {
fprintf( stderr, "usage:n rf filen "
"rf [-t number lines from the top] filen "
"rf [ -b number of lines from the bottom ] [ file ]n" );
}

And the manual which writing got me interested in roff, I’ll post when I have time to learn more about it. Basically the problem I had was caused by working on it. Originally under the conditions when 2 + 2 = 5 which is not good, because 2 + 2 is really == 4 !!!! I should never do stuff when I’m like that, but if I don’t try nothing gets done.

Go, what?

Well, to day I was working on some file. And for the first time I asked my self if I should use a ‘Goto’. The goto statement is probably one of the most controversial things I’ve ever read of in computing history.

The problem was, I had the option of repeating several lines of code at several conditionals in a if-elif-else construct. I thought about using a goto to walkk on over to that. So as to only right it once. When I asked my self, Do I even remember the syntax for a Goto ! LMAO !!! I can’t even ever remember using a Go to in any language. The only time I recall learning about using was breifly in an historical C tutorial by by Brian W. Kernighan. Then I thought, since I didn’t want to clutter things by getting repetitive – Why not get off my lazy arse and wrap it in a function?

Really the only purpose of using goto often I could see would be to avoid using functions at all. The best usage of it I can see, which could still be wrapped in a function if wanted. Although I’m sure thats not always best. I don’t see any thing wrong with goto, but I don’t see it as an excuse not to use functions, if-elif-else, switch/case, for/while/do-while e.t.c. what ever constructs the language provides.

I think, in my opinion this would be a good clause to use the ‘infernal goto’

for condintion
do
code
if true
goto handle
else
skip
A number of things like this and eventually

handle:
code to handle false
done

As a method of keeping some exception handling at the end of a loop rather then packing it some where with a nice interface or some thing. I dunno, personally I like doing things in a manor that I know is crystal clear.

For example, column stacking on a door for a bang & clear. It should be clear as can be who is banging, who is openning, and which one enters first, e.t.c.

Post it for the future.

http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

Some times I dislike being the only one in this burg I know. With a passion for computers and coding in my age group…

Sheesh man, I was in diapers with a Tandy 1000 and TRS-80 Colour Computer for toys. WebTV introduced me to the World Wide Web. A Computer donated from our Church showed me Windows 98 and got me doing like 8+ hour a day learning stuff via Earthlink Dialup.

Look at me now? I’ll be 19 this June. 3 Computers, desktop, desktop turned server, and laptop. Plus Ma’s desktop. Stuck living with Windows often. Yet I breath naturally on my FreeBSD / PC-BSD systems. Feels good to long into FreeBSD even if its through PuTTY at times.

No clue wtfrig I started learning programming, I don’t even care much for C++ in retrospect. Yet I love C !!! GO figure. When I get to a working vacation in July. I plan on boning up on Pythons standard library. I’m only very familer at that level with C and some of the BSD / POSIX extensions on my system. Most of which, I rather like…

Learning to do stuff at CLI levels, learning, understanding, and mastering complexity == heaven. Flib it, man I don’t even _use_ an _IDE_ as most call it. I started with Dev-C++ now? My little bag of tricks. Vi, Vim, Ex, I can use Emacsen but prefer Visen ;-). GCC, the only compiler I’ve ever used but I like it so far. Although I wish it’d be better at reminding me that I transposed a , /or . although thats a font and many lines later issue. I’ve found using GCC from the command line much more flexible. GDB for debugging, skip the GUI ! Lint for simplistic code checking, ctags for larger stuff. A bloody fine manual for system calls, the standard library, and ncurses. A very good Bourne Shell implementation for scripting and many choices. BSD & GNU make, and a number of other things I’ve yet to learn like groff and automake.

Most people my age? Ask’em what C Programming is and they’d probably say forging report cards ! Most probably wouldn’t even know what the HTML in index.html stands for.. A lot of my friends are not even the most computer literate.

I’ve been told in my youth that my mind was like some one older then my years… But I’ve always valued my uniqueness. How many lusers do you know. Who’d manufacture their own fscking mother board & write device drivers as necessary for if they only knew how !!!!!!!!!!!!! Ok , so I’m a crazy lune… can’t help that. But, GOD, I Love to learn about stuff that gets my interest. He’s blessed me so much with being able to learn as much as I have. Odds are, if it wasn’t for that one computer Robert gave me. When he heard ma wouldn’t let me repartion & dual boot ma’s computer. I probably never would have gotten into *nix systems as much as I have. If my sister didn’t get me my laptop. I’d probably never been able to learn this much for programming. Its been a great blessing, one that I’m very thankful for. To me, its a joy to learn some thing new and interesting every day. I’d be happy some day, to know as much about computers as Mel Kaye did lol.

Yet still… who do I have to share this passion with? Mm, no one…….

Thats what pains me lately.

read file

This is a little thing I’ve been working on this month. Its made to simulate the behavior of ‘cat file’ and ‘head -n’ / ‘tail -n’ more or less scratch a little itch. It works very simple as its supposed to be simple. It parses arguments taking a count to its -t and -b switches. It looks through argv till it finds a file to open. It’ll read the entire file out, if it’s given the -t switch it will read out up to the count its given. If its given the -b switch, it will read the entire file. Store the location of every newline in a linked-list. Then rewind the list, seek to the specified location (plus padding) and print out the end of the remainder of the file.

Heres a straight copy & paste of it. Portability wise it assumes that the file is in the correct format and requires a number of functions that first appeared in BSD 4.x, namely getopts, fgetln, and err/errx. It also presumes that their should be enough room to store the location of every newline in the file within memory. So if one only has 64K of RAM, it might be a problem to read a few files xD.

I can’t say if its well written or not… I don’t know of any program with my system that does exactly this other then what this simulates. Rather then wrap around cat/head/tail using system() or including the sources I worked through this as a learning experience. Its more or less written in the style I prefer, the type on a line of its own bit in function declarations is the only ‘real’ part of it stemming from my occasional reads of stuff in /usr/src alone.

/*
* rf read file to standard out
*/

// vim: set noexpandtab ts=8 sw=4 ai :
// vi: set ai nu ts=8 sw=4 :

#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <unistd.h>


static void readall( FILE *, int );
static void readtop( FILE *, int );
static int readbottom( FILE *, int );
static void usage( void );

struct lnpos {
long nl;
struct lnpos *next;
};

int
main( int argc, char *argv[] ) {

char *erptr;
int t_flag = 0, b_flag = 0;
int ch, lncnt;
FILE *fp;

extern char *optarg;
extern int optind;
extern int optopt;
extern int opterr;
extern int optreset;

while ( (ch = getopt(argc, argv, "b:t:")) != -1 ) {
switch (ch) {
case 'b':
b_flag++;
lncnt = strtol(optarg, &erptr, 10);
if ( *erptr || lncnt <= 0 )
errx( 1, "Improper line count -- %s", optarg );
break;
case 't':
t_flag++;
lncnt = strtol(optarg, &erptr, 10);
if ( *erptr || lncnt <= 0 )
errx( 1, "Improper line count -- %s", optarg );
break;
case '?':
default:
usage();
return 1;
}
argc -= optind;
argv += optind;
}


/* loop through cli args and find a file to open */
for ( int i = 0; i <= argc; i++ ) {
fp = fopen( argv[i], "r" );
if ( fp == NULL )
err( 1, "File does not exist or could not be opened "
"for reading -- %s", optarg );
}

if ( (t_flag < 1) && (b_flag < 1) ) {
readall( fp, lncnt );
} else if ( t_flag > 0 ) {
readtop( fp, lncnt );
} else if ( b_flag > 0 ) {
readbottom( fp, lncnt );
} else {
errx( 1, "flag processing failed" );
}

fclose( fp );
return 0;
}

/*
* print out an open file to standard output
*/

static void
readall( FILE *fp, int lncnt ) {

while ( (lncnt = fgetc( fp )) != EOF ) {
printf( "%c", lncnt );
}
}

/* Read n lines from the top of the file.
* note that it was very inspired by the head(1) implementation of BSD
*/
static void
readtop( FILE *fp, int lncnt ) {

char *cp;
size_t error, rlen;
while ( lncnt && (cp = fgetln( fp, &rlen )) != NULL ) {
error = fwrite( cp, sizeof(char), rlen, stdout );
if ( error != rlen )
err( 1, "stdout" );
lncnt--;
}
}


/* Read n lines from the bottom of the file
* This function really should be broken up - but I have not learned how yet.
*/
static int
readbottom( FILE *fp, int lncnt ) {

char *cp;
int hmany = lncnt;
long nlnum = 0;
long where;
size_t error, rlen;

struct lnpos *root;
struct lnpos *cur;

root = malloc( sizeof(struct lnpos) );
if ( root == NULL )
err( 1, "can't init the list" );
root->next = 0;
cur = root;

cur->next = malloc( sizeof(struct lnpos) );
if ( cur->next == NULL )
err( 1, "can't add nodes" );
cur = cur->next;

/* read the file, count every 'n' and store them in a new member of
* our linked list.
*/
while ( (lncnt = fgetc( fp )) != EOF ) {
if ( lncnt == 'n' ) {
nlnum++;
cur->nl = ftell( fp );
if ( cur->next != NULL )
cur = cur->next;
cur->next = malloc( sizeof(struct lnpos) );
if ( cur->next == NULL )
err( 1, "can't add nodes" );
cur = cur->next;
}
}

/* rewind our linked-list and seek b_flag + 1 segments short of the
* end of the list.
*/
cur = root->next;
hmany++;
while ( hmany < nlnum ) {
cur = cur->next;
nlnum--;

}

where = fseek( fp, cur->nl, SEEK_SET );
if ( where != 0 )
err( 1, "could not seek through the filen" );

while ( lncnt && (cp = fgetln( fp, &rlen )) != NULL ) {
error = fwrite( cp, sizeof(char), rlen, stdout );
if ( error != rlen )
err( 1, "stdout" );
lncnt--;
cur = cur->next;
if ( cur->next == 0 )
return 0;
}
return 0;
}


static void
usage( void ) {
fprintf( stderr, "usage:n rf filen "
"rf [-t number lines from the top] filen "
"rf [ -b number of lines from the bottom ] [ file ]n" );
}


Any comments about the file it self or its design is much welcome by this moron who tries to teach him self.

Well I found the anwser to my problem by kicking around rather then kicking my self.

(t_flag < 1) && (b_flag < 1) *not* ((t_flag) && (b_flag) < 1) *smacks self* sleepy idiot !

late night

Well I spent an interessting night, still havn’t solved the issue of whats wrong but I did accomlish a few things. Better code checking with gcc How to use lint How to use the GNU Debugger Personally I think that graphical front ends can have some very great advantages. But one should be able to use the basic tools by hand when/if necessary. As being able to live in a shell (no gui enviroment) is a part of my studies. So Being able to use a debugger on the CLI is important to me. Oh well each in turn. Most IDE’s provide some sort of user interface to wrap around the make and debuging tools. The basic idea that most compilers (so I’ve heard) follow including the GNU Compiler Collection gcc/g++ (gnu c/c++ compiler) use. Are as follows. gcc source.file -o outfile Now we don’t need the -o outfile if we like for example to compile our source.file into an execuitable named a.out in this case ! With the -o option we can choose a name for the execuitable. So ‘gcc rf.c -o rf’ would create an executible named ‘rf’ instead of ‘a.out’ from our rf.c source file. Is this any harder then Build->Compile in an IDE /w a mouse? Not really in my humble opinoin. Especially if you can sider that CLI access is embedded in many editors and many editors work in the CLI. Lets turn on some simple warnings gcc source.file -Wall -o outfile Now while one might argue any code that compiles and works is good enough. But what if it doesn’t work as exspected or it’s not very good? The -Wall option will at least give us a stronger warnings and errors about bad practices. Since -Wall turns on a bunch of warnings I’ll walk through some of them at the end. I personally have used -Wall since I found out there was an all switch (Thank you FreeBSD KNF Style manual!). And when it trips a warning message it usually reminds me I’m doing some thing wrong or I need to go correct a magic typomatical error. I noticed a few other niffty things in the OpenBSD KNF style guide. gcc -Wall -W -Wpointer-arith -Wbad-function-cast source.file -o outfile Gives us plenty of useless-to-semi-useful-to-useful information at times. Theres even more options. Since this is a lot more to type and I’m to lazy to whip up a little Makefile for all my stuff. I made a shell alias for it. I think its worth while to explore the available warning options and sort them as one needs. Note to self, work on some Makefile templets. Another intereing tool I always wanted to toy with, is lint. lint is a code checker for trying to detect features in C sources that are likely to be bugs, non-portable, or wasteful, e.t.c. The lint program h as a good enouhg manual which documents its command line switches but the basic useage is. lint source.c So far I like the -cehuz options most often and have an alias for it. And the -s and -p options from time to time have use hehehe. One thing I found odd about lint, is that it complaned about my // comments. rf.c(5): warning: ANSI C does not support // comments [312] Normally I use only /**/ comments and occasionally a few // in C++. Or I’ll mix /**/ and // comments if I’m leaving my self comments of diffrent types in a non-source file. Like /* Change done to something */ What I changed // Note for later for a meeting about it When I’m writing up files for things as I do’em. In this partuclar file how ever, since rf.c has been floating between systems a bit and editors I placed a pair of mode lines in it to set some options for my editors.

/*
* rf read file to standard out
*/

// vim: set noexpandtab ts=8 sw=4 ai :
// vi: set ai nu sw=4 :

Basically turn on line numbering in Vi and make sure my indentation settings are consistant, then turn on auto-indent in case I want it. (I don’t often use it). I remember, why I started using strictly /* Comments */ when I had always used // comments before. Was because I was told that some (older) compilers had problems with the newer // Comments. To use the GNU Debugger gdb to debug a program, first we need to enable the debugging symbols in GCC. We can do this by appending a -ggdb option some where in our compilation. gcc -Wall source.c -o outfile -ggdb Then we can run gdb outfile to start the debugger. At first when I tried looking at the debugger ages ago I didn’t have much luck with it. But after reading the manual like I usually do _before_ toying with CLI software it makes much more sense. You can get a topic list by typing help and more specific help like help breakpoints With GDB we can step through the program line by line, set break points at lines and/or functions. Examine data since as what value does variable foo have ? Run backtraces, look at the stack, set the command line arguments and all kinds of stuff. Really GDB deserves its own attention to the subject. Its long been my practice to save and pump code through GCC every few minutes or routines just to see if I missed any syntax errors I may have made. You don’t want to know how many times I’ve been preplexed just because I used a comma instead of a period or a period instead of a comma. And after hours infront of an editor couldn’t see the difference in my font lol – yes I am looking for a better fixed-width font ^_^ Now with lint and the various options of GCC I can do more for less 🙂 Since trying todo ANY THING during day light is pointless in this family. And trust me, when your the kind that inhales good manuals. And it takes you 30 minutes just to get through the first paragraph of a manual on PHP Syntax you know you have a fucking problem. So si nce I can’t code during the day. I have to do it late at night and I can’t do shit for long. So like 0735 in the morning these tools do kind of help me correct errors. From man 1 gcc Warnings are diagnostic messages that report constructions which are not inherently erroneous but which are risky or suggest there may have been an error. The -Wall option I listed turns on all this according to the manual Warn whenever a declaration does not specify a type. Warn whenever a function is used before being declared. Warn if the main function is declared or defined with a suspicious type. Warn whenever a function is defined with a return-type that defaults to int. Also warn about any return statement with no return-value in a function whose return-type is not void. Warn whenever a local variable is unused aside from its declaration, whenever a function is declared static but never defined, and whenever a statement computes a result that is explicitly not used. Warn whenever a switch statement has an index of enumeral type and lacks a case for one or more of the named codes of that enumeration. (The presence of a default label prevents this warning.) case labels outside the enumeration range also provoke warnings when this option is used. Warn whenever a comment-start sequence `/*’ appears in a comment. Warn if any trigraphs are encountered (assuming they are enabled). Check calls to printf and scanf, etc., to make sure that the arguments supplied have types appropriate to the format string specified. Warn if an array subscript has type char. This is a common cause of error, as programmers often forget that this type is signed on some machines. Some optimization related stuff. Warn if parentheses are omitted in certain contexts. When using templates in a C++ program, warn if debugging is not yet fully available (C++ only). From man 1 gcc: The remaining `-W…’ options are not implied by `-Wall’ because they warn about constructions that we consider reasonable to use, on occa sion, in clean programs. And here they are stright from the fine manual.

-Wtraditional
Warn about certain constructs that behave differently in tradi-
tional and ANSI C.

o Macro arguments occurring within string constants in the macro
body. These would substitute the argument in traditional C, but
are part of the constant in ANSI C.

o A function declared external in one block and then used after
the end of the block.

o A switch statement has an operand of type long.


-Wshadow
Warn whenever a local variable shadows another local variable.

-Wid-clash-len
Warn whenever two distinct identifiers match in the first len
characters. This may help you prepare a program that will com-
pile with certain obsolete, brain-damaged compilers.

-Wpointer-arith
Warn about anything that depends on the "size of" a function
type or of void. GNU C assigns these types a size of 1, for
convenience in calculations with void * pointers and pointers to
functions.

-Wcast-qual
Warn whenever a pointer is cast so as to remove a type qualifier
from the target type. For example, warn if a const char * is
cast to an ordinary char *.

-Wcast-align
Warn whenever a pointer is cast such that the required alignment
of the target is increased. For example, warn if a char * is
cast to an int * on machines where integers can only be accessed
at two- or four-byte boundaries.

-Wwrite-strings
Give string constants the type const char[length] so that copy-
ing the address of one into a non-const char * pointer will get
a warning. These warnings will help you find at compile time
code that can try to write into a string constant, but only if
you have been very careful about using const in declarations and
prototypes. Otherwise, it will just be a nuisance; this is why
we did not make `-Wall' request these warnings.

-Wconversion
Warn if a prototype causes a type conversion that is different
from what would happen to the same argument in the absence of a
prototype. This includes conversions of fixed point to floating
and vice versa, and conversions changing the width or signedness
of a fixed point argument except when the same as the default
promotion.

-Waggregate-return
Warn if any functions that return structures or unions are de-
fined or called. (In languages where you can return an array,
this also elicits a warning.)

-Wstrict-prototypes
Warn if a function is declared or defined without specifying the
argument types. (An old-style function definition is permitted
without a warning if preceded by a declaration which specifies
the argument types.)

-Wmissing-prototypes
Warn if a global function is defined without a previous proto-
type declaration. This warning is issued even if the definition
itself provides a prototype. The aim is to detect global func-
tions that fail to be declared in header files.

-Wmissing-declarations
Warn if a global function is defined without a previous declara-
tion. Do so even if the definition itself provides a prototype.
Use this option to detect global functions that are not declared
in header files.

-Wredundant-decls
Warn if anything is declared more than once in the same scope,
even in cases where multiple declaration is valid and changes
nothing.

-Wnested-externs
Warn if an extern declaration is encountered within a function.

-Wenum-clash
Warn about conversion between different enumeration types (C++
only).

-Wlong-long
Warn if long long type is used. This is default. To inhibit
the warning messages, use flag `-Wno-long-long'. Flags
`-W-long-long' and `-Wno-long-long' are taken into account only
when flag `-pedantic' is used.

-Woverloaded-virtual
(C++ only.) In a derived class, the definitions of virtual
functions must match the type signature of a virtual function
declared in the base class. Use this option to request warnings
when a derived class declares a function that may be an erro-
neous attempt to define a virtual function: that is, warn when a
function with the same name as a virtual function in the base
class, but with a type signature that doesn't match any virtual
functions from the base class.

-Winline
Warn if a function can not be inlined, and either it was de-
clared as inline, or else the -finline-functions option was giv-
en.

-Werror
Treat warnings as errors; abort compilation after any warning.

bounty

Plentiful day really. When I logged on both Valroe and Leon happened to be on. Ahh perfections start. Managed to get Miles for back up, Rasas office for ASCII support, TS2 for Voice over, TG#1 for operations and take care of some business.

Wiz has been showing me around the site. I’m really lucky to have some one to teach me. I know he didn’t, so he had to learn the hardway and fast often enough. Although I am sorry about the amount of AFK’age I’ve put him threw.

Oddly enough, ma was complaning that I “don’ do any thing but sit infront of that ing computer all day”. Well I think Wiz might disagree with her on that <_< ehehe!

Been working threw a nice book on html4/xhtml1/css2. I know that we’re on 1.0/1.1 recommendation & 2.0 working drafts for xhtml. But it helps. I do know my way around plane old HTML enough but I’m not familer with CSS. Casscading Style Sheets do how ever seem a good thing to learn. Oh well hehe. I also need to start learning PHP a bit, I want to inhale the manual some time along with a few others.