MCPcopy Create free account
hub / github.com/Serial-Studio/Serial-Studio / luaO_pushvfstring

Function luaO_pushvfstring

lib/lua/src/lobject.c:480–546  ·  view source on GitHub ↗

** this function handles only '%d', '%c', '%f', '%p', '%s', and '%%' conventional formats, plus Lua-specific '%I' and '%U' */

Source from the content-addressed store, hash-verified

478 conventional formats, plus Lua-specific '%I' and '%U'
479*/
480const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) {
481 BuffFS buff; /* holds last part of the result */
482 const char *e; /* points to next '%' */
483 buff.pushed = buff.blen = 0;
484 buff.L = L;
485 while ((e = strchr(fmt, '%')) != NULL) {
486 addstr2buff(&buff, fmt, e - fmt); /* add 'fmt' up to '%' */
487 switch (*(e + 1)) { /* conversion specifier */
488 case 's': { /* zero-terminated string */
489 const char *s = va_arg(argp, char *);
490 if (s == NULL) s = "(null)";
491 addstr2buff(&buff, s, strlen(s));
492 break;
493 }
494 case 'c': { /* an 'int' as a character */
495 char c = cast_uchar(va_arg(argp, int));
496 addstr2buff(&buff, &c, sizeof(char));
497 break;
498 }
499 case 'd': { /* an 'int' */
500 TValue num;
501 setivalue(&num, va_arg(argp, int));
502 addnum2buff(&buff, &num);
503 break;
504 }
505 case 'I': { /* a 'lua_Integer' */
506 TValue num;
507 setivalue(&num, cast(lua_Integer, va_arg(argp, l_uacInt)));
508 addnum2buff(&buff, &num);
509 break;
510 }
511 case 'f': { /* a 'lua_Number' */
512 TValue num;
513 setfltvalue(&num, cast_num(va_arg(argp, l_uacNumber)));
514 addnum2buff(&buff, &num);
515 break;
516 }
517 case 'p': { /* a pointer */
518 const int sz = 3 * sizeof(void*) + 8; /* enough space for '%p' */
519 char *bf = getbuff(&buff, sz);
520 void *p = va_arg(argp, void *);
521 int len = lua_pointer2str(bf, sz, p);
522 addsize(&buff, len);
523 break;
524 }
525 case 'U': { /* a 'long' as a UTF-8 sequence */
526 char bf[UTF8BUFFSZ];
527 int len = luaO_utf8esc(bf, va_arg(argp, long));
528 addstr2buff(&buff, bf + UTF8BUFFSZ - len, len);
529 break;
530 }
531 case '%': {
532 addstr2buff(&buff, "%", 1);
533 break;
534 }
535 default: {
536 luaG_runerror(L, "invalid option '%%%c' to 'lua_pushfstring'",
537 *(e + 1));

Callers 4

luaO_pushfstringFunction · 0.85
luaG_runerrorFunction · 0.85
lua_pushvfstringFunction · 0.85
lua_pushfstringFunction · 0.85

Calls 6

addstr2buffFunction · 0.85
addnum2buffFunction · 0.85
getbuffFunction · 0.85
luaO_utf8escFunction · 0.85
luaG_runerrorFunction · 0.85
clearbuffFunction · 0.85

Tested by

no test coverage detected