nl_mac.c
上传用户:ycwykj01
上传日期:2007-01-04
资源大小:1819k
文件大小:3k
源码类别:

网络编程

开发平台:

Unix_Linux

  1. /*
  2.  * Program: Mac newline routines
  3.  *
  4.  * Author: Mark Crispin
  5.  * 6158 Lariat Loop NE
  6.  * Bainbridge Island, WA  98110-2098
  7.  * Internet: MRC@Panda.COM
  8.  *
  9.  * Date: 26 January 1992
  10.  * Last Edited: 30 August 1999
  11.  *
  12.  * Copyright 1999 by Mark Crispin
  13.  *
  14.  *  Permission to use, copy, modify, and distribute this software and its
  15.  * documentation for any purpose and without fee is hereby granted, provided
  16.  * that the above copyright notice appears in all copies and that both the
  17.  * above copyright notices and this permission notice appear in supporting
  18.  * documentation, and that the name of Mark Crispin not be used in advertising
  19.  * or publicity pertaining to distribution of the software without specific,
  20.  * written prior permission.  This software is made available "as is", and
  21.  * MARK CRISPIN DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD TO
  22.  * THIS SOFTWARE, INCLUDING WITHOUT LIMITATION ALL IMPLIED WARRANTIES OF
  23.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND IN NO EVENT SHALL
  24.  * MARK CRISPIN BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES
  25.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  26.  * WHETHER IN AN ACTION OF CONTRACT, TORT (INCLUDING NEGLIGENCE) OR STRICT
  27.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
  28.  * THIS SOFTWARE.
  29.  *
  30.  */
  31. /* Copy string with CRLF newlines
  32.  * Accepts: destination string
  33.  *     pointer to size of destination string buffer
  34.  *     source string
  35.  *     length of source string
  36.  * Returns: length of copied string
  37.  */
  38. unsigned long strcrlfcpy (char **dst,unsigned long *dstl,char *src,
  39.   unsigned long srcl)
  40. {
  41.   long i,j;
  42.   char c,*d = src;
  43.   if (*dst) { /* destination provided? */
  44.     if ((i = srcl * 2) > *dstl) /* calculate worst-case situation */
  45.       for (i = j = srcl; j; --j) if (*d++ == '15') i++;
  46. /* flush destination buffer if too small */
  47.     if (i > *dstl) fs_give ((void **) dst);
  48.   }
  49. /* make a new buffer if needed */
  50.   if (!*dst) *dst = (char *) fs_get ((*dstl = i) + 1);
  51.   d = *dst; /* destination string */
  52.   if (srcl) do { /* copy string */
  53.     c = *d++ = *src++; /* copy character */
  54. /* append line feed to bare CR */
  55.     if ((c == '15') && (*src != '12')) *d++ = '12';
  56.   } while (--srcl);
  57.   *d = ''; /* tie off destination */
  58.   return d - *dst; /* return length */
  59. }
  60. /* Length of string after strcrlfcpy applied
  61.  * Accepts: source string
  62.  * Returns: length of string
  63.  */
  64. unsigned long strcrlflen (STRING *s)
  65. {
  66.   unsigned long pos = GETPOS (s);
  67.   unsigned long i = SIZE (s);
  68.   unsigned long j = i;
  69.   while (j--) if ((SNX (s) == '15') && ((CHR (s) != '12') || !j)) i++;
  70.   SETPOS (s,pos); /* restore old position */
  71.   return i;
  72. }