linux-vsprintf.c

2023-10-27

/*
*  linux/kernel/vsprintf.c
*                                        //--对参数产生格式化的输出
*  (C) 1991  Linus Torvalds
*/
/* vsprintf.c -- Lars Wirzenius & Linus Torvalds. */
/*
* Wirzenius wrote this portably, Torvalds fucked it up :-)
*/
#include <stdarg.h>
#include <string.h>
/* we use this so that we can do without the ctype library */
#define is_digit(c)    ((c) >= '0' && (c) <= '9')
static int skip_atoi(const char **s)    //--atoi函数的实现,值得借鉴
{
    int i=0;
    while (is_digit(**s))
        i = i*10 + *((*s)++) - '0';
    return i;
}
#define ZEROPAD    1        /* pad with zero */
#define SIGN    2        /* unsigned/signed long */
#define PLUS    4        /* show plus */
#define SPACE    8        /* space if plus */
#define LEFT    16        /* left justified */
#define SPECIAL    32        /* 0x */
#define SMALL    64        /* use 'abcdef' instead of 'ABCDEF' */
#define do_div(n,base) ({ /                    //--n为被除数,base为除数,结果:n为商,返回值为余数
int __res; /
__asm__("divl %4":"=a" (n),"=d" (__res):"0" (n),"1" (0),"r" (base)); /
__res; })
static char * number(char * str, int num, int base, int size, int precision
    ,int type)        //--将整数转换为指定进制的字符串
{                    //--num-整数,base-进制,size-字符串长度,precision-数字长度,type-类型选项
    char c,sign,tmp[36];
    const char *digits="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int i;
    if (type&SMALL) digits="0123456789abcdefghijklmnopqrstuvwxyz";
    if (type&LEFT) type &= ~ZEROPAD;        //--屏蔽填0标志
    if (base<2 || base>36)
        return 0;
    c = (type & ZEROPAD) ? '0' : ' ' ;
    if (type&SIGN && num<0) {
        sign='-';
        num = -num;
    } else
        sign=(type&PLUS) ? '+' : ((type&SPACE) ? ' ' : 0);
    if (sign) size--;
    if (type&SPECIAL)
        if (base==16) size -= 2;
        else if (base==8) size--;
    i=0;
    if (num==0)
        tmp[i++]='0';
    else while (num!=0)
        tmp[i++]=digits[do_div(num,base)];        //--转换为字符串
    if (i>precision) precision=i;
    size -= precision;
    if (!(type&(ZEROPAD+LEFT)))
        while(size-->0)
            *str++ = ' ';
    if (sign)
        *str++ = sign;
    if (type&SPECIAL)
        if (base==8)
            *str++ = '0';
        else if (base==16) {
            *str++ = '0';
            *str++ = digits[33];
        }
    if (!(type&LEFT))
        while(size-->0)
            *str++ = c;
    while(i<precision--)
        *str++ = '0';
    while(i-->0)
        *str++ = tmp[i];
    while(size-->0)
        *str++ = ' ';
    return str;                                //--返回转换好的指向字符串末端后的指针
}
int vsprintf(char *buf, const char *fmt, va_list args)    //--送格式化输出到字符串
{                            //--output:%#+-0*m.nld/n
    int len;                //--%[flag][width][.prec][h|l|L][type]
    int i;
    char * str;
    char *s;
    int *ip;
    int flags;        /* flags to number() */        //--number函数使用的参数
    int field_width;    /* width of output field */
    int precision;        /* min. # of digits for integers; max
                   number of chars for from string */
    int qualifier;        /* 'h', 'l', or 'L' for integer fields */
    for (str=buf ; *fmt ; ++fmt) {
        if (*fmt != '%') {                        //--不是格式指示字符则放入str
            *str++ = *fmt;
            continue;
        }
            
        /* process flags */                        //--类型选项
        flags = 0;
        repeat:
            ++fmt;        /* this also skips first '%' */
            switch (*fmt) {
                case '-': flags |= LEFT; goto repeat;
                case '+': flags |= PLUS; goto repeat;
                case ' ': flags |= SPACE; goto repeat;
                case '#': flags |= SPECIAL; goto repeat;
                case '0': flags |= ZEROPAD; goto repeat;
                }
        
        /* get field width */                    //--取参数字段宽度阈值
        field_width = -1;
        if (is_digit(*fmt))
            field_width = skip_atoi(&fmt);
        else if (*fmt == '*') {                    //--*后面指定宽度
            /* it's the next argument */        //--这里有个bug,应加入++fmt;
            field_width = va_arg(args, int);
            if (field_width < 0) {
                field_width = -field_width;
                flags |= LEFT;
            }
        }
        /* get the precision */                    //--取精度信息
        precision = -1;
        if (*fmt == '.') {
            ++fmt;    
            if (is_digit(*fmt))
                precision = skip_atoi(&fmt);
            else if (*fmt == '*') {
                /* it's the next argument */
                precision = va_arg(args, int);
            }
            if (precision < 0)
                precision = 0;
        }
        /* get the conversion qualifier */        //--分析长度修饰符
        qualifier = -1;
        if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L') {
            qualifier = *fmt;
            ++fmt;
        }
        switch (*fmt) {                            //--分析转换指示符
        case 'c':
            if (!(flags & LEFT))
                while (--field_width > 0)
                    *str++ = ' ';
            *str++ = (unsigned char) va_arg(args, int);
            while (--field_width > 0)
                *str++ = ' ';
            break;
        case 's':
            s = va_arg(args, char *);
            len = strlen(s);
            if (precision < 0)
                precision = len;
            else if (len > precision)
                len = precision;
            if (!(flags & LEFT))
                while (len < field_width--)
                    *str++ = ' ';
            for (i = 0; i < len; ++i)
                *str++ = *s++;
            while (len < field_width--)
                *str++ = ' ';
            break;
        case 'o':
            str = number(str, va_arg(args, unsigned long), 8,
                field_width, precision, flags);
            break;
        case 'p':
            if (field_width == -1) {
                field_width = 8;
                flags |= ZEROPAD;
            }
            str = number(str,
                (unsigned long) va_arg(args, void *), 16,
                field_width, precision, flags);
            break;
        case 'x':
            flags |= SMALL;
        case 'X':
            str = number(str, va_arg(args, unsigned long), 16,
                field_width, precision, flags);
            break;
        case 'd':
        case 'i':
            flags |= SIGN;
        case 'u':
            str = number(str, va_arg(args, unsigned long), 10,
                field_width, precision, flags);
            break;
        case 'n':
            ip = va_arg(args, int *);
            *ip = (str - buf);
            break;
        default:
            if (*fmt != '%')
                *str++ = '%';
            if (*fmt)
                *str++ = *fmt;
            else
                --fmt;
            break;
        }
    }
    *str = '/0';
    return str-buf;
}
|xGv00|fcc8d4de8197f69fde70263fb4d52380
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux-vsprintf.c 的相关文章

  • 查找不在列表中的最小非负整数的算法

    给定一个整数列表 我怎样才能最好地找到一个整数not在列表中 该列表可能非常大 并且整数也可能很大 即 BigIntegers 而不仅仅是 32 位整数 如果有什么区别 列表 可能 已排序 即 99 的时间都会排序 但我不能依赖总是排序 E
  • Int 转换不起作用[重复]

    这个问题在这里已经有答案了 我正在为我的游戏创建高分功能 但无法让它发挥作用 这是我的方法 def game over self Game over Screen keys pygame key get pressed self gameo
  • Powershell 添加内容截断输出

    我在 PowerShell 脚本中使用 Add Content cmdlet 将 foreach 循环中的匹配项写入单独的文本文件 为此 我使用以下代码 Add Content Path varListNotFound match The
  • 检查字符串变量是否具有整数值

    我正在开发一个项目 允许孩子们向圣诞老人发送消息 不幸的是 如果他们在 AGE 字段中输入字符串而不是整数 则程序会崩溃并返回 Conversion from string exampleString to type Double is n
  • SQL Server:将 bool 转换为整数

    为什么查询 SELECT CAST column LIKE string AS INT 100 return 关键字 AS 附近的语法不正确 因为 bool 不是 T SQL 中的类型 它不存在 布尔表达式不是位类型 他们不have类型 仅
  • 如何测试无损双精度/整数转换?

    我有一个 double 和一个 int64 t 我想知道它们是否具有完全相同的值 以及将一种类型转换为另一种类型是否不会丢失任何信息 我当前的实现如下 int int64EqualsDouble int64 t i double d ret
  • 如何在C++中存储1000000位整数

    在我的问题中 我必须保存大整数 例如最多 1000000 位数字 并执行一些操作 我该怎么做 我知道 C 中的 long int 最多可以存储 10 位数字 您可以使用GMP http gmplib org GNU 任意精度库 请注意 这不
  • 如何在 C 中使用 write() 函数写入整数? [复制]

    这个问题在这里已经有答案了 我是 C 菜鸟 正在尝试使用write 显示整数的函数 这是我的代码 int n 7 write 1 n 4 我想展示7 但是当我设置时程序没有显示任何内容或其他奇怪的字符n到一个大数字 我缺少什么 类似的对象i
  • 整数比较值的输出错误

    我有以下代码 public static void doIntCompareProcess int a 100 int b 100 Integer c 200 Integer d 200 int f 20000 int e 20000 Sy
  • Swift - 将数组写入文本文件

    我从一个包含几千行纯文本的文件中读入 myArray 原生 Swift myData String stringWithContentsOfFile myPath encoding NSUTF8StringEncoding error ni
  • 如果可能的话,如何在 C 中定义 2 位数字?

    对于我的大学过程 我正在模拟一个称为随机顺序吸附的过程 我必须做的一件事是随机地将正方形 不能重叠 放置到格子上 直到没有更多空间为止 重复该过程几次以找到平均 干扰 覆盖率 基本上我正在对一个大的整数数组执行操作 其中存在 3 个可能的值
  • 将浮点数向下舍入到最接近的整数?

    我想获取一个浮点数并将其向下舍入到最接近的整数 然而 如果它不是一个整体 我always想要向下舍入变量 无论它与下一个整数的接近程度如何 有没有办法做到这一点 int x 转换为整数将截断 朝向 0 0 例如math trunc 对于非负
  • mysql中auto_increment(整数)的限制是多少

    我有一个mysql数据库 我在其中使用auto increment integer 你能告诉我它可以增加多少整数吗 我们如何提高auto increment的限制 的极限auto increment column 是列的大小 https d
  • 当 python 添加小整数时,幕后会发生什么? [复制]

    这个问题在这里已经有答案了 我正在摆弄id最近意识到 c Python 做了一些非常明智的事情 它确保小整数始终具有相同的值id gt gt gt a b c d e 1 2 3 4 5 gt gt gt f g h i j 1 2 3 4
  • Lua中如何获取表中的最大整数?

    Lua中如何获取表中的最大整数 在Lua 5 1及更早版本中 你可以使用 math max unpack 1 2 3 4 5 这受到Lua堆栈大小的限制 在 PUC Lua 5 1 上 该值的最大值可达 ca 8000 个数字 如果堆栈空闲
  • 如何创建一个在给定范围内随机打乱数字的 int 数组[重复]

    这个问题在这里已经有答案了 基本上 假设我有一个可以容纳 10 个数字的 int 数组 这意味着我可以在每个索引中存储 0 9 每个数字只能存储一次 如果我运行下面的代码 int num new int 10 for int i 0 i l
  • 如何生成满足某些限制的整数?

    任何人都可以帮我提供生成满足某些限制的整数的技术吗 例如 假设我需要生成整数 x 和 y 使得 100 gt x and y lt x 5 我指的并不是这个特定的示例 而是一些生成满足某些条件的整数的通用技术 嗯 这并不难 选择一个整数 可
  • ANSI C,整数到字符串,不带可变参数函数

    我目前正在使用支持 ANSI C 的 PLC 但使用它自己的 GNU 编译器风格 它不编译任何可变参数函数和 itoa 之类的东西 所以使用 sprintf co 不是将整数转换为字符串的选项 任何人都可以引导我到一个列出了健壮的 无 sp
  • Javascript 是否处理整数上溢和下溢?如果是,怎么办?

    我们知道Java不处理下溢和溢出 https stackoverflow com questions 3001836 how does java handle integer underflows and overflows and how
  • 将两个 Int 值相除以获得 Float 的正确方法是什么?

    我想分两份IntHaskell 中的值并获得结果Float 我尝试这样做 foo Int gt Int gt Float foo a b fromRational a b 但 GHC 版本 6 12 1 告诉我 无法将预期类型 Intege

