* * * * *

              99 ways to program a hex, Part 3: C89 in K&R style

To separate the style from the version, here's the program, written in C89
[1], using the K&R style [2].

> /*************************************************************************
> *
> * Copyright 2012 by Sean Conner.  All Rights Reserved.
> *
> * This program is free software; you can redistribute it and/or
> * modify it under the terms of the GNU General Public License
> * as published by the Free Software Foundation; either version 2
> * of the License, or (at your option) any later version.
> *
> * This program is distributed in the hope that it will be useful,
> * but WITHOUT ANY WARRANTY; without even the implied warranty of
> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> * GNU General Public License for more details.
> *
> * You should have received a copy of the GNU General Public License
> * along with this program; if not, write to the Free Software
> * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
> *
> * Comments, questions and criticisms can be sent to: [email protected]
> *
> *************************************************************************/
>
> /* Style: C89 in K&R style */
>
> #include <stdio.h>
> #include <ctype.h>
> #include <string.h>
> #include <stdlib.h>
>
> #define LINESIZE        16
>
> static void   do_dump         (FILE *,FILE *);
>
> /****************************************************************/
>
> int main(int argc,char *argv[]) {
>       if (argc == 1) {
>               do_dump(stdin,stdout);
>       } else {
>               int i;
>
>               for (i = 1 ; i < argc ; i++) {
>                       FILE *fp;
>
>                       fp = fopen(argv[i],"rb");
>                       if (fp == NULL) {
>                               perror(argv[i]);
>                               continue;
>                       }
>
>                       printf("-----%s-----\n",argv[i]);
>                       do_dump(fp,stdout);
>                       fclose(fp);
>               }
>       }
>
>       return EXIT_SUCCESS;
> }
>
> /******************************************************************/
>
> static void do_dump(FILE *fpin,FILE *fpout) {
>       unsigned char buffer[BUFSIZ],*pbyte;
>       size_t offset=0,bread,j;
>       char ascii[LINESIZE + 1];
>
>       while((bread = fread(buffer,1,BUFSIZ,fpin)) > 0) {
>               pbyte = buffer;
>               while (bread > 0) {
>                       fprintf(fpout,"%08lX: ",(unsigned long)offset);
>                       j = 0;
>                       do {
>                               fprintf(fpout,"%02X ",*pbyte);
>                               if (isprint(*pbyte)) {
>                                       ascii [j] = *pbyte;
>                               } else {
>                                       ascii [j] = '.';
>                               }
>                               pbyte  ++;
>                               offset ++;
>                               j      ++;
>                               bread  --;
>                       } while ((j < LINESIZE) && (bread > 0));
>
>                       ascii [j] = '\0';
>                       if (j < LINESIZE) {
>                               size_t i;
>
>                               for (i = j ; i < LINESIZE ; i++) {
>                                       fprintf(fpout,"   ");
>                               }
>                       }
>                       fprintf(fpout,"%s\n",ascii);
>               }
>
>               if (fflush(fpout) == EOF) {
>                       perror("output");
>                       exit(EXIT_FAILURE);
>               }
>       }
> }
>
> /***************************************************************/
>

We have function prototypes, and more appropriate typedefs for some of the
variables, but in the K&R style (ick). Lots of software is still written
using this style, like Linux [3], on the grounds that if it was Good Enoughâ„¢
for Kernighan and Ritchie [4], then it's Good Enoughâ„¢ for the rest of us,
never mind that Kernighan [5] and Ritchie [6] wrote their software on
teletypes [7], which is near enough to a manual typewriter hooked up to a
computer that if I used one, I would try to type as little as possible
myself. But personally, I don't use a teletype; I use a real keyboard [8] and
a huge monitor with a small font, so I find little use for the K&R style.

* Part 2: K&R C [9]
* Part 4: C99 [10]

[1] http://en.wikipedia.org/wiki/ANSI_C
[2] http://en.wikipedia.org/wiki/1_true_brace_style
[3] http://www.kernel.org/doc/Documentation/CodingStyle
[4] https://www.amazon.com/exec/obidos/ASIN/0131103628/conmanlaborat-20
[5] http://en.wikipedia.org/wiki/Brian_Kernighan
[6] http://en.wikipedia.org/wiki/Dennis_Ritchie
[7] http://en.wikipedia.org/wiki/Teleprinter
[8] http://en.wikipedia.org/wiki/Model_M_keyboard
[9] gopher://gopher.conman.org/0Phlog:2012/01/10.1
[10] gopher://gopher.conman.org/0Phlog:2012/01/12.3

Email author at [email protected]