Basically, I wanted to be able to make a dump to a FILE*, and not have
authorRichard Levitte <levitte@openssl.org>
Wed, 11 Aug 2004 21:13:57 +0000 (21:13 +0000)
committerRichard Levitte <levitte@openssl.org>
Wed, 11 Aug 2004 21:13:57 +0000 (21:13 +0000)
to bother creating a BIO around it.  So here's a few more functions to
make it possible to make the dump using a printing callback, and to
print to a FILE* (based on the callback variant), done in the same
style as the functions in crypto/err/err_prn.c.

crypto/bio/b_dump.c
crypto/bio/bio.h

index 76fee2d..a07b794 100644 (file)
 #define DUMP_WIDTH     16
 #define DUMP_WIDTH_LESS_INDENT(i) (DUMP_WIDTH-((i-(i>6?6:i)+3)/4))
 
-int BIO_dump(BIO *bio, const char *s, int len)
+int BIO_dump_cb(int (*cb)(const void *data, size_t len, void *u),
+       void *u, const char *s, int len)
        {
-       return BIO_dump_indent(bio, s, len, 0);
+       return BIO_dump_indent_cb(cb, u, s, len, 0);
        }
 
-int BIO_dump_indent(BIO *bio, const char *s, int len, int indent)
+int BIO_dump_indent_cb(int (*cb)(const void *data, size_t len, void *u),
+       void *u, const char *s, int len, int indent)
        {
        int ret=0;
        char buf[288+1],tmp[20],str[128+1];
        int i,j,rows,trc;
        unsigned char ch;
        int dump_width;
-       
+
        trc=0;
-       
+
 #ifdef TRUNCATE
-       for(; (len > 0) && ((s[len-1] == ' ') || (s[len-1] == '\0')); len--) 
+       for(; (len > 0) && ((s[len-1] == ' ') || (s[len-1] == '\0')); len--)
                trc++;
 #endif
 
@@ -96,7 +98,7 @@ int BIO_dump_indent(BIO *bio, const char *s, int len, int indent)
                memset(str,' ',indent);
                }
        str[indent]='\0';
-       
+
        dump_width=DUMP_WIDTH_LESS_INDENT(indent);
        rows=(len/dump_width);
        if ((rows*dump_width)<len)
@@ -117,7 +119,7 @@ int BIO_dump_indent(BIO *bio, const char *s, int len, int indent)
                                {
                                ch=((unsigned char)*(s+i*dump_width+j)) & 0xff;
                                BIO_snprintf(tmp,sizeof tmp,"%02x%c",ch,
-                                        j==7?'-':' ');
+                                       j==7?'-':' ');
                                BUF_strlcat(buf,tmp,sizeof buf);
                                }
                        }
@@ -129,28 +131,57 @@ int BIO_dump_indent(BIO *bio, const char *s, int len, int indent)
                        ch=((unsigned char)*(s+i*dump_width+j)) & 0xff;
 #ifndef CHARSET_EBCDIC
                        BIO_snprintf(tmp,sizeof tmp,"%c",
-                                ((ch>=' ')&&(ch<='~'))?ch:'.');
+                               ((ch>=' ')&&(ch<='~'))?ch:'.');
 #else
                        BIO_snprintf(tmp,sizeof tmp,"%c",
-                                ((ch>=os_toascii[' '])&&(ch<=os_toascii['~']))
-                                ? os_toebcdic[ch]
-                                : '.');
+                               ((ch>=os_toascii[' '])&&(ch<=os_toascii['~']))
+                               ? os_toebcdic[ch]
+                               : '.');
 #endif
                        BUF_strlcat(buf,tmp,sizeof buf);
                        }
                BUF_strlcat(buf,"\n",sizeof buf);
-               /* if this is the last call then update the ddt_dump thing so that
-                * we will move the selection point in the debug window 
+               /* if this is the last call then update the ddt_dump thing so
+                * that we will move the selection point in the debug window
                 */
-               ret+=BIO_write(bio,(char *)buf,strlen(buf));
+               ret+=cb((void *)buf,strlen(buf),u);
                }
 #ifdef TRUNCATE
        if (trc > 0)
                {
                BIO_snprintf(buf,sizeof buf,"%s%04x - <SPACES/NULS>\n",str,
-                            len+trc);
-               ret+=BIO_write(bio,(char *)buf,strlen(buf));
+                       len+trc);
+               ret+=cb((void *)buf,strlen(buf),u);
                }
 #endif
        return(ret);
        }
+
+#ifndef OPENSSL_NO_FP_API
+static int write_fp(const void *data, size_t len, void *fp)
+       {
+       return fwrite(data, len, 1, (FILE *)fp);
+       }
+int BIO_dump_fp(FILE *fp, const char *s, int len)
+       {
+       return BIO_dump_cb(write_fp, fp, s, len);
+       }
+int BIO_dump_indent_fp(FILE *fp, const char *s, int len, int indent)
+       {
+       return BIO_dump_indent_cb(write_fp, fp, s, len, indent);
+       }
+#endif
+
+static int write_bio(const void *data, size_t len, void *bp)
+       {
+       return BIO_write((BIO *)bp, (const char *)data, len);
+       }
+int BIO_dump(BIO *bp, const char *s, int len)
+       {
+       return BIO_dump_cb(write_bio, bp, s, len);
+       }
+int BIO_dump_indent(BIO *bp, const char *s, int len, int indent)
+       {
+       return BIO_dump_indent_cb(write_bio, bp, s, len, indent);
+       }
+
index e8bb8aa..7068b18 100644 (file)
@@ -573,9 +573,16 @@ int BIO_sock_should_retry(int i);
 int BIO_sock_non_fatal_error(int error);
 int BIO_fd_should_retry(int i);
 int BIO_fd_non_fatal_error(int error);
+int BIO_dump_cb(int (*cb)(const void *data, size_t len, void *u),
+               void *u, const char *s, int len);
+int BIO_dump_indent_cb(int (*cb)(const void *data, size_t len, void *u),
+                      void *u, const char *s, int len, int indent);
 int BIO_dump(BIO *b,const char *bytes,int len);
 int BIO_dump_indent(BIO *b,const char *bytes,int len,int indent);
-
+#ifndef OPENSSL_NO_FP_API
+int BIO_dump_fp(FILE *fp, const char *s, int len);
+int BIO_dump_indent_fp(FILE *fp, const char *s, int len, int indent);
+#endif
 struct hostent *BIO_gethostbyname(const char *name);
 /* We might want a thread-safe interface too:
  * struct hostent *BIO_gethostbyname_r(const char *name,