随机推荐

  • 【React】使用react登陆,跳转首页

    序 在当今数字化的时代 人们越来越依赖网络和应用程序 对于这些应用程序 用户的登录是其中一个最基本和关键的功能 React是一种非常流行的JavaScript库 它可以帮助我们构建复杂的用户界面 并提供了丰富的工具和组件来管理应用程序的状态
  • java se官网_Java下载

    安装步骤 1 首先在本站下载JAVA JDK官方软件包 下载完成后得到zip格式的压缩包 解压完成后我们双击运行exe文件 进入安装向导界面 如下图所示 点击下一步继续安装 Java Development Kit截图2 2 进入JAVA下
  • 网购中7天无理由退货、运费险及退货退款流程图

    流程图 心得体会 1 淘宝买东西 一定事先看好 不要想着有7天无理由 这甚至是最基本条件 国家规定的 和运费险 大件家具 退货率高等商品 没有运费险购买 能退货也是质量问题不出邮费 非质量问题还要出邮费 特别是洗衣机 冰箱 空调等大件 2
  • 软件开发架构设计_Demo(概要)

    软件开发架构设计概要 项目背景 项目的历史背景 为什么要这个项目 阅读对象 设计 开发 测试人员 约定术语 项目中约定成俗的东西 整体架构 主要从整个IT层描述系统所处的位置 与周边关联系统之间的调用关系 逻辑架构 系统内部功能模块的划分以
  • hive数据仓库--Hive介绍

    1 什么是Hive Hive是基于Hadoop的 个数据仓库 具 来进 数据提取 转化 加载 这是 种可以存储 查询和分析存储在Hadoop中的 规模数据的机制 Hive数据仓库 具能 将结构化的数据 件映射为 张数据库表 并提供类SQL的
  • 探索AI图像安全,助力可信AI发展

    探索AI图像安全 助力可信AI发展 0 前言 1 人工智能发展与安全挑战 1 1 人工智能及其发展 1 2 人工智能安全挑战 2 WAIC 2023 多模态基础大模型的可信 AI 2 1 WAIC 2023 专题论坛 2 2 走进合合信息
  • 【教程、技巧】Solid Works 2020 开启“小金球”

    Solid Works 2020 开启 小金球 一 操作须知 免责声明 修改注册表有一定风险 若继续进行操作表明你有能力承担相应的风险 带来的损失与笔者无关 注意事项 操作前请先关闭正在运行的SolidWorks A卡请看这里 N卡请看这里
  • 关于qt连接数据库,成功打开,感觉明明有表,但是读不到数据的问题

    2023 9 9 关于qt连接数据库 成功打开 感觉明明有表 但是读不到数据的问题 首先我的代码是没有问题的 其实这是一个使用qtcreator的编译问题 上图是我的项目结构 eMarket db文件与源代码放在同级目录下 源码如上图 产生
  • MySQL学习笔记(一)

    一 MySQL基础命令 1 关系型MySQL在互联网行业广泛使用 目前主流版本有5 7 x和8 0 x 企业使用5 7 x的较多一些 8 0 x性能提升较高 逐渐有很多公司用起来8 0 x版本了 本文以mysql5 7 29版本总结 依持久
  • python中tk的用法_python3.0 tk的使用

    展开全部 有什么问题吗32313133353236313431303231363533e78988e69d8331333361303038 刚好之前写过一些关于py3 tk的东西 可以一起探讨一下 给你一个例子 import urllib
  • Linux开启Docker远程访问并设置安全访问(证书密钥)

    bin sh ip 你的IP password 你的密码 3个字节以上 不然生成文件数不对 dir root docker cert 证书生成位置 validity period 10 证书有效期10年 将此shell脚本在安装docker
  • kali2022安装冰蝎

    资源包准备 下载java8 因其客户端要求jre8 服务端 net 2 0 php 5 3 7 4 java 6 Java Archive Downloads Java SE 8 冰蝎下载地址 https github com rebeyo
  • 查看Eclipse版本号及各个版本区别

    1 找到eclipse安装目录 2 进入readme文件夹 打开readme eclipse html 3 readme eclipse html呈现的第二行即数字版本号 如 Eclipse Project Release Notes Re
  • Idea集成Yapi插件自动生成接口文档

    1 Idea安装插件 easy yapi 2 安装后重启Idea 3 打开settings 在Other Settings下打开EasyApi菜单 配置Yapi服务器地址 只需要对应的ip与端口即可 不需要具体那个项目 4 打开对应需要生成
  • Spring Boot 2,吃透这份阿里P8纯手打Java面经

    如何使用Elasticsearch 安装Elasticsearch https www elastic co cn downloads elasticsearch 这里我们选择的是6 2 2版本的ES 因为我在spring data ela
  • 百度Q4及全年财报:百度智能云强化AI优势,文心一言将推动云市场格局洗牌

    北京时间2月22日 百度 NASDAQ BIDU HKEX 9888 发布了截至2022年12月31日的第四季度及全年未经审计的财务报告 2022年 百度实现营收1236 75亿元 归属百度的净利润 非美国通用会计准则 206 8亿元 同比
  • 初学者必会的100个编程代码

    这是本文的目录 前言 1 for循环中的else条件 2 数字求和 3 随机数生成 4 将列表中的所有元素作为参数传递给函数 5 获取列表的所有中间元素 6 使用一行代码赋值多个变量 7 Python清空列表 8 通过Enum枚举同一标签或
  • Android中Fragment的hide和show的一些技巧

    我们App中主页是四个Fragment 通过RadioGroup的onCheckChanged来调用show和hide实现主页面Fragment的切换 此时就有一个问题就是 我们需要知道每一个Fragment的生命周期 此时就可以重写 Ov
  • 接受拖放文件

    需要重载类的WM DROPFILE消息 接受拖放的文件并显示路径与文件名的示例 void CYuEdit OnDropFiles HDROP hDropInfo TODO Add your message handler code here
  • linux-vsprintf.c

    linux kernel vsprintf c 对参数产生格式化的输出 C 1991 Linus Torvalds vsprintf c Lars Wirzenius Linus Torvalds Wirzenius wrote this