Reference Section
_buf_ccpy {
char sbuf[] = "AAAAABBBBBBBBBBBBCCCCCCCCCCCCCC\
DDDDDDDDDDDDDDDEFFFFF";
char dbuf[100];
int status;
unsigned int srcsize=sizeof(sbuf)-1,destsize=sizeof(dbuf)-1;
void *srcbuf = sbuf, *destbuf = dbuf;
status = _buf_ccpy(&srcbuf,&srcsize,&destbuf,&destsize,'E');
switch(status)
{
case 1: _put_str("Entire buffer copied"); break;
case 0: _put_str("Remainder of buffer needs copied");
_buf_cpy(&srcbuf, &srcsize, &destbuf, &destsize);
break;
case -1: _put_str("Destination buffer not large enough");
default: break;
}
...
}
#include <inline.h>
{
char sbuf[] = "AAAAABBBBBBBBBBBBCCCCCCCCCCCCCC\
DDDDDDDDDDDDDDDEFFFFF";
char dbuf[100];
unsigned srcsize, destsize;
...
srcsize = sizeof(sbuf);
destsize = sizeof(dbuf);
lea si,sbuf /* SI = offset source buffer */
mov cx,srcsize/* CX = source size */
pushss
pop es /* ES = DS = SS in small data */
lea di,dbuf /* DI = offset destination buf */
mov dx,destsize/* DX = destination size */
mov al,'E' /* AL = 'stop' character (chr) */
buf_ccpy(); /* copy characters */
ja label_010/* chars copied, chr not found */
jb label_020/* destbuf full, chr not found */
... /* all chars copied, to 'E' */
...
label_010:
... /* entire buffer copied */
label_020:
... /* destination buf too small */
}
Source file _BUFCCPY.ASM ASM equiv BUF_CCPY
{
char b1[] = "AAAAABBBBBBBBBBBBCCCCCCCCCCCCCC\
DDDDDDDDDDDDDDDEFFFFF";
char b2[] = "AAAAABBBBBBBBBBBBCCCCCCCCCCCCCC\
DDDDDDDDDDDDDDDEFFFFFGHIJ";
int status;
unsigned int buf1size=sizeof(b1)-1, buf2size=sizeof(b2)-1;
void *buffer1 = b1, *buffer2 = b2;
status = _buf_cmp(&buffer1, &buf1size, &buffer2, &buf2size);
switch(status)
{
case 0: _put_str("Buffers are identical"); break;
case -1:
case 1: _put_str("Buffer1 -> ");
_put_str(buffer1);/* display rest of buffer1 */
_put_str("\n\rBuffer2 -> ");
_put_str(buffer2);/* display rest of buffer2 */
break;
default: break;
}
...
}
#include <inline.h>
{
char b1[]="AAAAABBBBBBBBBBBBCCCCCCCCCCCCCCDDDDDDDDDDDDDDDEFFFFF";
char b2[]="AAAAABBBBBBBBBBBBCCCCCCCCCCCCCC\
DDDDDDDDDDDDDDDEFFFFFGHIJ";
char *str;
int status;
unsigned int buf1size = sizeof(b1)-1, buf2size = sizeof(b2)-1;
void *buffer1 = b1, *buffer2 = b2;
...
mov si,buffer1/* DS:SI -> source buffer */
mov cx,buf1size/* CX = source size */
pushss
pop es /* ES = SS (small data model) */
mov di,buffer2/* ES:DI -> destination buffer */
mov dx,buf2size/* DX = destination size */
buf_cmp(); /* are buffers equal? */
je label_010/* y: continue */
str = "Buffer1 -> ";/* n: display differences */
mov si,str
put_str(); /* prep difference buf1 */
mov si,buffer1
put_str(); /* write buf1 differences */
put_newline();
str = "Buffer2 -> ";
mov si,str
put_str(); /* prep difference buf2 */
mov si,buffer2
put_str(); /* write buf2 differences */
label_010:
...
}
Source file _BUFCMP.ASM ASM equiv BUF_CMP
{
char b1[] = "AAAAABBBBBBBBBBBBCCCCCCCCCCCCCC\
DDDDDDDDDDDDDDDEFFFFF";
char b2[] = "AAAAABBBBBBBBBBBBCCCCCCCCCCCCCC\
DDDDDDDDDDDDDDDEFFFFFGHIJ";
int status;
unsigned int buf1size = sizeof(b1)-1, buf2size = sizeof(b2)-1;
void *buffer1 = b1, *buffer2 = b2;
status = _buf_cmpi(&buffer1, &buf1size, &buffer2, &buf2size);
switch(status)
{
case 0: _put_str("Buffers are identical"); break;
case -1:
case 1: _put_str("Buffer1 -> ");
_put_str(buffer1);/* display rest of buffer1 */
_put_str("\n\rBuffer2 -> ");
_put_str(buffer2);/* display rest of buffer2 */
break;
default: break;
}
...
}
#include <inline.h>
{
char b1[] = "AAAAABBBBBBBBBBBBCCCCCCCCCCCCCC\
DDDDDDDDDDDDDDDEFFFFF";
char b2[] = "AAAAABBBBBBBBBBBBCCCCCCCCCCCCCC\
DDDDDDDDDDDDDDDEFFFFFGHIJ";
char *str;
int status;
unsigned int buf1size=sizeof(b1)-1, buf2size=sizeof(b2)-1;
void *buffer1 = b1, *buffer2 = b2;
...
mov si,buffer1/* DS:SI -> source buffer */
mov cx,buf1size/* CX = source size */
mov di,buffer2/* ES:DI -> destination buffer */
mov dx,buf2size/* DX = destination size */
buf_cmpi(); /* buffers equal? (ignore case)*/
je label_010/* y: continue */
str = "Buffer1 -> ";/* n: display differences */
mov si,str
put_str(); /* prep difference buf1 */
mov si,buffer1
put_str(); /* write buf1 differences */
put_newline();
str = "Buffer2 -> ";
mov si,str
put_str(); /* prep difference buf2 */
mov si,buffer2
put_str(); /* write buf2 differences */
label_010:
...
}
Source file _BUFCMPI.ASM ASM equiv BUF_CMPI
{
char sbuf[] = "AAAAAAAABBBBBBBBBBBBCCCCCCCCCCCCDEEEEEEEEEE";
char dbuf[100];
unsigned srcsize, destsize;
void *srcbuf = sbuf, *destbuf = dbuf;
srcbuf = sbuf;
srcsize = sizeof(sbuf);
destbuf = dbuf;
while (srcsize != 0)
{
destsize = 10;/* copy 10 bytes at a time */
_buf_cpy(&srcbuf, &srcsize, &destbuf, &destsize);
}
...
}
#include <inline.h>
{
char sbuf[] = "AAAAAAAABBBBBBBBBBBBCCCCCCCCCCCCDEEEEEEEEEE";
char dbuf[100];
unsigned srcsize;
void *srcbuf = sbuf, *destbuf = dbuf;
...
srcbuf = sbuf;
srcsize = sizeof(sbuf);
destbuf = dbuf;
srcsize = sizeof(sbuf);
srcbuf = sbuf; /* srcbuf -> sbuf */
destbuf = dbuf; /* destbuf -> dbuf */
mov si,srcbuf/* DS:SI -> sbuf */
mov cx,srcsize/* CX = size of sbuf */
mov di,destbuf/* ES:DI -> dbuf */
label_010:
mov dx,10 /* number of bytes to copy */
buf_cpy();
testcx,cx /* is copy complete? */
jnzlabel_010/* n: copy 10 bytes more */
...
}
Source file _BUFCPY.ASM ASM equiv BUF_CPY