zoukankan      html  css  js  c++  java
  • memcpy code

    memcpy

    #include <stddef.h>   //
    #include <stdint.h> //uintptr_t is quoted.
    #include "string.h"
    /*
     * sizeof(word) MUST BE A POWER OF TWO
     * SO THAT wmask BELOW IS ALL ONES
     */
    typedef    int word;        /* "word" used for optimal copy speed */
    
    #define    wsize    sizeof(word)
    #define    wmask    (wsize - 1)
    
    /*
     * Copy a block of memory, handling overlap.
     * This is the routine that actually implements
     * (the portable versions of) bcopy, memcpy, and memmove.
     */
    
    __private_extern__
    void * memcpy(void *dst0, const void *src0, size_t length)
    {
        char *dst = dst0;
        const char *src = src0;
        size_t t;
        
        if (length == 0 || dst == src)        /* nothing to do */
            goto done;
        
        /*
         * Macros: loop-t-times; and loop-t-times, t>0
         */
    #define    TLOOP(s) if (t) TLOOP1(s)
    #define    TLOOP1(s) do { s; } while (--t)
        
        if ((unsigned long)dst < (unsigned long)src) {
            /*
             * Copy forward.
             */
            t = (uintptr_t)src;    /* only need low bits */
            if ((t | (uintptr_t)dst) & wmask) {
                /*
                 * Try to align operands.  This cannot be done
                 * unless the low bits match.
                 */
                if ((t ^ (uintptr_t)dst) & wmask || length < wsize)
                    t = length;
                else
                    t = wsize - (t & wmask);
                length -= t;
                TLOOP1(*dst++ = *src++);
            }
            /*
             * Copy whole words, then mop up any trailing bytes.
             */
            t = length / wsize;
            TLOOP(*(word *)dst = *(word *)src; src += wsize; dst += wsize);
            t = length & wmask;
            TLOOP(*dst++ = *src++);
        } else {
            /*
             * Copy backwards.  Otherwise essentially the same.
             * Alignment works as before, except that it takes
             * (t&wmask) bytes to align, not wsize-(t&wmask).
             */
            src += length;
            dst += length;
            t = (uintptr_t)src;
            if ((t | (uintptr_t)dst) & wmask) {
                if ((t ^ (uintptr_t)dst) & wmask || length <= wsize)
                    t = length;
                else
                    t &= wmask;
                length -= t;
                TLOOP1(*--dst = *--src);
            }
            t = length / wsize;
            TLOOP(src -= wsize; dst -= wsize; *(word *)dst = *(word *)src);
            t = length & wmask;
            TLOOP(*--dst = *--src);
        }
    done:
        return (dst0);
    }
    
    __private_extern__ void *
    memmove(void *s1, const void *s2, size_t n)
    {
        return memcpy(s1, s2, n);
    }
    
    __private_extern__ void
    bcopy(const void *s1, void *s2, size_t n)
    {
        memcpy(s2, s1, n);

    http://www.opensource.apple.com/source/xnu/xnu-2050.18.24/libsyscall/wrappers/memcpy.c

    intptr_t

    http://www.cnblogs.com/aprilapril/p/4318769.html

  • 相关阅读:
    Docker部署Tomcat实例
    Redis+Sentinel 实现redis集群高可用
    Jenkins+Maven+SVN
    Python的装饰器
    执行hadoop fs -ls时出现错误RuntimeException: core-site.xml not found
    hbase的存储体系
    Sqoop import加载HBase过程中,遇到Permission denied: user=root, access=WRITE, inode="/user":hdfs:supergroup:drwxr-xr-x
    Java操作hbase总结
    Java文件操作 读写操作
    HBase 学习之一 <<HBase使用客户端API动态创建Hbase数据表并在Hbase下导出执行>>
  • 原文地址:https://www.cnblogs.com/aprilapril/p/4318567.html
Copyright © 2011-2022 走看看