Who's Online |
33 user(s) are online ( 19 user(s) are browsing Forums)
Members: 1
Guests: 32
musashi5150,
more...
|
|
Headlines |
-
asplit.lha - utility/shell
Jan 20, 2021
-
earmark.lha - utility/text
Jan 20, 2021
-
flashmandelng.lha - graphics/misc
Jan 19, 2021
-
libwprintf.lha - development/library/misc
Jan 18, 2021
-
amiupdate_dan.lha - utility/workbench
Jan 18, 2021
-
thumbnailmaker.lha - video/misc
Jan 18, 2021
-
pythonssl.lha - library/misc
Jan 17, 2021
-
redeht_ita.lha - network/samba
Jan 17, 2021
-
aiostreams.lha - video/misc
Jan 17, 2021
-
mce.lha - game/utility
Jan 16, 2021
|
|
|
|
vswprintf implementation (need floating point support) |
Posted on: 2019/8/27 9:10
#1 |
Home away from home 
Joined: 2007/9/11 12:31
From Russia
Posts: 6707
|
@All I have found 2 vswprintf() implementations which we can use for os4 : one done by Salas00 (in his new unrar port), there is:
#include <wchar.h>
#include <string.h>
#include <stdarg.h>
struct putchdata {
wchar_t *buffer;
size_t maxlen, count;
};
static void reverse(char *str, size_t len) {
if (len > 1) {
char *start = str;
char *end = str + len - 1;
char tmp;
while (start < end) {
tmp = *end;
*end-- = *start;
*start++ = tmp;
}
}
}
static size_t itoa(unsigned num, char *dst, unsigned base, int issigned, int addplus, int uppercase) {
int a = uppercase ? 'A' : 'a';
int negative = 0;
char *d = dst;
size_t len;
if (num == 0) {
*d = '0';
return 1;
}
if (issigned && (int)num < 0 && base == 10) {
negative = 1;
num = -num;
}
while (num > 0) {
unsigned rem = num % base;
num /= base;
*d++ = (rem > 9) ? (rem - 10 + a) : (rem + '0');
}
if (negative)
*d++ = '-';
else if (addplus)
*d++ = '+';
len = d - dst;
reverse(dst, len);
return len;
}
static size_t lltoa(unsigned long long num, char *dst, unsigned base, int issigned, int addplus, int uppercase) {
int a = uppercase ? 'A' : 'a';
int negative = 0;
char *d = dst;
size_t len;
if (num == 0) {
*d = '0';
return 1;
}
if (issigned && (signed long long)num < 0 && base == 10) {
negative = 1;
num = -num;
}
while (num > 0) {
unsigned rem = num % base;
num /= base;
*d++ = (rem > 9) ? (rem - 10 + a) : (rem + '0');
}
if (negative)
*d++ = '-';
else if (addplus)
*d++ = '+';
len = d - dst;
reverse(dst, len);
return len;
}
static void putchproc(wchar_t ch, struct putchdata *pcd) {
size_t index = pcd->count;
if (ch != ' ')
pcd->count++;
if (pcd->count > pcd->maxlen)
return;
if (pcd->count == pcd->maxlen) {
pcd->buffer[index] = ' ';
return;
}
pcd->buffer[index] = ch;
}
#define PUTCH(ch) putchproc((ch), &pcd)
int vswprintf(wchar_t *buffer, size_t maxlen, const wchar_t *fmt, va_list ap) {
struct putchdata pcd;
wchar_t ch;
const wchar_t *src;
char tmp[128];
const char *hsrc;
pcd.buffer = buffer;
pcd.maxlen = maxlen;
pcd.count = 0;
while ((ch = *fmt++) != ' ') {
if (ch == '%') {
int left = 0;
int addplus = 0;
int alternate = 0;
int padzeros = 0;
size_t width = 0;
size_t limit = 0;
int longlong = 0;
int half = 0;
size_t len, i;
int uppercase;
void *ptr;
const wchar_t *start = fmt;
if ((ch = *fmt++) == ' ')
goto out;
for (;;) {
if (ch == '-')
left = 1;
else if (ch == '+')
addplus = 1;
else if (ch == '#')
alternate = 1;
else if (ch == '0')
padzeros = 1;
else
break;
if ((ch = *fmt++) == ' ')
goto out;
}
while (ch >= '0' && ch <= '9') {
width = 10 * width + (ch - '0');
if ((ch = *fmt++) == ' ')
goto out;
}
if (ch == '.') {
if ((ch = *fmt++) == ' ')
goto out;
if (ch == '*') {
limit = va_arg(ap, size_t);
if ((ch = *fmt++) == ' ')
goto out;
} else {
while (ch >= '0' && ch <= '9') {
limit = 10 * limit + (ch - '0');
if ((ch = *fmt++) == ' ')
goto out;
}
}
}
if (ch == 'L') {
longlong = 1;
if ((ch = *fmt++) == ' ')
goto out;
} else if (ch == 'l') {
if ((ch = *fmt++) == ' ')
goto out;
if (ch == 'l') {
longlong = 1;
if ((ch = *fmt++) == ' ')
goto out;
}
} else if (ch == 'h') {
half = 1;
if ((ch = *fmt++) == ' ')
goto out;
}
switch (ch) {
default:
fmt = start;
/* Fall through */
case '%':
PUTCH('%');
break;
case 'C':
case 'c':
PUTCH(va_arg(ap, wchar_t));
break;
case 'D':
case 'd':
uppercase = (ch == 'D');
if (longlong)
len = lltoa(va_arg(ap, long long), tmp, 10, 1, addplus, uppercase);
else
len = itoa(va_arg(ap, int), tmp, 10, 1, addplus, uppercase);
hsrc = tmp;
if (width > len)
width -= len;
else
width = 0;
if (left == 0) {
for (i = 0; i < width; i++) PUTCH(padzeros ? '0' : ' ');
}
for (i = 0; i < len; i++) PUTCH(hsrc[i]);
if (left != 0) {
for (i = 0; i < width; i++) PUTCH(' ');
}
break;
case 'U':
case 'u':
uppercase = (ch == 'U');
if (longlong)
len = lltoa(va_arg(ap, unsigned long long), tmp, 10, 0, addplus, uppercase);
else
len = itoa(va_arg(ap, unsigned int), tmp, 10, 0, addplus, uppercase);
hsrc = tmp;
if (width > len)
width -= len;
else
width = 0;
if (left == 0) {
for (i = 0; i < width; i++) PUTCH(padzeros ? '0' : ' ');
}
for (i = 0; i < len; i++) PUTCH(hsrc[i]);
if (left != 0) {
for (i = 0; i < width; i++) PUTCH(' ');
}
break;
case 'X':
case 'x':
uppercase = (ch == 'X');
if (longlong)
len = lltoa(va_arg(ap, unsigned long long), tmp, 16, 0, addplus, uppercase);
else
len = itoa(va_arg(ap, unsigned int), tmp, 16, 0, addplus, uppercase);
hsrc = tmp;
if (width > len)
width -= len;
else
width = 0;
if (left == 0) {
for (i = 0; i < width; i++) PUTCH(padzeros ? '0' : ' ');
}
for (i = 0; i < len; i++) PUTCH(hsrc[i]);
if (left != 0) {
for (i = 0; i < width; i++) PUTCH(' ');
}
break;
case 'P':
case 'p':
uppercase = (ch == 'P');
ptr = va_arg(ap, void *);
len = itoa((unsigned)ptr, tmp, 16, 0, 0, uppercase);
hsrc = tmp;
width = 8;
if (width > len)
width -= len;
else
width = 0;
if (alternate && ptr != NULL) {
PUTCH('0');
PUTCH('x');
}
for (i = 0; i < width; i++) PUTCH('0');
for (i = 0; i < len; i++) PUTCH(hsrc[i]);
break;
case 'S':
case 's':
if (half) {
hsrc = va_arg(ap, const char *);
if (hsrc == NULL)
hsrc = "(null)";
len = strlen(hsrc);
if (limit > 0 && len > limit)
len = limit;
if (width > len)
width -= len;
else
width = 0;
if (left == 0) {
for (i = 0; i < width; i++) PUTCH(' ');
}
for (i = 0; i < len; i++) PUTCH(hsrc[i]);
if (left != 0) {
for (i = 0; i < width; i++) PUTCH(' ');
}
} else {
src = va_arg(ap, const wchar_t *);
if (src == NULL)
src = L"(null)";
len = wcslen(src);
if (limit > 0 && len > limit)
len = limit;
if (width > len)
width -= len;
else
width = 0;
if (left == 0) {
for (i = 0; i < width; i++) PUTCH(' ');
}
for (i = 0; i < len; i++) PUTCH(src[i]);
if (left != 0) {
for (i = 0; i < width; i++) PUTCH(' ');
}
}
break;
}
} else {
PUTCH(ch);
}
}
out:
PUTCH(' ');
return pcd.count;
}
int swprintf(wchar_t *buffer, size_t maxlen, const wchar_t *fmt, ...) {
va_list ap;
int wc;
va_start(ap, fmt);
wc = vswprintf(buffer, maxlen, fmt, ap);
va_end(ap);
return wc;
}
And another one i use since some time done by AROS team, there is:
#include <stdarg.h>
#include <stdlib.h>
#include <ctype.h>
#include <wchar.h>
#include <wctype.h>
#include <limits.h>
#include <string.h>
#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 LARGE 64 /* use 'ABCDEF' instead of 'abcdef' */
#define do_div(n,base) ({
int __res;
__res = ((unsigned long long) n) % (unsigned) base;
n = ((unsigned long long) n) / (unsigned) base;
__res; })
static int skip_atoi(const wchar_t **s)
{
int i=0;
while (iswdigit(**s))
i = i*10 + *((*s)++) - L'0';
return i;
}
static wchar_t *
number (wchar_t *str, long long num, int base, int size, int precision,
int type)
{
wchar_t c,sign,tmp[66];
const wchar_t *digits = L"0123456789abcdefghijklmnopqrstuvwxyz";
int i;
if (type & LARGE)
digits = L"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
if (type & LEFT)
type &= ~ZEROPAD;
if (base < 2 || base > 36)
return 0;
c = (type & ZEROPAD) ? L'0' : L' ';
sign = 0;
if (type & SIGN)
{
if (num < 0)
{
sign = L'-';
num = -num;
size--;
}
else if (type & PLUS)
{
sign = L'+';
size--;
}
else if (type & SPACE)
{
sign = L' ';
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++ = L' ';
if (sign)
*str++ = sign;
if (type & SPECIAL)
{
if (base==8)
{
*str++ = L'0';
}
else if (base==16)
{
*str++ = L'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++ = L' ';
return str;
}
int _vsnwprintf(wchar_t *buf, size_t cnt, const wchar_t *fmt, va_list args)
{
int len;
unsigned long long num;
int i, base;
wchar_t * str;
const char *s;
const wchar_t *sw;
int flags; /* flags to 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', 'L', 'w' or 'I' for integer fields */
for (str=buf ; *fmt ; ++fmt) {
if (*fmt != L'%') {
*str++ = *fmt;
continue;
}
/* process flags */
flags = 0;
repeat:
++fmt; /* this also skips first '%' */
switch (*fmt) {
case L'-': flags |= LEFT; goto repeat;
case L'+': flags |= PLUS; goto repeat;
case L' ': flags |= SPACE; goto repeat;
case L'#': flags |= SPECIAL; goto repeat;
case L'0': flags |= ZEROPAD; goto repeat;
}
/* get field width */
field_width = -1;
if (iswdigit(*fmt))
field_width = skip_atoi(&fmt);
else if (*fmt == L'*') {
++fmt;
/* it's the next argument */
field_width = va_arg(args, int);
if (field_width < 0) {
field_width = -field_width;
flags |= LEFT;
}
}
/* get the precision */
precision = -1;
if (*fmt == L'.') {
++fmt;
if (iswdigit(*fmt))
precision = skip_atoi(&fmt);
else if (*fmt == L'*') {
++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' || *fmt == 'w') {
qualifier = *fmt;
++fmt;
} else if (*fmt == 'I' && *(fmt+1) == '6' && *(fmt+2) == '4') {
qualifier = *fmt;
fmt += 3;
}
/* default base */
base = 10;
switch (*fmt) {
case L'c':
if (!(flags & LEFT))
while (--field_width > 0)
*str++ = L' ';
if (qualifier == 'h')
*str++ = (wchar_t) va_arg(args, int);
else
*str++ = (wchar_t) va_arg(args, int);
while (--field_width > 0)
*str++ = L' ';
continue;
case L'C':
if (!(flags & LEFT))
while (--field_width > 0)
*str++ = L' ';
if (qualifier == 'l' || qualifier == 'w')
*str++ = (wchar_t) va_arg(args, int);
else
*str++ = (wchar_t) va_arg(args, int);
while (--field_width > 0)
*str++ = L' ';
continue;
case L's':
if (qualifier == 'h') {
/* print ascii string */
s = va_arg(args, char *);
if (s == NULL)
s = "<NULL>";
len = strlen (s);
if ((unsigned int)len > (unsigned int)precision)
len = precision;
if (!(flags & LEFT))
while (len < field_width--)
*str++ = L' ';
for (i = 0; i < len; ++i)
*str++ = (wchar_t)(*s++);
while (len < field_width--)
*str++ = L' ';
} else {
/* print unicode string */
sw = va_arg(args, wchar_t *);
if (sw == NULL)
sw = L"<NULL>";
len = wcslen (sw);
if ((unsigned int)len > (unsigned int)precision)
len = precision;
if (!(flags & LEFT))
while (len < field_width--)
*str++ = L' ';
for (i = 0; i < len; ++i)
*str++ = *sw++;
while (len < field_width--)
*str++ = L' ';
}
continue;
case L'S':
if (qualifier == 'l' || qualifier == 'w') {
/* print unicode string */
sw = va_arg(args, wchar_t *);
if (sw == NULL)
sw = L"<NULL>";
len = wcslen (sw);
if ((unsigned int)len > (unsigned int)precision)
len = precision;
if (!(flags & LEFT))
while (len < field_width--)
*str++ = L' ';
for (i = 0; i < len; ++i)
*str++ = *sw++;
while (len < field_width--)
*str++ = L' ';
} else {
/* print ascii string */
s = va_arg(args, char *);
if (s == NULL)
s = "<NULL>";
len = strlen (s);
if ((unsigned int)len > (unsigned int)precision)
len = precision;
if (!(flags & LEFT))
while (len < field_width--)
*str++ = L' ';
for (i = 0; i < len; ++i)
*str++ = (wchar_t)(*s++);
while (len < field_width--)
*str++ = L' ';
}
continue;
case L'p':
if (field_width == -1) {
field_width = 2*sizeof(void *);
flags |= ZEROPAD;
}
str = number(str,
(unsigned long) va_arg(args, void *), 16,
field_width, precision, flags);
continue;
case L'n':
if (qualifier == 'l') {
long * ip = va_arg(args, long *);
*ip = (str - buf);
} else {
int * ip = va_arg(args, int *);
*ip = (str - buf);
}
continue;
/* integer number formats - set up the flags and "break" */
case L'o':
base = 8;
break;
case L'b':
base = 2;
break;
case L'X':
flags |= LARGE;
case L'x':
base = 16;
break;
case L'd':
case L'i':
flags |= SIGN;
case L'u':
break;
default:
if (*fmt != L'%')
*str++ = L'%';
if (*fmt)
*str++ = *fmt;
else
--fmt;
continue;
}
if (qualifier == 'I')
num = va_arg(args, unsigned long long);
else if (qualifier == 'l')
num = va_arg(args, unsigned long);
else if (qualifier == 'h') {
if (flags & SIGN)
num = va_arg(args, int);
else
num = va_arg(args, unsigned int);
}
else {
if (flags & SIGN)
num = va_arg(args, int);
else
num = va_arg(args, unsigned int);
}
str = number(str, num, base, field_width, precision, flags);
}
*str = L' ';
return str-buf;
}
int swprintf(wchar_t *buf, size_t n,const wchar_t *fmt, ...)
{
va_list args;
int i;
va_start(args, fmt);
i=_vsnwprintf(buf,n,fmt,args);
va_end(args);
return i;
}
int _snwprintf(wchar_t *buf, size_t cnt, const wchar_t *fmt, ...)
{
va_list args;
int i;
va_start(args, fmt);
i=_vsnwprintf(buf,cnt,fmt,args);
va_end(args);
return i;
}
int vswprintf(wchar_t *buf, size_t n, const wchar_t *fmt, va_list args)
{
return _vsnwprintf(buf,n,fmt,args);
}
Both of them working, but both of them didn't handle floating point. I.e. there in both realisations no case 'f': code, and because of that , when i want to do something like this: swprintf(tmp, 255, L"triangles:%0.3f mio/s", driver->getPrimitiveCountDrawn(1) * (1.f / 1000000.f)); Then instead of necessary value (which should be 0.xxxx), i have some random/garbage character. Is there anyone who can wrote missing case 'f': in any of those examples ? I assume it will be just copy of case 'd' with some (?) little changes. Checking google for different vsnwprintf() implementations didn't help much at moment. Thanks !
|
|
|
Re: vswprintf implementation (need floating point support) |
Posted on: 2019/8/28 6:31
#2 |
Just popping in 
Joined: 2018/3/1 21:08
From italy
Posts: 24
|
Maybe you could convert floats into string and use same vswprintf function.
|
|
|
Re: vswprintf implementation (need floating point support) |
Posted on: 2019/8/28 6:45
#3 |
Home away from home 
Joined: 2007/9/11 12:31
From Russia
Posts: 6707
|
@flash It should be done inside of swprintf()/vsnwprintf() for making porting in future easer, and without needs to touch code which use them. That swprintf() offten need it, and will be good to deal with floating point support in it once and for all.
|
|
|
Re: vswprintf implementation (need floating point support) |
Posted on: 2019/9/2 15:44
#4 |
Home away from home 
Joined: 2007/9/11 12:31
From Russia
Posts: 6707
|
No one ? Can pay 20-30$
|
|
|
Re: vswprintf implementation (need floating point support) |
Posted on: 2019/9/7 15:24
#5 |
Just can't stay away 
Joined: 2006/11/30 11:30
From Finland
Posts: 1775
|
@kas1e I added some basic %F/f support (works with some simple test cases at least): https://www.dropbox.com/s/ppxhbgjg0a68k2e/swprintf.c?dl=0
|
|
|
Re: vswprintf implementation (need floating point support) |
Posted on: 2019/9/7 18:08
#6 |
Home away from home 
Joined: 2007/9/11 12:31
From Russia
Posts: 6707
|
@salas00 Oh, thanks a bunch, it works as expected ! Donated as promised, thanks again :)
|
|
|
Re: vswprintf implementation (need floating point support) |
Posted on: 2019/9/7 21:24
#7 |
Just can't stay away 
Joined: 2006/11/30 11:30
From Finland
Posts: 1775
|
@kas1e
You're welcome, and thanks for the donation.
|
|
|
Re: vswprintf implementation (need floating point support) |
Posted on: 2019/10/12 22:21
#8 |
Home away from home 
Joined: 2007/9/11 12:31
From Russia
Posts: 6707
|
@salas00 Is by some luck you have fwprintf() realisation for os4 too ? I just have some part like this:
if ( mPriorityStdout <= priority_ )
{
fwprintf(stdout, L"%ls", text_);
if ( mUseFlush )
fflush(stdout);
}
if ( mPriorityStderr <= priority_ )
{
fwprintf(stderr, L"%ls", text_);
if ( mUseFlush )
fflush(stderr);
}
if ( mFile && mPriorityFile <= priority_ )
{
fwprintf(mFile, L"%ls", text_);
if ( mUseFlush )
fflush(mFile);
}
I currently just replace it on:
if ( mPriorityStdout <= priority_ )
{
fprintf(stdout, "%ls", text_);
if ( mUseFlush )
fflush(stdout);
}
if ( mPriorityStderr <= priority_ )
{
fprintf(stderr, "%ls", text_);
if ( mUseFlush )
fflush(stderr);
}
if ( mFile && mPriorityFile <= priority_ )
{
fprintf(mFile, "%ls", text_);
if ( mUseFlush )
fflush(mFile);
}
I.e. remove "w" and "L" things. It works, but not sure how rigth is it.
Edited by kas1e on 2019/10/12 22:41:15
|
|
|
Re: vswprintf implementation (need floating point support) |
Posted on: 2019/10/13 16:15
#9 |
Just can't stay away 
Joined: 2006/11/30 11:30
From Finland
Posts: 1775
|
@kas1e Quote: Is by some luck you have fwprintf() realisation for os4 too ?
No, but it shouldn't be too hard to piece it together from the existing code. It is why I kept the code that pushes characters separate from the rest of the function.
|
|
|
Re: vswprintf implementation (need floating point support) |
Posted on: 2019/10/13 17:22
#10 |
Just can't stay away 
Joined: 2006/11/30 11:30
From Finland
Posts: 1775
|
@kas1e https://www.dropbox.com/s/w0803hmcch2vnud/libwprintf.7z?dl=0I made it into a simple static lib so that the common code, which is most of it, can be shared between the functions. If other wprintf functions are needed it should be pretty easy to add them as well.
|
|
|
Re: vswprintf implementation (need floating point support) |
Posted on: 2019/10/13 19:32
#11 |
Home away from home 
Joined: 2006/11/26 21:45
From a dying planet
Posts: 3943
|
@salass00
Sorry for highjacking, but do we have vsnprintf (newlib) yet?
|
_________________
People are dying. Entire ecosystems are collapsing. We are in the beginning of a mass extinction. And all you can talk about is money and fairytales of eternal economic growth. How dare you! – Greta Thunberg
|
|
Re: vswprintf implementation (need floating point support) |
Posted on: 2019/10/13 20:23
#12 |
Home away from home 
Joined: 2007/9/11 12:31
From Russia
Posts: 6707
|
@Frederik
Thanks a bunch! Checked library : with gcc it works, with g++ not, saing about undefs. I assume there need some C++ guards as usually inside of libwprinf.h ? Maybe forgotten extern "C" or something ?
|
|
|
Re: vswprintf implementation (need floating point support) |
Posted on: 2019/10/13 20:24
#13 |
Home away from home 
Joined: 2007/9/11 12:31
From Russia
Posts: 6707
|
double post
|
|
|
Re: vswprintf implementation (need floating point support) |
Posted on: 2019/10/13 20:28
#14 |
Just can't stay away 
Joined: 2006/11/30 11:30
From Finland
Posts: 1775
|
@Raziel Quote: Sorry for highjacking, but do we have vsnprintf (newlib) yet?
Yes, since ages. I use it in many of my programs. It is one of several functions that is disabled by the __STRICT_ANSI__ define though (I guess because it didn't use to be an ANSI function).
|
|
|
Re: vswprintf implementation (need floating point support) |
Posted on: 2019/10/13 20:35
#15 |
Just can't stay away 
Joined: 2006/11/30 11:30
From Finland
Posts: 1775
|
@kas1e Quote: Thanks a bunch! Checked library : with gcc it works, with g++ not, saing about undefs. I assume there need some C++ guards as usually inside of libwprinf.h ? Maybe forgotten extern "C" or something ?
Change the libwprintf.h header to:
#ifndef LIBWPRINTF_H
#define LIBWPRINTF_H
#include <stdio.h>
#include <stdarg.h>
#include <wchar.h>
#ifdef __cplusplus
extern "C" {
#endif
int swprintf(wchar_t *buffer, size_t maxlen, const wchar_t *fmt, ...);
int vswprintf(wchar_t *buffer, size_t maxlen, const wchar_t *fmt, va_list ap);
int fwprintf(FILE *fp, const wchar_t *fmt, ...);
int vfwprintf(FILE *fp, const wchar_t *fmt, va_list ap);
#ifdef __cplusplus
}
#endif
#endif
and it will work with C++ too. As I code mainly in plain C I tend to forget such things.
|
|
|
Re: vswprintf implementation (need floating point support) |
Posted on: 2019/10/13 21:09
#16 |
Home away from home 
Joined: 2007/9/11 12:31
From Russia
Posts: 6707
|
@Salas00 Yeah , works , thanks !
Through what i note, in the log, it add after each string 0x00. I checked on win32, and there is no 0x00 in the output.
I.e. not just 0x0a for cariage return , but 0x0a00
|
|
|
Re: vswprintf implementation (need floating point support) |
Posted on: 2019/10/13 21:44
#17 |
Just can't stay away 
Joined: 2006/11/30 11:30
From Finland
Posts: 1775
|
@kas1e The NUL character is needed for the correct working of the swprintf/vswprintf functions but should not be output for any of the other wprintf functions (as you point out). I've moved the code for outputting the final NUL character to vswprintf where it doesn't interfere any more. This change also made the implementation of the PUTWC() macro simpler. https://www.dropbox.com/s/w0803hmcch2vnud/libwprintf.7z?dl=0
|
|
|
Re: vswprintf implementation (need floating point support) |
Posted on: 2019/10/13 22:19
#18 |
Home away from home 
Joined: 2007/9/11 12:31
From Russia
Posts: 6707
|
@Salas00 Yes, everything fine now, thanks a bunch as usual :)
|
|
|
Re: vswprintf implementation (need floating point support) |
Posted on: 2020/1/6 17:15
#19 |
Home away from home 
Joined: 2007/9/11 12:31
From Russia
Posts: 6707
|
@Salas00 Is vswscanf() fit somehow in the libwprintf.7z's code? I mean is it easy to implement with it, or separate coding required?
|
|
|
Re: vswprintf implementation (need floating point support) |
|
Home away from home 
Joined: 2007/9/11 12:31
From Russia
Posts: 6707
|
@all While it surely not related to salas00 implementation of swprintf, find out today that I have bugs with some code I tried to port, which have such stuff:
wchar_t w[50], w2[50];
swprintf(w, 50, L"Slot %i", i);
Where "i" is 0,1 or 2 (and it have it for sure, I checked by printf). But then, such a swprintf draw on the screen not "Slot 1" or "Slot 2", but instead "Slot %i". Like it didn't take into account. And I can't be sure, but probably that causes sometimes crashes as well. Is it just bad code of swprintf there? Code done on windows, so everything possible. EDIT: oh, replaced %i on %d and it works! @frederik Didn't we have %i and %I implemented there? And if not, can it be that cause of crashes, or it surely not related ?
|
|
|