函数逻辑报告

Linux Kernel

v5.5.9

Brick Technologies Co., Ltd

Source Code:lib\vsprintf.c Create Date:2022-07-27 07:09:50
Last Modify:2022-05-21 09:47:42 Copyright©Brick
首页 函数Tree
注解内核,赢得工具下载SCCTEnglish

函数名称:vsscanf - Unformat a buffer into a list of arguments*@buf: input buffer*@fmt: format of buffer*@args: arguments

函数原型:int vsscanf(const char *buf, const char *fmt, va_list args)

返回类型:int

参数:

类型参数名称
const char *buf
const char *fmt
va_listargs
3190  str等于buf
3193  num等于0
3196  union{long long s;unsigned long long u;}val
3203 fmt循环
3214  如果fmt不等于'%'且fmt
3215  如果fmt自加不等于str自加则退出
3217  继续下一循环
3220  如果非fmt退出
3222  fmt先自加
3227  如果fmt恒等于'*'则
3228  如果非str退出
3232  如果fmt恒等于'['则返回:num
3234  fmt自加
3237  str自加
3238  继续下一循环
3242  field_width等于负1
3243  如果isdigit( * fmt)则
3245  如果field_width小于等于0则退出
3250  qualifier等于负1
3251  如果fmt恒等于'h'或Fast implementation of tolower() for internal usage. Do not use in your* code.恒等于'l'或fmt恒等于'z'则
3253  qualifier等于fmt自加
3255  如果qualifier恒等于'h'则
3256  qualifier等于'H'
3257  fmt自加
3258  否则如果qualifier恒等于'l'则
3259  qualifier等于'L'
3260  fmt自加
3265  如果非fmt退出
3268  如果fmt恒等于'n'则
3270  va_arg(args, int * )等于strbuf
3271  fmt先自加
3272  继续下一循环
3275  如果非str退出
3278  base等于10
3279  is_sign = false
3282  :++ == 'c'
3284  s等于va_arg(args, char * )
3285  如果field_width恒等于负1则field_width等于1
3287  循环
3288  s自加等于str自加
3289 field_width先自减大于0且str循环
3290  num自加
3292  继续下一循环
3293  :++ == 's'
3295  s等于va_arg(args, char * )
3296  如果field_width恒等于负1则field_width等于SHRT_MAX
3299  str等于字符串删除空格
3302 str且非Note: isspace() must return false for %NUL-terminator ( * str)且field_width自减循环
3303  s自加等于str自加
3304  s等于'\0'
3305  num自加
3307  继续下一循环
3323  :++ == '['
3325  s等于va_arg(args, char * )
3326  DECLARE_BITMAP(set, 256) = {0}
3327  len等于0
3328  negate等于fmt恒等于'^'
3331  如果field_width恒等于负1则返回:num
3334  如果negatefmt先自加
3337 fmtfmt不等于']'循环set_bit - Atomically set a bit in memory*@nr: the bit to set*@addr: the address to start counting from* This is a relaxed atomic operation (no implied memory barriers).* Note that @nr may be almost arbitrarily large; this function is not
3341  如果非fmt或非len则返回:num
3343  fmt先自加
3345  如果negate
3346  bitmap_complement(set, set, 256)
3352  如果非st_bit - Determine whether a bit is set*@nr: bit number to test*@addr: Address to start counting from则返回:num
3355 st_bit - Determine whether a bit is set*@nr: bit number to test*@addr: Address to start counting fromfield_width自减循环
3356  s自加等于str自加
3357  s等于'\0'
3358  num先自加
3360  继续下一循环
3361  :++ == 'o'
3362  base等于8
3363  退出
3364  :++ == 'x'
3365  :++ == 'X'
3366  base等于16
3367  退出
3368  :++ == 'i'
3369  base等于0
3371  :++ == 'd'
3372  is_sign = true
3374  :++ == 'u'
3375  退出
3376  :++ == '%'
3378  如果str自加不等于'%'则返回:num
3380  继续下一循环
3381  默认
3383  返回:num
3389  str等于字符串删除空格
3391  digit等于str
3392  如果is_signdigit恒等于'-'则digit等于*str加1的和
3395  如果非digitbase恒等于16且非isxdigit(digit)或base恒等于10且非isdigit(digit)或base恒等于8且非isdigit(digit)或digit大于'7'的值或base恒等于0且非isdigit(digit)则退出
3402  如果is_signs等于如果qualifier不等于'L'则转换字符串为整形否则转换字符串为长整形
3406  否则u等于如果qualifier不等于'L'则转换字符串为无符号整形否则转换字符串为无符号长整形
3411  如果field_width大于0且nextstr大于field_width
3412  如果base恒等于0则_parse_integer_fixup_radix(str, & base)
3414 nextstr大于field_width循环
3419  next先自减
3424  :qualifier恒等于'H'
3425  如果is_signva_arg(args, signedchar * )等于s
3427  否则va_arg(args, unsignedchar * )等于u
3429  退出
3430  :qualifier恒等于'h'
3431  如果is_signva_arg(args, short * )等于s
3433  否则va_arg(args, unsignedshort * )等于u
3435  退出
3436  :qualifier恒等于'l'
3437  如果is_signva_arg(args, long * )等于s
3439  否则va_arg(args, unsignedlong * )等于u
3441  退出
3442  :qualifier恒等于'L'
3443  如果is_signva_arg(args, longlong * )等于s
3445  否则va_arg(args, unsignedlonglong * )等于u
3447  退出
3448  :qualifier恒等于'z'
3449  va_arg(args, size_t * )等于u
3450  退出
3451  默认
3452  如果is_signva_arg(args, int * )等于s
3454  否则va_arg(args, unsignedint * )等于u
3456  退出
3458  num自加
3460  如果非next退出
3462  str等于next
3465  返回:num
调用者
名称描述
sscanfsscanf - Unformat a buffer into a list of arguments*@buf: input buffer*@fmt: formatting of buffer*@...: resulting arguments