Small C Projects
stackoverflow.com
stackoverflow.com
Boot a Unix, leave X, sit still for 20 minutes. There.
Get the sources to your Unix and just go read the code for your everyday utils. This is best done with a BSD, that isn't bloated with GNUisms.
If you don't believe me about GNU bloat, just look here:
http://www.freebsd.org/cgi/cvsweb.cgi/src/bin/
Get a BSD and devour the beauty that is Unix, unfuckedwith.
FreeBSD also comes with all the papers & research docs you need; love how the troff formatting is readable in console with zcat. The CRT radiation kept me glowing green for many an enjoyable night.
http://git.busybox.net/busybox/tree/coreutils
Most BusyBox utilities leave out more options than FreeBSD equivalents.
One man's bloat is another man's convenience.
This word, which I see so often, is almost entirely content-free. At most, it conveys a vague sense of 'big is bad'; the association of 'bigness' is the only thing that saves it from being a purely content-free snarl word.
http://rationalwiki.org/wiki/Loaded_language#Snarl_words
("When used as a snarl words, these words are essentially meaningless; most of them can be used with meaning, but rarely are.")
To say what ought to be obvious, one person's bloat is another person's essential feature. And, yes, I do use that paragon of GNU software, GNU Emacs, and surely you realize the folly of trying to tell me my editor of choice is bloated.
http://www.freebsd.org/cgi/cvsweb.cgi/~checkout~/src/bin/cat...
http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/cat....
As always, if you want to read C code as written by the same people who invented C, the Plan 9 source code (http://plan9.bell-labs.com/sources/plan9/sys/src/) is a great resource.
1) The GNU version has MUCH more verbose commenting 2) The GNU version reads input in blocks in cooked mode, rather than a character at a time as the BSD cat does. This is MUCH faster, but it leads to a lot more complexity, and thus more code. It also carefully calculates the optimal block size to use for this; this is also quite complex and carefully commented (see, eg, the 20 line comment at line 736). 3) The GNU version has to be portable to multiple unixes, and thus has a number of places where it has to test for multiple error codes, and/or missing features 4) The GNU version has a very verbose --help output, which consumes a good page or so of code by itself.
I don't really see any 'bloat' there. Sure, it's okay to have a simple cat, but it's not a bad idea to optimize a tool that's used so frequently. And the verbose --help output, verbose commenting, and portability are all part of the GNU coding standards. You can argue about whether you want to spend all that effort on it, but I don't think the sheer volume of code is a good measure for whether the code is good or not.
As the poster above said, one man's bloat is another man's essential feature.
Back to the subject: reading those old sources really learns you why, back in the seventies, people found Unix so appealing. even ignoring the feature growth/creep (or whatever you want to call it), you do not have to wade through a zillion copyright header lines, option parsing that goes on for ages, locale-specific stuff, etc, before getting to the meat of the program. Disadvantage is that some code dives into assembler fairly quickly (for example, printf is mostly assembly in the system I refer to above)
Now, what do you think is more appropriate for educational purposes. Source code with plenty of comments or source code with nearly no comments at all?
I routinely gloss over comments when reading code anyway; the most accurate documentation is found via reflection & introspection on the system itself, not comments.
In general, I like the idea of trying to implement absolutely minimal versions of common programs. Other possibilities are: an HTTP server or proxy, a Lisp interpreter.
For me learning a new programming language is always about finding a problem to solve, something that will keep me interested and make it fun to learn.
Then the best thing is to just work on something you like.
If you like networking, write an RPC server using the basic Linux socket interface or use 0mq to write a pub / sub :
http://www.zeromq.org/intro:read-the-manual
If you like audio or DSP write a an audio processing program and adds an echo or other effect to an input audio stream. You can try portaudio interface:
http://www.portaudio.com/trac/browser/portaudio/trunk/test/p...
If you like file systems & linux write a FUSE file system. Or a kernel module:
http://lwn.net/Articles/68106/
If you like graphics you can try libSDL:
Do one of these things: keyboard/mouse driver, hard drive diagnostics poller, implement raw sockets on windows, system call hooking pattern, a VM for a scripting language, a VM/crypter software protection scheme, etc.
There's all kinds of stuff.
Maybe I am misreading this. But I don't quite see why. The poster seemed to want to relearn C and was asking other people's opinions on what would be interesting small projects to start out with.