DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH PRINT BOOK
 
Using programming tools

Creating the source code

Program development begins with the creation of code from specifications. Sometimes, the code has already been written and must only be tested and debugged. This tutorial includes a sample program.

The sample program, testcase.c, was written to these specifications:

The file testcase.c contains the following code:

  1 #include <stdio.h>
  2 #include <ctype.h>
  3 #include <string.h>
  4 
  5 /* Manifests for state machine to parse input line. */
  6 #define	WORD	0
  7 #define	IGNORE	1
  8            
  9 #define BUFFERSIZE	5000
 10 
 11 /* Globals, used by both subroutines. */
 12 char	*Words[BUFSIZ/2];		/* Worst case, single letters. */
 13 int	WordCount;
 14 
 15 /* Walk through the array of words, find those with the
 16  * matching character, printing them on stdout. Note that
 17  * the null character will match all words.  */
 18 void PrintWords(wc, match)
 19 int wc;					/* Number of words in Words[] */
 20 char match;				/* Attempt to match this character. */
 21 {	register int	ix;		/* Index in Words[]. */
 22 	register char	*cp;		/* Pointer for searching. */
 23 	for(ix = 0; ix < wc; ix++) {
 24 		cp = Words[ix];
 25 		/* Try to match the given character.
 26 		 * Scan the word, attempting to match,
 27 		 * or until the end of the word is found.  */
 28 		while((*cp) && (*cp++ != match));
 29 		if (*cp == match) /* Found a match? Write the word on stdout. */
 30 			(void) printf("%s\n", Words[ix]); } return; }
 31 
 32 /* Find words in the given buffer. The Words[] array is set
 33  * to point at words in the buffer, and the buffer modified
 34  * with NULL characters to delimit the words.  */
 35 int GetWords(buf)
 36 char	buf[];				/* The input buffer. */
 37 {	register char	*cp;		/* Pointer for scanning. */
 38 	int	end = strlen(buf);	/* Length of the buffer. */
 39 	register int	wc = 0;		/* Number of words found. */
 40 	int	state = IGNORE;		/* Current state. */
 41 	/* For each character in the buffer. */
 42 	for(cp = &buf[0]; cp < &buf[end]; cp++) {
 43 		/* A simple state machine to process
 44 		 * the current character in the buffer.
 45 		 */
 46 		switch(state) {
 47 		case IGNORE:
 48 			if (!isspace(*cp)) {
 49 				Words[wc++] = cp; /* Just started a word?
 50 				Save it. */
 51 				state = WORD; /* Reset the state. */ } break;
 52 		case WORD:
 53 			if (isspace(*cp)) {
 54 				*cp = '\0'; /* Just completed a word?
 55 				terminate it. */
 56 				state = IGNORE; /* Reset the state. */ } break; } }
 57 	return wc; /* Return the word count. */ }
 58 
 59 int main(argc, argv) int argc; char *argv[]; { char	buf[BUFSIZ], match;
 60 /* Check command line arguments. */ 
 61 if (argc < 2) match = ' ';
 62 /* No command line argument, match all words. */
 63 else   match = *++argv[1];	/* Match the char after the first - */
 64 	/* Until no more input on stdin. */
 65 	while(gets(buf) != (char *)NULL) {
 66 		WordCount = GetWords(buf); /* Parse the input buffer. */
 67 		PrintWords(WordCount, match);  /* Print the matching words. */ }
 68 	return(0);  /* Return success to the shell. */ }

Next topic: Archiving the code
Previous topic: Using programming tools

© 2003 Caldera International, Inc. All rights reserved.
SCO OpenServer Release 5.0.7 -- 11 February 2003