⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 csplit.c

📁 C语言库函数的源代码,是C语言学习参考的好文档。
💻 C
📖 第 1 页 / 共 3 页
字号:
            if (0 == strncmp (line, "\\\n", 2))  /* if wrapped line */
            {
              strcpy (line, line2);
              line[strlen (line) - 2] = 0;  /* remove wrap EOL */
            }
            else
            {
              strcat (line2, line);
              strcpy (line, line2);
            }
            pos_wrap = B_FALSE;
          }
          else  if ('\\' == line[len - 2]) /* if possible wrapped line */
          {
            strcpy (line2, line);
            pos_wrap = B_TRUE;
          }

          if ((B_FALSE == pos_wrap) &&
              ((NULL == fout) || (EOF == fputs (line, fout))))
          {
            puts ("Error writing output\n");
            return FILEIO;
          }
        }
      }
    }
  } /*end_while*/

  /* TS: Test for incompete processing. */
  if (B_TRUE == in_section)
  {
    printf ("Error: end of input while processing section %d of %d\n", seppart, sepmax);
    return PROCESS;
  }

  if (seppart != sepmax)
  {
    printf ("Error: end of input after processing section %d of %d\n", seppart, sepmax);
    return PROCESS;
  }
  return NOERR;
}

/*
 * free_list - This function simply frees each linked list item.
 */
void free_list (void)
{
  while (NULL != head)
  {
    cur = head->next;
    free (head);
    head = cur;
  }
}

/*
 * init_list - This function creates a linked list of input source
 *             files.  Wildcard specifications are accommodated when
 *             ANSI mode is not in effect.
 */
int init_list (int argc, char **argv, int argo)
{
  int i;
#if !defined(__STDC__)
  char         filename[MAXFSPEC + 1];
  char         path[PATHMAX + 1];
  char        *sptr;
  int          done;
  DOSFileData  fd;
#endif

  for (i = argo; i < argc; ++i)             /* process CL arguments */
  {
#if !defined(__STDC__)
    if (strlen (argv[i]) > (MAXFSPEC - FNAMELEN))
    {
      printf ("Input file argument too long:  %s\n", argv[i]);
      return SYNTAX;
    }

    done = FIND_FIRST(argv[i], 0x20, &fd);  /* david nugent */

    if (done)
    {
      printf ("Error with filespec: %s\n", argv[i]);
      return PROCESS;
    }

    strcpy (path, argv[i]);                 /* preserve path */

    if (NULL != (sptr = strrchr (path, '\\')))
      *(sptr + 1) = '\0';
    else
      path[0] = '\0';

    while (!done)
    {
      if ('\0' != path[0])
      {
        strcpy (filename, path);

        if (NULL != (sptr = strrchr (ff_name(&fd), '\\')))
          strcat (filename, sptr + 1);      /* just in case */
        else
          strcat (filename, ff_name(&fd));
      }
      else
        strcpy (filename, ff_name(&fd));

      if (NULL == add_list (filename))      /* david nugent */
        return MEMORY;

      done = FIND_NEXT(&fd);
    }
    FIND_END(&fd);                          /* david nugent */
#else
    if (strlen (argv[i]) > MAXFSPEC)
    {
      printf ("Input file argument too long:  %s\n", argv[i]);
      return SYNTAX;
    }

    if (NULL == add_list (argv[i]))
      return MEMORY;

#endif
  }
  return NOERR;
}

/*
 * split_src - This function takes a linked list of input source
 *             files, concatenates the source and then splits it
 *             into sections of controlled size.
 */
