OSSP CVS Repository

ossp - Check-in [365]
Not logged in
[Honeypot]  [Browse]  [Home]  [Login]  [Reports
[Search]  [Ticket]  [Timeline
  [Patchset]  [Tagging/Branching

Check-in Number: 365
Date: 2001-Jan-26 11:59:23 (local)
2001-Jan-26 10:59:23 (UTC)
User:rse
Branch:
Comment: Bugfix from Sendmail 8.11.2 README
Tickets:
Inspections:
Files:
ossp-pkg/sfio/sfio/sfputr.c      added-> 1.2

ossp-pkg/sfio/sfio/sfputr.c -> 1.2

*** /dev/null    Sat Nov 23 05:09:59 2024
--- -    Sat Nov 23 05:10:33 2024
***************
*** 0 ****
--- 1,100 ----
+ #include       "sfhdr.h"
+ 
+ /*     Put out a null-terminated string
+ **
+ **     Written by Kiem-Phong Vo
+ */
+ #if __STD_C
+ ssize_t sfputr(reg Sfio_t* f, const char* s, reg int rc)
+ #else
+ ssize_t sfputr(f,s,rc)
+ reg Sfio_t*    f;      /* write to this stream */
+ char*          s;      /* string to write      */
+ reg int                rc;     /* record separator.    */
+ #endif
+ {
+        reg ssize_t     p, n, w;
+        reg uchar*      ps;
+ 
+        if(f->mode != SF_WRITE && _sfmode(f,SF_WRITE,0) < 0)
+                return -1;
+ 
+        SFLOCK(f,0);
+ 
+        for(w = 0; (*s || rc >= 0); )
+        {       SFWPEEK(f,ps,p);
+ 
+                if(p == -1)
+                        return -1;
+                if(p == 0 || (f->flags&SF_WHOLE) )
+                {       n = strlen(s);
+                        if(p >= (n + (rc < 0 ? 0 : 1)) )
+                        {       /* buffer can hold everything */
+                                if(n > 0)
+                                {       memcpy(ps, s, n);
+                                        ps += n;
+                                        w += n;
+                                }
+                                if(rc >= 0)
+                                {       *ps++ = rc;
+                                        w += 1;
+                                }
+                                f->next = ps;
+                        }
+                        else
+                        {       /* create a reserve buffer to hold data */
+                                Sfrsrv_t*       frs;
+ 
+                                p = n + (rc >= 0 ? 1 : 0);
+                                if(!(frs = _sfrsrv(f, p)) )
+                                        n = 0;
+                                else
+                                {       if(n > 0)
+                                                memcpy(frs->data, s, n);
+                                        if(rc >= 0)
+                                                frs->data[n] = rc;
+                                        if((n = SFWRITE(f,frs->data,p)) < 0 )
+                                                n = 0;
+                                }
+ 
+                                w += n;
+                        }
+                        break;
+                }
+ 
+                if(*s == 0)
+                {       *ps++ = rc;
+                        f->next = ps;
+                        w += 1;
+                        break;
+                }
+ 
+ #if _lib_memccpy
+                if((ps = (uchar*)memccpy(ps,s,'\0',p)) != NIL(uchar*))
+                        ps -= 1;
+                else    ps  = f->next+p;
+                s += ps - f->next;
+ #else
+                for(; p > 0; --p, ++ps, ++s)
+                        if((*ps = *s) == 0)
+                                break;
+ #endif
+                w += ps - f->next;
+                f->next = ps;
+        }
+ 
+        /* sync unseekable shared streams */
+        if(f->extent < 0 && (f->flags&SF_SHARE) )
+                (void)SFFLSBUF(f,-1);
+ 
+        /* check for line buffering */
+        else if((f->flags&SF_LINE) && !(f->flags&SF_STRING) && (n = f->next-f->data) > 0)
+        {       if(n > w)
+                        n = w;
+                f->next -= n;
+                (void)SFWRITE(f,(Void_t*)f->next,n);
+        }
+ 
+        SFOPEN(f,0);
+        return w;
+ }

CVSTrac 2.0.1