📄 csplit.c
字号:
*w = 0;
ch = *beg++;
}
}
if (ch == '\t') /* if TAB character */
{ /* space to next tab stop */
/*
* TS: The following code has been changed to pad to the next
* tab stop, rather than insert a fixed number of spaces.
*/
spaces = tabstop - (((int)(tofs + beg - sbuf) - 1) % tabstop);
memmove (beg + spaces - 1, beg, strlen (beg) + 1);
for (q = beg - 1; spaces > 0; --spaces)
*q++ = ' ';
ch = ' '; /* change TAB to space */
}
*p++ = (char)ch; /* update output string */
++cnt;
if ((cnt == len - 1) && ('\n' != ch)) /* if need to wrap line */
{
beg -= 2; /* make room for "\\\n" characters */
e = beg;
p -= 2;
q = p;
/* unget characters to 1st previous space */
while ((e > sbuf) && (' ' != *(e - 1)))
{
--q;
--e;
}
/*if (((beg - e) < len) && (e != sbuf))*/
if (e != sbuf) /* if wrap on space char */
{ /* ( else wrap asis ) */
p = q;
beg = e;
}
*p++ = '\\'; /* terminate current line */
*p++ = '\n';
wrap = B_TRUE; /* flag wrap line pending */
}
} /*end_while*/
if ('\n' == ch)
tofs = 0;
*p = 0;
return s;
}
/*
* disp_help - Display help screen to user.
*/
void disp_help (void)
{
puts ("This utility processes C/C++ source files for the purpose of transmission");
puts ("through a FidoNet (tm) echo so as to circumvent oversize message problems.\n");
puts ("Split: CSplit [ [/tn] [/wn] [/ln] [/sc] ] outfile srcfile [ ... ]");
puts ("Extract: CSplit /x infile [ ... ]\n");
puts ("Where: /t n - For TAB character expansion, the number of columns");
printf (" for each TAB stop. (min/default/max: %d/%d/%d)\n", TABMIN, TABDEF, TABMAX);
puts (" /w n - For width control, the column number to be used for");
printf (" breaking long lines. (min/default/max: %d/%d/%d)\n", WIDMIN, WIDDEF, WIDMAX);
puts (" /l n - For length control, the number of lines to limit");
printf (" each section. (0 disable, min/default/max: %d/%d/%d)\n", LENMIN, LENDEF, LENMAX);
puts (" /s c - Use 'c' as the line separator character instead");
printf (" of the default separator character, '%c'.\n", SEP_CDEF);
puts (" outfile - Output file name. The extension will be the");
puts (" sequential section number.");
#if defined(__STDC__)
puts (" srcfile - Source file(s) (no wildcard support)");
#else
puts (" srcfile - Source file(s) (wildcards supported)");
#endif
puts (" infile - Input file name. An extension indicates file contains the");
puts (" sections in proper consecutive order ready for extraction.");
puts (" Otherwise, infile.001, infile.002, etc., will be used.");
}
/*
* extr_file - This function processes a properly concatenated file
* of consequtive sections to extract the original source.
*/
int extr_file (char *infile, char sepchar)
{
static char line [WIDMAX * 2];
static char line2[WIDMAX * 2];
char outfile[MAXFSPEC + 1];
char sep_ln[32];
char *sptr = 0;
char tchar = 0;
int curpart = 0;
int found = B_FALSE;
int indx = 0;
int in_section = B_FALSE;
int len = 0;
int key = 0;
int lines = 0;
int maxpart = 0;
int pos_wrap = B_FALSE;
int sepmax = 0;
int seppart = 0;
int sep_id_len = 0;
int temp = 0;
unsigned short crc = 0;
unsigned short sepcrc = 0;
for (temp = 0; temp < SEP_CLEN; ++temp)
sep_ln[temp] = (char)sepchar;
sep_ln[temp++] = ' ';
strcpy (&sep_ln[temp], SEP_ID);
sep_id_len = strlen (sep_ln);
if (NULL == (finp = fopen (infile, "r")))
{
char fname[MAXFSPEC + 1];
if ((NULL == (sptr = strrchr (infile, '\\'))) && /* ignore path */
(NULL == (sptr = strrchr (infile, ':'))))
{
sptr = infile; /* V2.2#3 correction */
}
if (NULL != strchr (sptr, '.')) /* if extension exists */
{
printf ("Error opening input file for extraction.\n");
return FILEIO;
}
if ((strlen (infile) + 4) > MAXFSPEC) /* if file spec too large */
{
printf ("Input file name argument too long.\n");
return SYNTAX;
}
indx = 1;
sprintf (fname, "%s.%03d", infile, indx);
if (NULL != (finp = fopen (fname, "r")))
{
sprintf (tempfile, "%s.CSP", infile);
if (NULL == (ftmp = fopen (tempfile, "w")))
{
printf ("Unable to open \"%s\" temp file.\n", tempfile);
return FILEIO;
}
printf ("Processing input files: %s ...\n", fname);
do
{
while (NULL != fgets (line, sizeof (line), finp))
fputs (line, ftmp);
fclose (finp);
++indx;
sprintf (fname, "%s.%03d", infile, indx);
finp = fopen (fname, "r");
} while (NULL != finp);
fclose (ftmp);
if (NULL == (finp = fopen (tempfile, "r")))
{
printf ("Error opening temp file \"%s\" for extraction.\n", outfile);
return FILEIO;
}
}
else
{
printf ("Error opening input file \"%s\" for extraction.\n", infile);
return FILEIO;
}
}
else
{
printf ("Processing input file: %s\n", infile);
}
crc = curpart = maxpart = lines = 0;
in_section = pos_wrap = B_FALSE;
fout = NULL;
initcrctab ();
*line2 = 0;
while (NULL != finp)
{
/* AR: increased line input size */
sptr = fgets (line, sizeof (line), finp);
if (NULL == sptr)
{
if (feof (finp)) /* end of file */
{
fclose (finp);
finp = NULL;
}
else
{
if (lines)
printf ("(line %d) ", lines);
printf ("Unable to read from input file: %s\n", infile);
return FILEIO;
}
}
else /* process line */
{
/* TS: eliminate any added trailing spaces */
for (indx = strlen (sptr) - 1; indx && (' ' == line[indx - 1]); --indx)
continue;
line[indx] = '\n';
line[indx+1] = '\0';
++lines;
/*
* Find 1st separator line to determine if correct separator
* character is being used and use the one that was found.
*/
if (!found && (0 != strstr (line, SEP_ID)))
{
for (temp = 0; isspace (line[temp]); ++temp)
; /* null statement */
tchar = line[temp]; /* skip leading ws */
if (sepchar != tchar)
for (temp = 0; temp < SEP_CLEN; ++temp)
sep_ln[temp] = tchar;
found = B_TRUE;
}
if (0 != (sptr = strstr (line , sep_ln))) /* if separator line */
{
sptr += sep_id_len;
if (sptr == strstr (sptr, SEP_BF)) /* if begin file */
{
if (NULL != fout)
{
printf ("(line %d) ", lines);
puts ("Encountered 2nd \"Begin file\" separator");
puts ("line before expected \"End file\" separator line:");
puts (line);
return PROCESS;
}
sptr += strlen (SEP_BF);
if (1 != sscanf (sptr, "%s", outfile))
{
printf ("(line %d) ", lines);
puts ("Unable to parse filename from separator line:");
puts (line);
return PROCESS;
}
if (NULL != (fout = fopen (outfile, "r")))
{
key = 0;
printf ("\nOutput file already exists: %s\n", outfile);
do
{
printf ("Overwrite? (y/n) ");
key = getchar ();
puts ("");
temp = key;
while (temp != '\n')
temp = getchar(); /* eat any/all extra keystrokes */
if (('n' == key) || ('N' == key))
return ABORT;
} while (('y' != key) && ('Y' != key));
if (NULL == freopen (outfile, "w", fout))
{
printf ("Unable to open file for output: %s\n", outfile);
return FILEIO;
}
}
else
{
if (NULL == (fout = fopen (outfile, "w")))
{
printf ("Unable to open file for output: %s\n", outfile);
return FILEIO;
}
}
printf ("Extracting file %s\n", outfile); /* Phi Nguyen */
crc = updcrc (crc, (unsigned char *)line, strlen (line));
}
else if (sptr == strstr (sptr, SEP_EF)) /* if end file */
{
if (NULL == fout)
{
printf ("(line %d) ", lines);
puts ("Encountered an \"End file\" separator line");
puts ("before a \"Begin file\" separator line:");
puts (line);
return PROCESS;
}
if (fclose (fout))
{
printf ("Unable to close output file: %s\n", outfile);
return FILEIO;
}
fout = NULL;
crc = updcrc (crc, (unsigned char *)line, strlen (line));
}
else if (sptr == strstr (sptr, SEP_BP)) /* if begin part */
{
if (B_TRUE == in_section)
{
printf ("(line %d) ", lines);
puts ("Encountered 2nd \"Begin part\" separator");
puts ("line before expected \"End part\" separator line:");
puts (line);
return PROCESS;
}
sptr += strlen (SEP_BP);
if (2 != sscanf (sptr, "%d/%d", &seppart, &sepmax))
{
printf ("(line %d) ", lines);
puts ("Unable to parse \"n/x\" from separator line:");
puts (line);
return PROCESS;
}
if (0 == maxpart)
maxpart = sepmax;
if (curpart+1 != seppart)
{
printf ("(line %d) ", lines);
printf ("Encountered part %d while expecting part %d:\n", seppart, curpart+1);
puts (line);
return PROCESS;
}
in_section = B_TRUE;
++curpart;
}
else if (sptr == strstr (sptr, SEP_EP)) /* if end part */
{
if (B_FALSE == in_section)
{
printf ("(line %d) ", lines);
puts ("Encountered 2nd \"End part\" separator line");
puts ("before expected \"Begin part\" separator line:");
puts (line);
return PROCESS;
}
sptr += strlen (SEP_EP);
sptr = strstr (sptr, ": ");
if (1 != sscanf (sptr+2, "%hx", &sepcrc)) /* DN2: 32 bit fix */
{
printf ("(line %d) ", lines);
puts ("Corrupt CRC in separator line:");
puts (line);
return PROCESS;
}
if (crc != sepcrc)
{
printf ("(line %d) ", lines);
printf ("Calculated CRC mismatch (0x%04x):\n", crc);
puts (line); /* KC: report CRC mismatch only */
}
crc = 0;
in_section = B_FALSE;
if (curpart == maxpart) /* if finished */
break;
}
else
{
if (sptr != strstr (sptr, SEP_VR)) /* if not version */
{
printf ("(line %d) ", lines);
puts ("Unrecognized separator line:");
puts (line);
return PROCESS;
}
}
}
else /* else process data line */
{
if (B_TRUE == in_section) /* save only file data */
{
len = strlen (line);
crc = updcrc (crc, (unsigned char *)line, len);
if (B_TRUE == pos_wrap) /* if possible line wrap in progress */
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -