strlcpy 和 strlcat 源码

strlcpy.cpp

size_t strlcpy( char *dst, const char *src, size_t siz )
{
    char*            d = dst;
    const char*        s = src;
    size_t            n = siz;

    if (s == 0 || d == 0) return 0;

    /* Copy as many bytes as will fit */
    if (n != 0 && --n != 0)
    {
        do
        {
            if ((*d++ = *s++) == 0)
                break;
        } while (--n != 0);
    }

    /* Not enough room in dst, add NUL and traverse rest of src */
    if (n == 0)
    {
        if (siz != 0)
            *d = '\0';                /* NUL-terminate dst */
        while (*s++)
            ;
    }

    return(s - src - 1);        /* count does not include NUL */
}

strlcat.cpp

size_t strlcat( char* dst, const char* src, size_t siz )
{
    char*        d = dst;
    const char*    s = src;
    size_t        n = siz;
    size_t        dlen;

    if (s == 0 || d == 0) return 0;

    while (n-- != 0 && *d != '\0')
    {
        d++;
    }
    dlen = d - dst;
    n = siz - dlen;

    if (n == 0)
    {
        return(dlen + strlen(s));
    }
    while (*s != '\0')
    {
        if (n != 1)
        {
            *d++ = *s;
            n--;
        }
        s++;
    }
    *d = '\0';

    return(dlen + (s - src));
}

略作了修改,增加了对空指针的判断.

时间: 2024-09-20 01:13:50

strlcpy 和 strlcat 源码的相关文章

【原创】源码编译libevent-2.0.21-stable生成库文件说明

按照 README 中的说明,首先执行 configure下面的输出信息是针对源码编译所在机器进行的检测 [root@Paxos libevent-2.0.21-stable]# ./configure checking for a BSD-compatible install... /usr/bin/install -c ... configure: creating ./config.status config.status: creating libevent.pc config.stat

Linux内核源码分析--内核启动之(4)Image内核启动(setup_arch函数)(Linux-3.0 ARMv7)【转】

原文地址:Linux内核源码分析--内核启动之(4)Image内核启动(setup_arch函数)(Linux-3.0 ARMv7) 作者:tekkamanninja  转自:http://blog.chinaunix.net/uid-25909619-id-4938393.html 在分析start_kernel函数的时候,其中有构架相关的初始化函数setup_arch. 此函数根据构架而异,对于ARM构架的详细分析如下: void __init setup_arch(char **cmdli

Linux驱动修炼之道-RTC子系统框架与源码分析【转】

转自:http://helloyesyes.iteye.com/blog/1072433 努力成为linux kernel hacker的人李万鹏原创作品,为梦而战.转载请标明出处 http://blog.csdn.net/woshixingaaa/archive/2011/05/21/6436215.aspx RTC(实时时钟)是一种典型的字符设备,作为一种字符设备驱动,RTC需要有file_operations中接口函数的实现,如open(),release(),read(),poll(),

Strlcpy和strlcat——一致的、安全的字符串拷贝和串接函数【转】

转自:http://blog.csdn.net/kailan818/article/details/6731772 英文原文: http://www.gratisoft.us/todd/papers/strlcpy.html 英文作者: Todd C. Miller,  Theo de Raadt 译者:林海枫 译本地址:http://blog.csdn.net/linyt/archive/2009/07/27/4383328.aspx 注:本译文版权由译者所拥有,欢迎转载,但请注明译者和原文,

Eclipse查看Hadoop源码

1.开发环境 1.Hadoop-1.2.1 2.apache-ant-1.8.0 2.新建Java项目 项目叫"Hadoop_sourcecode" 3.拷贝Hadoop中源码 Hadoop包中src文件文件夹下core.hdfs.mapred文件夹拷贝到项目的src中 4.改变目录结构 删除原来的目录结构:   增加新的目录结构:        选定后的目录结构      5.添加Jar包 需要包含进来的jar包: "\hadoop-1.2.1\lib"中所有ja

方法-windows下praat源码编译问题!急急急急急

问题描述 windows下praat源码编译问题!急急急急急 从官网上下载的praat源码进行编译,按照网上说的方法编译,但是总是出现 make (e=2): 系统找不到指定的文件. make[1]: *** [libgsl.a] Error 2 make[1]: Leaving directory `d:/sources_5404/external/gsl' make: *** [all] Error 2 错误!试了各种方法,都没解决,望高手指点一下! 解决方案 你试了哪些方法?下面的方法试过

ubuntu 11.10(32位系统)下编译android源码 make错误解决办法

本文介绍在ubuntu 11.10系统下编译android 2.3.3源码,编译之前请确定上两篇文章(http://www.cnblogs.com/dwayne/archive/2011/11/16/2250732.html和http://www.cnblogs.com/dwayne/archive/2011/11/11/2245383.html)中所需的准备工作已经成功完成.编译完成生成系统镜像文件,并在模拟器中运行. 准备工作完成后,开始编译工作.下载下来的源码有5G多,如果按照我之前写的获

android 4.3 操作源码实现系统截屏(暂无移植性)

感谢网友cjd6568358的帮助,新版的Android系统截屏功能已经实现,需要的朋友请移步项目主页:https://github.com/Android-ScreenShot/AndroidScreenShotService(别忘点个star哦) (转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景        android系统的系统截屏功能是google封装起来的,也是大家都很想获得的,经过一个多月的漫长研究,博主终于成功的在android新

RxJava源码初探

一.前言 RxJava是用java实现的ReactiveX(Reactive Extensions)框架开源库.ReactiveX则是大名鼎鼎的响应式编程.而响应式编程和观察者模式紧紧的相关联.在看RxJava的源码中,分析起来会有点麻烦,所以才有了这篇文章,和对这个有兴趣的同学一起窥探一二. 二.观察者模式 2.1 基本原理 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式即让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观