int split_src (SLST *filelist, char *outfname, int length, int width, int tabstop, char sepchar)
{
  char           line[WIDMAX + 1];
  char          *ext     = 0;
  char           filename[MAXFSPEC + 1];
  char           outfile[MAXFSPEC + 1];
  char           sep_ln[32];
  char          *sptr    = 0;
  int            curpart = 0;
  int            key     = 0;
  int            lines   = 0;
  int            maxpart = 1;
  int            retc    = 0;
  int            temp    = 0;
  unsigned short crc     = 0;


  strcpy (outfile, outfname);

  if (NULL == (ext = strchr (outfile, '.')))     /* ignore any ext */
    ext = &outfile[strlen (outfile)];

  *ext = 0;                                      /* make temp file name */
  strcpy (tempfile, outfile);
  strcat (tempfile, ".CSP");

  if (NULL == (ftmp = fopen (tempfile, "w")))
  {
    printf ("Error creating temp file:  %s\n", tempfile);
    return FILEIO;
  }

  for (temp = 0; temp < 10; ++temp)
    sep_ln[temp] = (char)sepchar;

  sep_ln[temp] = '\0';

  for (cur = filelist, lines = 0; NULL != cur; cur = cur->next)
  {
    if (NULL == finp)
    {
      if (NULL == (finp = fopen (cur->srcfile, "r")))
      {
        printf ("Error opening source file:  %s\n", cur->srcfile);
        return FILEIO;
      }

      if ((NULL != (sptr = strrchr (cur->srcfile, '\\'))) ||
          (NULL != (sptr = strrchr (cur->srcfile, ':')))) /* Darin McBride */
        strcpy (filename, sptr+1);
      else
        strcpy (filename, cur->srcfile);

      retc = fprintf (ftmp, "%s %s%s%s %s\n", sep_ln, SEP_ID, SEP_BF, filename, sep_ln);

      if (0 == retc)
      {
        puts ("Error writing output\n");
        return FILEIO;
      }
      ++lines;
    }

    while (NULL != finp)
    {
      /*
       * The function csp_fgets() is equivalent to fgets() in that it
       * too reads n-1 characters or up to a newline character.  This
       * function additionally expands TAB characters, deletes trailing
       * whitespace and wraps lines exceeding the specified length.
       */
      if (NULL == csp_fgets (line, width, finp, tabstop))
      {
        if (feof (finp))
        {
          fclose (finp);
          finp = NULL;
          retc = fprintf (ftmp, "%s %s%s%s %s\n", sep_ln, SEP_ID, SEP_EF, filename, sep_ln);

          if (0 == retc)
          {
            puts ("Error writing output\n");
            return FILEIO;
          }
          ++lines;      /* adjust line count */
        }
        else
        {
          puts ("Error reading input\n");
          return FILEIO;
        }
      }
      else
      {
        if (EOF == fputs (line, ftmp))
        {
          puts ("Error writing output\n");
          return FILEIO;
        }
        ++lines;
      }
    } /*end_while*/
  } /*end_for*/

  if (0 != length)
  {
    /* There are 3 lines of overhead per section. */
    maxpart = lines / (length - 3);

    if ((lines % (length - 3)) > 0)
      ++maxpart;                       /* for partial section */
  }

  curpart = 1;
  sprintf (ext, ".%03d", curpart);     /* make 1st output file name */

  /* warn user if the output filename is already in use */
  if (NULL != (fout = fopen (outfile, "r")))
  {
    key = 0;
    printf ("Output file already exists:  %s\n", outfile);

    do
    {
      printf ("Overwrite? (y/n): ");
      key = (toupper) (getchar ());    /* prevent using toupper macro */
      puts ("");
      temp = key;

      while (temp != '\n')
      {
        temp = getchar ();             /* eat all extra keystrokes */
      }

      if ('N' == key)
        return ABORT;

    } while ('Y' != key);

    fclose (fout);
    fout = NULL;
  }

  if (NULL == freopen (tempfile, "r", ftmp))
  {
    printf ("Error reopening temp file:  %s\n", tempfile);
    return FILEIO;
  }

  initcrctab ();

  while (NULL != ftmp)
  {
    lines = 0;

    if (NULL == fout)
    {
      sprintf (ext, ".%03d", curpart); /* make output file name */

      if (NULL == (fout = fopen (outfile, "w")))
      {
        printf ("Error opening output file:  %s\n", outfile);
        return FILEIO;
      }

      retc = fprintf (fout, "%s %s%s%s %s\n", sep_ln, SEP_ID, SEP_VR, VERSION, sep_ln);

      if (0 == retc)
      {
        puts ("Error writing output\n");
        return FILEIO;
      }

      ++lines;
      retc = fprintf (fout, "%s %s%s%d/%d %s\n", sep_ln, SEP_ID, SEP_BP, curpart, maxpart, sep_ln);

      if (0 == retc)
      {
        puts ("Error writing output\n");
        return FILEIO;
      }

      ++lines;
    }

    crc = 0;

    while (((0 == length ) || (lines < (length - 1))) &&
           (NULL != ftmp))
    {
      if (NULL == fgets (line, WIDMAX, ftmp))
      {
        if (feof (ftmp))
        {
          fclose (ftmp);
          ftmp = NULL;
        }
        else
        {
          puts ("Error reading input\n");
          return FILEIO;
        }
      }
      else
      {
        crc = updcrc (crc, (unsigned char *)line, strlen (line));

        if (EOF == fputs (line, fout))
        {
          puts ("Error writing output\n");
          return FILEIO;
        }

        ++lines; /* increment line count */
      }
    } /*end_while*/

    if (0 == fprintf (fout, "%s %s%s%d/%d crc: %04x %s\n", sep_ln, SEP_ID, SEP_EP, curpart, maxpart, crc, sep_ln))
    {
      puts ("Error writing output\n");
      return FILEIO;
    }

    fclose (fout);
    fout = NULL;
    ++curpart;
  } /*end_while*/

  return NOERR;
}


/*
 * CRC-16f.c, from Snippets.  Calculate, intelligently, the CRC
 * of a dataset incrementally given a buffer full at a time.
 * Initialize crc to 0 for XMODEM, -1 for CCITT.
 */

/*
 * P, the CRC polynomial, is used by XMODEM (almost CCITT).
 * If you change P, you must change crctab[]'s initial value
 * to what is printed by initcrctab().
 */
#define  P 0x1021
#define  W 16       /* number of bits in CRC: don't change it */
#define  B 8        /* number of bits per char: don't change it */

unsigned short crctab[1<<B];

void initcrctab (void)
{
  register b, v, i;

  for (b = 0; b <= (1<<B) - 1; ++b)
  {
    for (v = b<<(W-B), i = B; --i >= 0; )
    {
      v = v & 0x8000 ? (v<<1)^P : v<<1;
    }

    crctab[b] = v;
  }
}

unsigned short updcrc (unsigned short icrc, unsigned char *icp, unsigned int icnt)
{
  register unsigned short crc = icrc;
  register unsigned char  *cp = icp;
  register unsigned int   cnt = icnt;

  while (cnt--)
  {
    crc = (crc<<B) ^ crctab[(crc>>(W-B)) ^ *cp++];
  }

  return crc;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -