Archive-Unzip-Burst
view release on metacpan or search on metacpan
unzip-6.0/fileio.c view on Meta::CPAN
/************************/
/* Function do_string() */
/************************/
int do_string(__G__ length, option) /* return PK-type error code */
__GDEF
unsigned int length; /* without prototype, ush converted to this */
int option;
{
unsigned comment_bytes_left;
unsigned int block_len;
int error=PK_OK;
#ifdef AMIGA
char tmp_fnote[2 * AMIGA_FILENOTELEN]; /* extra room for squozen chars */
#endif
/*---------------------------------------------------------------------------
This function processes arbitrary-length (well, usually) strings. Four
major options are allowed: SKIP, wherein the string is skipped (pretty
logical, eh?); DISPLAY, wherein the string is printed to standard output
after undergoing any necessary or unnecessary character conversions;
DS_FN, wherein the string is put into the filename[] array after under-
going appropriate conversions (including case-conversion, if that is
indicated: see the global variable pInfo->lcflag); and EXTRA_FIELD,
wherein the `string' is assumed to be an extra field and is copied to
the (freshly malloced) buffer G.extra_field. The third option should
be OK since filename is dimensioned at 1025, but we check anyway.
The string, by the way, is assumed to start at the current file-pointer
position; its length is given by 'length'. So start off by checking the
length of the string: if zero, we're already done.
---------------------------------------------------------------------------*/
if (!length)
return PK_COOL;
switch (option) {
#if (defined(SFX) && defined(CHEAP_SFX_AUTORUN))
/*
* Special case: See if the comment begins with an autorun command line.
* Save that and display (or skip) the remainder.
*/
case CHECK_AUTORUN:
case CHECK_AUTORUN_Q:
comment_bytes_left = length;
if (length >= 10)
{
block_len = readbuf(__G__ (char *)G.outbuf, 10);
if (block_len == 0)
return PK_EOF;
comment_bytes_left -= block_len;
G.outbuf[block_len] = '\0';
if (!strcmp((char *)G.outbuf, "$AUTORUN$>")) {
char *eol;
length -= 10;
block_len = readbuf(__G__ G.autorun_command,
MIN(length, sizeof(G.autorun_command)-1));
if (block_len == 0)
return PK_EOF;
comment_bytes_left -= block_len;
G.autorun_command[block_len] = '\0';
A_TO_N(G.autorun_command);
eol = strchr(G.autorun_command, '\n');
if (!eol)
eol = G.autorun_command + strlen(G.autorun_command) - 1;
length -= eol + 1 - G.autorun_command;
while (eol >= G.autorun_command && isspace(*eol))
*eol-- = '\0';
#if (defined(WIN32) && !defined(_WIN32_WCE))
/* Win9x console always uses OEM character coding, and
WinNT console is set to OEM charset by default, too */
INTERN_TO_OEM(G.autorun_command, G.autorun_command);
#endif /* (WIN32 && !_WIN32_WCE) */
}
}
if (option == CHECK_AUTORUN_Q) /* don't display the remainder */
length = 0;
/* seek to beginning of remaining part of comment -- rewind if */
/* displaying entire comment, or skip to end if discarding it */
seek_zipf(__G__ G.cur_zipfile_bufstart - G.extra_bytes +
(G.inptr - G.inbuf) + comment_bytes_left - length);
if (!length)
break;
/* FALL THROUGH... */
#endif /* SFX && CHEAP_SFX_AUTORUN */
/*
* First normal case: print string on standard output. First set loop
* variables, then loop through the comment in chunks of OUTBUFSIZ bytes,
* converting formats and printing as we go. The second half of the
* loop conditional was added because the file might be truncated, in
* which case comment_bytes_left will remain at some non-zero value for
* all time. outbuf and slide are used as scratch buffers because they
* are available (we should be either before or in between any file pro-
* cessing).
*/
case DISPLAY:
case DISPL_8:
comment_bytes_left = length;
block_len = OUTBUFSIZ; /* for the while statement, first time */
while (comment_bytes_left > 0 && block_len > 0) {
register uch *p = G.outbuf;
register uch *q = G.outbuf;
if ((block_len = readbuf(__G__ (char *)G.outbuf,
MIN((unsigned)OUTBUFSIZ, comment_bytes_left))) == 0)
return PK_EOF;
comment_bytes_left -= block_len;
/* this is why we allocated an extra byte for outbuf: terminate
* with zero (ASCIIZ) */
G.outbuf[block_len] = '\0';
/* remove all ASCII carriage returns from comment before printing
* (since used before A_TO_N(), check for CR instead of '\r')
*/
while (*p) {
while (*p == CR)
++p;
*q++ = *p++;
}
/* could check whether (p - outbuf) == block_len here */
*q = '\0';
if (option == DISPL_8) {
/* translate the text coded in the entry's host-dependent
"extended ASCII" charset into the compiler's (system's)
( run in 1.647 second using v1.01-cache-2.11-cpan-524268b4103 )