home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The C Users' Group Library 1994 August
/
wc-cdrom-cusersgrouplibrary-1994-08.iso
/
listings
/
v_09_04
/
9n04086b
< prev
next >
Wrap
Text File
|
1991-02-05
|
5KB
|
145 lines
/* *************************************************************
DSAT.C Dynamic String Array Test
Version 1.0
Created by: Anthony Whitford
(c) 1990
********************************************************* */
#include <process.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char ** ptrarray_t;
int wordcount (const char *);
int str_to_ptrarray (const char *, char ***);
void free_ptrarray (char ***);
void main (void)
{
int numofitems, retval;
ptrarray_t strlist;
if ((retval = str_to_ptrarray("This is a test.", &strlist)) == -1)
printf("Error turning the string into a pointer list.");
else
{
/* Test the data. */
printf("\nString list outside function...\n");
for (numofitems = 0; strlist[numofitems] !=NULL; numofitems++)
{
printf("%u --> ***%s***\n",
numofitems, strlist[numofitems]);
}
puts("");
free_ptrarray(&strlist); /* Free pointer array. */
}
exit (retval); /* Return number of words or error. */
}
/* ****************************************************************
Function: wordcount
Parameters: const char *str -> the string.
Description: Counts the number of words in a string up to
255 bytes.
Returns: The number of words in astring.
************************************************************* */
int wordcount (const char *str)
{
int words = 1; /* Initialize word cunt. */
char tstr[256]; /* Declare a temporary string. */
strcpy(tstr, str); /* Make a working copy. */
if (strtok(tstr, " ") == NULL) /* If string is only */
return (0); /* spaces, return 0. */
while (strtok(NULL, " ") !=NULL)
words++; /* Count how many words. */
return (words); /* Return number of words in string. */
}
/* ************************************************************
Function: str_to_ptrarray
Parameters: const char *orgstr -> the original string
to be parsed,
char ***ptrarray -> the address ofthe
pointer array.
Description: Breaks a string into its words and composes
a pointer array of the words.
Returns: "ptrarray" becomes a NULL terminating pointer
array, and pointer array, or -1 if an error
occurred.
******************************************************** */
int str_to_ptrarray (const char *orgstr, char ***ptrarray)
{
unsigned index = 0, words;
char *cptr,*thestr;
if (( thestr = (char *) calloc((size_t)(strlen(orgstr) + 1),
sizeof(*thestr))) == NULL)
return (-1); /* Make a working copy of the
string. */
strcpy(thestr, orgstr);
words = wordcount(thestr); /* Get number of words. */
if ((*ptrarray = (char **) calloc(words + 1,
(size_t) sizeof(**ptrarray))) ==NULL)
{
free(thestr);
return (-1); /* Error allocating space for
ptrarray.*/
}
/* THIS IS A NEW PRINTF */
for (index = 0; index < words; index ++)
{
printf("\n & *ptrarray[index] %x & (*ptrarray)[index] %x",
ptrarray[index], &((*ptrarray)[index]));
}
index = 0;
cptr = strtok(thestr, " ");
while (index < words)
{
if ((*ptrarray[index] = (char *)calloc((size_t)(strlen(cptr) + 1),
sizeof(**ptrarray[index]))) == NULL)
{
free_ptrarray(ptrarray);
free(thestr); /* If memory allocation
error, free */
return (-1); /* thestr, ptrarray, and
return -1. */
}
strcpy(*ptrarray[index++], cptr);
cptr = strtok (NULL, " ");
}
*ptrarray[index] = NULL; /* Terminate ptrarray with a NULL. */
free(thestr); /* Free allocated memory. */
/* Test the data. --- Delete the next four lines when
debugged!! */
printf("\nString list inside function...\n");
for (index = 0; *ptrarray[index] != NULL; index++)
printf("%u --> ***%s***\n", index, *ptrarray[index]);
puts(" ");
return (words); /* Return the number of pointers. */
}
/* ************************************************************
Function: free_ptrarray
Parameters: char ***ptrarray _> address ofthe pointer
array.
Description: Frees allocated memory for the pointer array
allocated with the str_to_ptrarray function.
Returns: Nothing.
******************************************************* */
void free_ptrarray (char ***ptrarray)
{
unsigned count = 0; /* Declare and reset counter. */
for (; *ptrarray[count] != NULL; count++)
free(*ptrarray[count]); /* Free each string/word. */
free(*ptrarray); /* Free the handle. */
}