Use backtick code blocks for syntax highlighting
This commit is contained in:
parent
8ed9dea394
commit
f658bfbb40
203 changed files with 26546 additions and 25801 deletions
194
01-05.md
194
01-05.md
|
|
@ -30,62 +30,64 @@ uses no assembly at all.
|
|||
|
||||
**LISTING 1.5 L1-5.C**
|
||||
|
||||
/*
|
||||
* Program to calculate the 16-bit checksum of the stream of bytes
|
||||
* from the specified file. Buffers the bytes internally, rather
|
||||
* than letting C or DOS do the work.
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include <alloc.h> /* alloc.h for Borland,
|
||||
malloc.h for Microsoft */
|
||||
```c
|
||||
/*
|
||||
* Program to calculate the 16-bit checksum of the stream of bytes
|
||||
* from the specified file. Buffers the bytes internally, rather
|
||||
* than letting C or DOS do the work.
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include <alloc.h> /* alloc.h for Borland,
|
||||
malloc.h for Microsoft */
|
||||
|
||||
#define BUFFER_SIZE 0x8000 /* 32Kb data buffer */
|
||||
#define BUFFER_SIZE 0x8000 /* 32Kb data buffer */
|
||||
|
||||
main(int argc, char *argv[]) {
|
||||
int Handle;
|
||||
unsigned int Checksum;
|
||||
unsigned char *WorkingBuffer, *WorkingPtr;
|
||||
int WorkingLength, LengthCount;
|
||||
main(int argc, char *argv[]) {
|
||||
int Handle;
|
||||
unsigned int Checksum;
|
||||
unsigned char *WorkingBuffer, *WorkingPtr;
|
||||
int WorkingLength, LengthCount;
|
||||
|
||||
if ( argc != 2 ) {
|
||||
printf("usage: checksum filename\n");
|
||||
exit(1);
|
||||
}
|
||||
if ( (Handle = open(argv[1], O_RDONLY | O_BINARY)) == -1 ) {
|
||||
printf("Can't open file: %s\n", argv[1]);
|
||||
exit(1);
|
||||
}
|
||||
if ( argc != 2 ) {
|
||||
printf("usage: checksum filename\n");
|
||||
exit(1);
|
||||
}
|
||||
if ( (Handle = open(argv[1], O_RDONLY | O_BINARY)) == -1 ) {
|
||||
printf("Can't open file: %s\n", argv[1]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* Get memory in which to buffer the data */
|
||||
if ( (WorkingBuffer = malloc(BUFFER_SIZE)) == NULL ) {
|
||||
printf("Can't get enough memory\n");
|
||||
exit(1);
|
||||
}
|
||||
/* Get memory in which to buffer the data */
|
||||
if ( (WorkingBuffer = malloc(BUFFER_SIZE)) == NULL ) {
|
||||
printf("Can't get enough memory\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* Initialize the checksum accumulator */
|
||||
Checksum = 0;
|
||||
/* Initialize the checksum accumulator */
|
||||
Checksum = 0;
|
||||
|
||||
/* Process the file in BUFFER_SIZE chunks */
|
||||
do {
|
||||
if ( (WorkingLength = read(Handle, WorkingBuffer,
|
||||
BUFFER_SIZE)) == -1 ) {
|
||||
printf("Error reading file %s\n", argv[1]);
|
||||
exit(1);
|
||||
}
|
||||
/* Checksum this chunk */
|
||||
WorkingPtr = WorkingBuffer;
|
||||
LengthCount = WorkingLength;
|
||||
while ( LengthCount-- ) {
|
||||
/* Add each byte in turn into the checksum accumulator */
|
||||
Checksum += (unsigned int) *WorkingPtr++;
|
||||
}
|
||||
} while ( WorkingLength );
|
||||
/* Process the file in BUFFER_SIZE chunks */
|
||||
do {
|
||||
if ( (WorkingLength = read(Handle, WorkingBuffer,
|
||||
BUFFER_SIZE)) == -1 ) {
|
||||
printf("Error reading file %s\n", argv[1]);
|
||||
exit(1);
|
||||
}
|
||||
/* Checksum this chunk */
|
||||
WorkingPtr = WorkingBuffer;
|
||||
LengthCount = WorkingLength;
|
||||
while ( LengthCount-- ) {
|
||||
/* Add each byte in turn into the checksum accumulator */
|
||||
Checksum += (unsigned int) *WorkingPtr++;
|
||||
}
|
||||
} while ( WorkingLength );
|
||||
|
||||
/* Report the result */
|
||||
printf("The checksum is: %u\n", Checksum);
|
||||
exit(0);
|
||||
}
|
||||
/* Report the result */
|
||||
printf("The checksum is: %u\n", Checksum);
|
||||
exit(0);
|
||||
}
|
||||
```
|
||||
|
||||
That brings us to the fourth reason: avoiding an internal-buffered
|
||||
implementation like Listing 1.5 because of the difficulty of coding such
|
||||
|
|
@ -122,56 +124,58 @@ the design has been maxed out.
|
|||
|
||||
**LISTING 1.6 L1-6.C**
|
||||
|
||||
/*
|
||||
* Program to calculate the 16-bit checksum of the stream of bytes
|
||||
* from the specified file. Buffers the bytes internally, rather
|
||||
* than letting C or DOS do the work, with the time-critical
|
||||
* portion of the code written in optimized assembler.
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include <alloc.h> /* alloc.h for Borland,
|
||||
malloc.h for Microsoft */
|
||||
```c
|
||||
/*
|
||||
* Program to calculate the 16-bit checksum of the stream of bytes
|
||||
* from the specified file. Buffers the bytes internally, rather
|
||||
* than letting C or DOS do the work, with the time-critical
|
||||
* portion of the code written in optimized assembler.
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include <alloc.h> /* alloc.h for Borland,
|
||||
malloc.h for Microsoft */
|
||||
|
||||
#define BUFFER_SIZE 0x8000 /* 32K data buffer */
|
||||
#define BUFFER_SIZE 0x8000 /* 32K data buffer */
|
||||
|
||||
main(int argc, char *argv[]) {
|
||||
int Handle;
|
||||
unsigned int Checksum;
|
||||
unsigned char *WorkingBuffer;
|
||||
int WorkingLength;
|
||||
main(int argc, char *argv[]) {
|
||||
int Handle;
|
||||
unsigned int Checksum;
|
||||
unsigned char *WorkingBuffer;
|
||||
int WorkingLength;
|
||||
|
||||
if ( argc != 2 ) {
|
||||
printf("usage: checksum filename\n");
|
||||
exit(1);
|
||||
}
|
||||
if ( (Handle = open(argv[1], O_RDONLY | O_BINARY)) == -1 ) {
|
||||
printf("Can't open file: %s\n", argv[1]);
|
||||
exit(1);
|
||||
}
|
||||
if ( argc != 2 ) {
|
||||
printf("usage: checksum filename\n");
|
||||
exit(1);
|
||||
}
|
||||
if ( (Handle = open(argv[1], O_RDONLY | O_BINARY)) == -1 ) {
|
||||
printf("Can't open file: %s\n", argv[1]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* Get memory in which to buffer the data */
|
||||
if ( (WorkingBuffer = malloc(BUFFER_SIZE)) == NULL ) {
|
||||
printf("Can't get enough memory\n");
|
||||
exit(1);
|
||||
}
|
||||
/* Get memory in which to buffer the data */
|
||||
if ( (WorkingBuffer = malloc(BUFFER_SIZE)) == NULL ) {
|
||||
printf("Can't get enough memory\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* Initialize the checksum accumulator */
|
||||
Checksum = 0;
|
||||
/* Initialize the checksum accumulator */
|
||||
Checksum = 0;
|
||||
|
||||
/* Process the file in 32K chunks */
|
||||
do {
|
||||
if ( (WorkingLength = read(Handle, WorkingBuffer,
|
||||
BUFFER_SIZE)) == -1 ) {
|
||||
printf("Error reading file %s\n", argv[1]);
|
||||
exit(1);
|
||||
}
|
||||
/* Checksum this chunk if there's anything in it */
|
||||
if ( WorkingLength )
|
||||
ChecksumChunk(WorkingBuffer, WorkingLength, &Checksum);
|
||||
} while ( WorkingLength );
|
||||
/* Process the file in 32K chunks */
|
||||
do {
|
||||
if ( (WorkingLength = read(Handle, WorkingBuffer,
|
||||
BUFFER_SIZE)) == -1 ) {
|
||||
printf("Error reading file %s\n", argv[1]);
|
||||
exit(1);
|
||||
}
|
||||
/* Checksum this chunk if there's anything in it */
|
||||
if ( WorkingLength )
|
||||
ChecksumChunk(WorkingBuffer, WorkingLength, &Checksum);
|
||||
} while ( WorkingLength );
|
||||
|
||||
/* Report the result */
|
||||
printf("The checksum is: %u\n", Checksum);
|
||||
exit(0);
|
||||
}
|
||||
/* Report the result */
|
||||
printf("The checksum is: %u\n", Checksum);
|
||||
exit(0);
|
||||
}
|
||||
```
|
||||
|
|
|
|||
Loading…
Reference in a new issue