Sidebar: Corrections
Please note the following corrections to the article "Converting Unix
Filenames to MS-DOS" (Sys Admin 5(2): 81-85) by Ed Schaefer
and Fred Brunet. The editors regret these errors and apologize
for any inconvenience.
The authors have made the following changes. Sharp-eyed reader,
Edward Hooper, had a problem with commas being changed within
double quotes. Here is an example:
"0001","Another, String"
The program should change it to:
0001|Another, String|
not
0001|Another| String"
In order to fix this problem, here are the changes:
1) In the process_data_file make this change:
if(conv_ch == 1)
token = xstrtok(buf, PIPE_SYMBOL, "");
else
token = xstrtok(buf, COMMA, "\"");
.
.
if(conv_ch == 1)
token = xstrtok(NULL, PIPE_SYMBOL, "");
else
token = xstrtok(NULL, COMMA, "\"");
2) A replacement is needed for the strcspn() function in the xstrtok
function. In the xstrtok() function, replace:
n = strcspn(saveline, delims);
with:
n = strccspn(saveline, delims, except);
And here is the function:
/* replacement function for strcspn(). except is generally a double
quote and it becomes the new delimiter. When another except is found,
change back to the original delimiter */
int strccspn(s1, s2, except)
char *s1, *s2, *except;
{ /*s2 is the delimiter */
char *sc1, *sc2, *olds2;
int found = 0;
for (sc1 = s1; *sc1 != '\0'; ++sc1)
{
if(strchr (except, *sc1) != NULL)
/* this is a possible double quote */
if(!found)
{
found++;
olds2=s2; /* save old delimiter */
s2=except; /* change to the except delimiter */
sc1++;
}
for(sc2 = s2; *sc2 !='\0'; ++sc2)
if (strchr (sc2, *sc1) != NULL)
{
if(found)
{
s2=olds2;
/* change back to the original delimiter */
found = !found;
}
else
return (sc1 - s1);
}
}
return (sc1 - s1);
}
Next, I've had some problems with unexplained core dumps when adding a
third argument to the xstrtok() function. I finally tracked it down to
the string copies in the del_char() function corrupting the stack. I
replaced it with this:
/*
* This function deletes char 'c' from 'string'
*/
void del_char(string, c)
char *string;
char *c;
{
inti,j;
for(i=j=0; string[i]; i++)
if (string[i] != *c)
string[j++] = string[i];
string[j] = 0x00;
}
|