Branch data Line data Source code
1 : 1 : // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
2 : : // SPDX-License-Identifier: MIT OR LGPL-2.0-or-later
3 : : // SPDX-FileCopyrightText: 2012 Red Hat, Inc.
4 : : // SPDX-FileCopyrightText: 2012 Giovanni Campagna <scampa.giovanni@gmail.com>
5 : :
6 : : /* exported vprintf */
7 : :
8 : 1 : let numberFormatter = null;
9 : :
10 : 18 : function vprintf(string, args) {
11 : 18 : let i = 0;
12 : 18 : let usePos = false;
13 : 40 : return string.replace(/%(?:([1-9][0-9]*)\$)?(I+)?([0-9]+)?(?:\.([0-9]+))?(.)/g, function (str, posGroup, flagsGroup, widthGroup, precisionGroup, genericGroup) {
14 [ - + ][ + + ]: 22 : if (precisionGroup !== '' && precisionGroup !== undefined &&
15 [ + + ]: 2 : genericGroup !== 'f')
16 : 1 : throw new Error("Precision can only be specified for 'f'");
17 : :
18 [ + + ]: 21 : let hasAlternativeIntFlag = flagsGroup &&
19 : 1 : flagsGroup.indexOf('I') !== -1;
20 [ + + ][ + + ]: 21 : if (hasAlternativeIntFlag && genericGroup !== 'd')
21 : 1 : throw new Error("Alternative output digits can only be specified for 'd'");
22 : :
23 [ + + ]: 20 : let pos = parseInt(posGroup, 10) || 0;
24 [ + + ][ + + ]: 20 : if (!usePos && i === 0)
25 : 16 : usePos = pos > 0;
26 [ + + ][ + + ]: 20 : if (usePos && pos === 0 || !usePos && pos > 0)
[ + + ][ + + ]
27 : 1 : throw new Error('Numbered and unnumbered conversion specifications cannot be mixed');
28 : :
29 [ + + ][ + + ]: 19 : let fillChar = widthGroup && widthGroup[0] === '0' ? '0' : ' ';
30 [ + + ]: 19 : let width = parseInt(widthGroup, 10) || 0;
31 : :
32 : 17 : function fillWidth(s, c, w) {
33 : 17 : let fill = c.repeat(w);
34 : 17 : return fill.substr(s.length) + s;
35 : 17 : }
36 : :
37 : 17 : function getArg() {
38 [ + + ]: 17 : return usePos ? args[pos - 1] : args[i++];
39 : : }
40 : :
41 : 19 : let s = '';
42 [ + + ][ + + ]: 19 : switch (genericGroup) {
[ + + ][ + + ]
[ + + ]
43 : : case '%':
44 : 1 : return '%';
45 : : case 's':
46 : 5 : s = String(getArg());
47 : : break;
48 : 9 : case 'd': {
49 : 9 : let intV = parseInt(getArg());
50 [ + - ]: 9 : if (hasAlternativeIntFlag) {
51 [ # # ]: 0 : numberFormatter ??= new Intl.NumberFormat();
52 : 0 : s = numberFormatter.format(intV);
53 : : } else {
54 : 9 : s = intV.toString();
55 : : }
56 : 9 : break;
57 : : }
58 : : case 'x':
59 : 1 : s = parseInt(getArg()).toString(16);
60 : : break;
61 : : case 'f':
62 [ - + ][ + + ]: 2 : if (precisionGroup === '' || precisionGroup === undefined)
63 : 1 : s = parseFloat(getArg()).toString();
64 : : else
65 : 1 : s = parseFloat(getArg()).toFixed(parseInt(precisionGroup));
66 : : break;
67 : : default:
68 : 1 : throw new Error(`Unsupported conversion character %${genericGroup}`);
69 : : }
70 : 17 : return fillWidth(s, fillChar, width);
71 : 18 : });
72 : 14 : }
|