* * * * * 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: sean@conman.org > * > *************************************************************************/ > > /* Style: C89 in K&R style */ > > #include > #include > #include > #include > > #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 Sean Conner at sean@conman.org .