Subversion Repositories Kolibri OS

Rev

Rev 647 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
647 andrew_pro 1
/*
2
        function for format output to the string
3
*/
4
 
5
#include 
6
#include 
7
#include 
8
//#include 
9
#include 
10
 
11
int formatted_double_to_string(long double number,int format1,int format2,char *s)
12
{
13
        double	n;
14
        double	nbefor;
15
        double	nafter;
16
        double	v,v2;
17
        long	intdigit;
18
        long	beforpointdigit;
19
        long	div;
20
        int             i;
21
        int             pos;
22
        int             size;
23
        int             fmt1;
24
        int             fmt2;
25
        long    mul;
26
        char            buf[200];
27
 
28
        size=(int)s;
29
        n=(double)number;
30
        if (n<0) {*s='-';s++;n=-n;}
31
 
32
        fmt1=format1;
33
        fmt2=format2;
34
        if (fmt2>18) {fmt2=18;} //maximum of size long long type
35
 
36
        //clear array befor output
37
        for(i=0;i<=200;i++) {buf[i]=0;}
38
 
39
        if ((fmt1>=0) && (n<1))
40
        {       //formatted output if 0<=n<1
41
                mul=1;
42
                for(i=0;i
43
                {n=n*10;mul=mul*10;}
44
 
45
                n=n*10;
46
                n=ceil(n);
47
                intdigit=floor(n);
48
                //intdigit=n;
49
                intdigit=(intdigit/10);
50
 
51
                pos=0;
52
                mul=mul/10;
53
                for(i=0;i
54
                {
55
                        div=intdigit/mul;
56
                        buf[pos]=(char)div;
57
                        pos++;
58
                        intdigit=intdigit-div*mul;
59
                        mul=mul/10;
60
                        if (mul==1) break;
61
                }
62
                buf[pos]=(char)intdigit;
63
                *s='0';s++;
64
                *s='.';s++;
65
                for(i=0;i
66
                {
67
                        if ((buf[i]>=0) && (buf[i]<=9)) {*s='0'+buf[i];}
68
                        else {*s='0';}
69
                        s++;
70
                }
71
        }
72
        else
73
        {       //if n>=1
74
                //v=floorf(n+0.00000000000001);
75
                beforpointdigit=floor(n+0.00000000000001);
76
		//beforpointdigit=n;
77
                nbefor=beforpointdigit;
78
                nafter=n-nbefor;
79
 
80
                //print part of number befor point
81
                mul=1;
82
                for(i=0;i<200-2;i++)
83
                {
84
                        mul=mul*10;
85
                        if ((beforpointdigit/mul)==0) {fmt1=i+1;break;}
86
                }
87
 
88
                pos=0;
89
                mul=mul/10;
90
                for(i=0;i
91
                {
92
                        div=beforpointdigit/mul;
93
                        buf[pos]=(char)div;
94
                        pos++;
95
                        beforpointdigit=beforpointdigit-div*mul;
96
                        mul=mul/10;
97
                        if (mul==1) break;
98
                }
99
                buf[pos]=(char)beforpointdigit;
100
 
101
                for(i=0;i
102
                {
103
                        if ((buf[i]>=0) && (buf[i]<=9)) {*s='0'+buf[i];}
104
                        s++;
105
                }
106
 
107
                //print part of number after point
108
                mul=1;
109
                for(i=0;i
110
                {nafter=nafter*10;mul=mul*10;}
111
 
112
                nafter=nafter*10;
113
                nafter=ceil(nafter);
114
                intdigit=floor(nafter);
115
                //intdigit=nafter;
116
                intdigit=intdigit/10;
117
 
118
                pos=0;
119
                mul=mul/10;
120
                for(i=0;i
121
                {
122
                        div=intdigit/mul;
123
                        buf[pos]=(char)div;
124
                        pos++;
125
                        intdigit=intdigit-div*mul;
126
                        mul=mul/10;
127
                        if (mul==1) break;
128
                }
129
                buf[pos]=(char)intdigit;
130
                *s='.';s++;
131
                for(i=0;i
132
                {
133
                        if ((buf[i]>=0) && (buf[i]<=9)) {*s='0'+buf[i];}
134
                        else {*s='0';}
135
                        s++;
136
                }
137
 
138
        }
139
        size=(int)s-size;
140
        return(size);
141
}
142
 
143
int formatted_long_to_string(long long number,int fmt1,char *s)
144
{
145
        int             i;
146
        int             pos;
147
        int             fmt;
148
        int             size;
149
        int             difference_pos;
150
        long    digit;
151
        long    mul;
152
        long    div;
153
        char            buf[200];
154
 
155
        //clear array befor output
156
        for(i=0;i<200;i++) {buf[i]=0;}
157
        digit=number;
158
 
159
        size=(int)s;
160
        if (digit<0) {*s='-';s++;digit=-digit;}
161
        if (digit==0) {*s='0';s++;goto end;}
162
 
163
        mul=1;
164
                for(i=0;i<200-2;i++)
165
                {
166
                        mul=mul*10;
167
                        if ((digit/mul)==0) {fmt=i+1;break;}
168
                }
169
 
170
                difference_pos=i+1;
171
 
172
                pos=0;
173
                mul=mul/10;
174
                for(i=0;i
175
                {
176
                        div=digit/mul;
177
                        buf[pos]=(char)div;
178
                        pos++;
179
                        digit=digit-div*mul;
180
                        mul=mul/10;
181
                        if (mul==1) break;
182
                }
183
                buf[pos]=(char)digit;
184
 
185
                if (fmt1>=difference_pos) fmt=fmt1;
186
                else
187
                  fmt=difference_pos;
188
 
189
                for(i=0;i
190
                {
191
                        if (i
192
                        {
193
                                if ((buf[i]>=0) && (buf[i]<=9)) {*s='0'+buf[i];}
194
                        }
195
                        else
196
                        {
197
                                *s=' ';
198
                        }
199
                        s++;
200
                }
201
        end:
202
        size=(int)s-size;
203
        return(size);
204
}
205
 
206
int formatted_hex_to_string(long long number,int fmt1,char flag_register,char *s)
207
{
208
        long    n;
209
        int             i,pos;
210
        int             fmt;
211
        long    size;
212
        int             difference_pos;
213
        char            xdigs_lower[16]="0123456789abcdef";
214
        char            xdigs_upper[16]="0123456789ABCDEF";
215
        char            buf[200];
216
 
217
        n=(long)number;
218
        size=(int)s;
219
        if (n<0) {*s='-';s++;n=-n;}
220
 
221
        if (n==0) {*s='0';s++;goto end;}
222
        for(i=0;i<200;i++) {buf[i]=0;}
223
 
224
        i=0;
225
        if (flag_register==0)
226
        {
227
                while (n>0)
228
                {
229
                        buf[i]=xdigs_lower[n & 15];
230
                        n=n>>4;
231
                        i++;
232
                }
233
        }
234
        else
235
        {
236
                while (n>0)
237
                {
238
                        buf[i]=xdigs_upper[n & 15];
239
                        n=n>>4;
240
                        i++;
241
                }
242
        }
243
 
244
        pos=i;
245
        difference_pos=i;
246
 
247
        for(i=pos-1;i>=0;i--)
248
        {
249
                *s=buf[i];
250
                s++;
251
        }
252
 
253
        if (fmt1-difference_pos>0)
254
        {
255
                for(i=difference_pos+1;i<=fmt1;i++)
256
                {
257
                        *s=' ';
258
                        s++;
259
                }
260
        }
261
        end:size=(int)s-size;
262
        return(size);
263
}
264
 
265
int formatted_octa_to_string(long long number,int fmt1,char flag_register,char *s)
266
{
267
        long    n;
268
        int             i,pos;
269
        int             fmt;
270
        long   	size;
271
        int             difference_pos;
272
        char            xdigs_lower[16]="012345678";
273
        char            buf[200];
274
 
275
        n=number;
276
        size=(int)s;
277
        if (n<0) {*s='-';s++;n=-n;}
278
 
279
        if (n==0) {*s='0';s++;goto end;}
280
        for(i=0;i<200;i++) {buf[i]=0;}
281
 
282
        i=0;
283
        if (flag_register==0)
284
        {
285
                while (n>0)
286
                {
287
                        buf[i]=xdigs_lower[n & 7];
288
                        n=n>>3;
289
                        i++;
290
                }
291
        }
292
 
293
        pos=i;
294
        difference_pos=i;
295
 
296
        for(i=pos-1;i>=0;i--)
297
        {
298
                *s=buf[i];
299
                s++;
300
        }
301
 
302
        if (fmt1-difference_pos>0)
303
        {
304
                for(i=difference_pos+1;i<=fmt1;i++)
305
                {
306
                        *s=' ';
307
                        s++;
308
                }
309
        }
310
        end:size=(int)s-size;
311
        return(size);
312
}
313
 
314
int format_print(char *dest, size_t maxlen,const char *fmt0, va_list argp)
315
{
316
        int                     i,j,k;
317
        int                     length;
318
        int                     fmt1,fmt2,stepen;
319
        size_t                  pos,posc;
320
        long	long	        intdigit;
321
        long	double          doubledigit;
322
        float                   floatdigit;
323
        const   char            *fmt,*fmtc;
324
        char                    *s;
325
        char                    *str;
326
        char                    buffmt1[30];
327
        char                    buffmt2[30];
328
        char                    buf[1024];
329
        char                    format_flag;
330
        char                    flag_point;
331
        char                    flag_noformat;
332
        char                    flag_long;
333
        char                    flag_unsigned;
334
        char                    flag_register;
335
        char                    flag_plus;
336
 
337
        fmt=fmt0;
338
        s=dest;
339
        pos=0;
340
        while(pos
341
        {
342
                if (*fmt=='%')
343
                {
344
 
345
                        if (*(fmt+1)=='%')
346
                        {
347
                                *s='%';
348
                                s++;
349
                                fmt=fmt+2;
350
                                pos++;
351
                                goto exit_check;
352
                        }
353
                        //checking to containg format in the string
354
                        fmtc=fmt;
355
                        posc=pos;
356
                        format_flag=0;
357
                        flag_long=0;
358
                        flag_unsigned=0;
359
                        flag_register=0;
360
                        flag_plus=0;
361
                        while((*fmtc!='\0') || (*fmtc!=0))
362
                        {
363
                                fmtc++;
364
                                posc++;
365
                                switch(*fmtc)
366
                                {
367
                                        case 'c':
368
                                        case 'C':
369
                                        format_flag=1;
370
                                        break;
371
                                        case 'd':
372
                                        case 'D':
373
                                        case 'i':
374
                                        case 'I':
375
                                        format_flag=1;
376
                                        break;
377
                                        case 'e':
378
                                        format_flag=1;
379
                                        break;
380
                                        case 'E':
381
                                        format_flag=1;
382
                                        flag_long=1;
383
                                        break;
384
                                        case 'f':
385
                                        format_flag=1;
386
                                        break;
387
                                        case 'F':
388
                                        format_flag=1;
389
                                        flag_long=1;
390
                                        break;
391
                                        case 'g':
392
                                        format_flag=1;
393
                                        break;
394
                                        case 'G':
395
                                        format_flag=1;
396
                                        flag_long=1;
397
                                        break;
398
                                        case 'l':
399
                                        flag_long=1;
400
                                        break;
401
                                        case 'L':
402
                                        flag_long=2;
403
                                        break;
404
                                        case 'o':
405
                                        format_flag=1;
406
                                        break;
407
                                        case 's':
408
                                        case 'S':
409
                                        format_flag=1;
410
                                        break;
411
                                        case 'u':
412
                                        case 'U':
413
                                        format_flag=1;
414
                                        flag_unsigned=1;
415
                                        break;
416
                                        case 'x':
6412 siemargl 417
                                        case 'p':
647 andrew_pro 418
                                        format_flag=1;
419
                                        break;
420
                                        case 'X':
6412 siemargl 421
                                        case 'P':
647 andrew_pro 422
                                        flag_register=1;
423
                                        format_flag=1;
424
                                        break;
425
                                        case 'z':
426
                                        case 'Z':
427
                                        format_flag=1;
428
                                        flag_unsigned=1;
429
                                        break;
430
                                        case '+':
431
                                        flag_plus=1;
432
                                        break;
433
 
434
                                        default:;
435
                                }
436
                                if ((*fmtc=='%') || (*fmtc==' ')) break;
437
                                if (format_flag==1) break;
438
                        }
439
 
440
                        if (format_flag==0)
441
                        {
442
                                *s=*fmt;
443
                                fmt++;
444
                                s++;
445
                                pos++;
446
                        }
447
                        else
448
                        {
449
                                if ((posc-pos)==1)
450
                                {//simbols % and format simbol near tothere(for example %c )
451
                                        fmt=fmtc+1;
452
                                        switch(*fmtc)
453
                                        {
454
                                                case 'c':
455
                                                case 'C':
6412 siemargl 456
                                                if ((pos+1)<=maxlen)
647 andrew_pro 457
                                                {
458
                                                        //*s=(int)va_arg(argp,char*);
459
                                                        *s=*((char *)argp);
460
                                                        argp=argp+4;
461
                                                        *s++;pos++;
462
                                                }
463
                                                break;
464
                                                case 's':
465
                                                case 'S':
6412 siemargl 466
                                                    str=va_arg(argp,char*);
467
                                                    length=strlen(str);
468
                                                    if (pos + length > maxlen)
469
                                                        length = maxlen - pos;
470
                                                    memcpy(s,str,length);
471
                                                    s=s+length;pos=pos+length;
472
                                                    break;
647 andrew_pro 473
                                                case 'd':
474
                                                case 'D':
475
                                                case 'i':
476
                                                case 'I':
6412 siemargl 477
                                                    if (flag_long==0) {intdigit=va_arg(argp,int);}
478
                                                    if (flag_long==1) {intdigit=va_arg(argp,long);}
479
                                                    if (flag_long==2) {intdigit=va_arg(argp,long long);}
480
                                                    //intdigit=*((long*)argp);
481
                                                    //argp=argp+4;
482
                                                    if ((intdigit>0) && (flag_plus==1) && (pos+1<=maxlen))
483
                                                    {
484
                                                            *s='+';
485
                                                            s++;
486
                                                            pos++;
487
                                                    }
488
                                                    length=formatted_long_to_string(intdigit,0,buf);
489
                                                    if (pos + length > maxlen)
490
                                                        length = maxlen - pos;
491
                                                    memcpy(s,buf,length);
492
                                                    s=s+length;pos=pos+length;
493
                                                    break;
647 andrew_pro 494
                                                case 'o':
6412 siemargl 495
                                                    if (flag_long==0) {intdigit=va_arg(argp,int);}
496
                                                    if (flag_long==1) {intdigit=va_arg(argp,long);}
497
                                                    if (flag_long==2) {intdigit=va_arg(argp,long long);}
498
                                                    //intdigit=*((long int *)argp);
499
                                                    //argp=argp+4;
647 andrew_pro 500
 
6412 siemargl 501
                                                    length=formatted_octa_to_string(intdigit,0,flag_register,buf);
502
                                                    if (pos + length > maxlen)
503
                                                        length = maxlen - pos;
504
                                                    memcpy(s,buf,length);
505
                                                    s=s+length;pos=pos+length;
506
                                                    break;
647 andrew_pro 507
                                                case 'u':
508
                                                case 'U':
6412 siemargl 509
                                                    if (flag_long==0) {intdigit=va_arg(argp,int);}
510
                                                    if (flag_long==1) {intdigit=va_arg(argp,long int);}
511
                                                    if (flag_long==2) {intdigit=va_arg(argp,long long);}
647 andrew_pro 512
 
6412 siemargl 513
                                                    if (flag_unsigned==1) {
514
                                                            if (intdigit<0) {intdigit=-intdigit;}
515
                                                    }
647 andrew_pro 516
 
6412 siemargl 517
                                                    length=formatted_long_to_string(intdigit,0,buf);
518
                                                    if (pos + length > maxlen)
519
                                                        length = maxlen - pos;
520
                                                    memcpy(s,buf,length);
521
                                                    s=s+length;pos=pos+length;
522
                                                    break;
523
                                                case 'p':
524
                                                case 'P':
647 andrew_pro 525
                                                case 'x':
526
                                                case 'X':
6412 siemargl 527
                                                    if (flag_long==0) {intdigit=va_arg(argp,int);}
528
                                                    if (flag_long==1) {intdigit=va_arg(argp,long);}
529
                                                    if (flag_long==2) {intdigit=va_arg(argp,long long);}
530
                                                    //intdigit=*((long int *)argp);
531
                                                    //argp=argp+4;
647 andrew_pro 532
 
6412 siemargl 533
                                                    length=formatted_hex_to_string(intdigit,0,flag_register,buf);
534
                                                    if (pos + length > maxlen)
535
                                                        length = maxlen - pos;
536
                                                    memcpy(s,buf,length);
537
                                                    s=s+length;pos=pos+length;
538
                                                    break;
647 andrew_pro 539
                                                case 'z':
540
                                                case 'Z':
6412 siemargl 541
                                                    intdigit=va_arg(argp,size_t);
647 andrew_pro 542
 
6412 siemargl 543
                                                    if (flag_unsigned==1) {
544
                                                            if (intdigit<0) {intdigit=-intdigit;}
545
                                                    }
647 andrew_pro 546
 
6412 siemargl 547
                                                    length=formatted_long_to_string(intdigit,0,buf);
548
                                                    if (pos + length > maxlen)
549
                                                        length = maxlen - pos;
550
                                                    memcpy(s,buf,length);
551
                                                    s=s+length;pos=pos+length;
552
                                                    break;
647 andrew_pro 553
                                                default:;
554
 
555
                                        }
556
                                }
557
                                else
558
                                {
559
                                        fmt++;
560
                                        flag_point=0;
561
                                        flag_noformat=0;
562
                                        fmt1=0;
563
                                        fmt2=0;
564
                                        j=0;
565
                                        k=0;
566
                                        for(i=pos+1;i
567
                                        {
568
                                                switch(*fmt)
569
                                                {
570
                                                        case '0':
571
                                                        case '1':
572
                                                        case '2':
573
                                                        case '3':
574
                                                        case '4':
575
                                                        case '5':
576
                                                        case '6':
577
                                                        case '7':
578
                                                        case '8':
579
                                                        case '9':
580
                                                        if (flag_point==0)
581
                                                        {
582
                                                                buffmt1[j]=*fmt-'0';
583
                                                                j++;
584
                                                        }
585
                                                        else
586
                                                        {
587
                                                                buffmt2[k]=*fmt-'0';
588
                                                                k++;
589
                                                        }
590
                                                        break;
591
                                                        case '.':
592
                                                        flag_point=1;
593
                                                        break;
594
                                                        case 'l':
595
                                                        case 'L':
596
                                                        break;
597
                                                        case '+':
598
                                                        break;
599
                                                        default:flag_noformat=1;
600
                                                }
601
                                                if (flag_noformat==1) break;
602
                                                fmt++;
603
                                        }
604
                                        if (flag_noformat==0)
605
                                        {
606
                                                stepen=1;
607
                                                for(i=j-1;i>=0;i--)
608
                                                {
609
                                                        fmt1=fmt1+buffmt1[i]*stepen;
610
                                                        stepen=stepen*10;
611
                                                }
612
                                                stepen=1;
613
                                                for(i=k-1;i>=0;i--)
614
                                                {
615
                                                        fmt2=fmt2+buffmt2[i]*stepen;
616
                                                        stepen=stepen*10;
617
                                                }
618
                                                switch(*fmtc)
619
                                                {
620
                                                        case 'f':
621
                                                        case 'F':
622
                                                        if (flag_long==0) {doubledigit=va_arg(argp,double);}
623
                                                        if (flag_long>=1) {doubledigit=va_arg(argp,long double);}
624
                                                        //doubledigit=*((double *)argp);
625
                                                        //sargp=argp+8;
626
                                                        length=formatted_double_to_string(doubledigit,fmt1,fmt2,buf);
627
                                                        if ((pos+length)
628
                                                        {
629
                                                                memcpy(s,buf,length);
630
                                                                s=s+length;pos=pos+length;
631
                                                        }
632
                                                        break;
633
                                                        case 'd':
634
                                                        case 'D':
635
                                                        case 'i':
636
                                                        case 'I':
637
                                                        if (flag_long==0) {intdigit=va_arg(argp,int);}
638
                                                        if (flag_long==1) {intdigit=va_arg(argp,long);}
639
                                                        if (flag_long==2) {intdigit=va_arg(argp,long long);}
640
 
641
                                                        if ((intdigit>0) && (flag_plus==1) && (pos+1
642
                                                        {
643
                                                                *s='+';
644
                                                                s++;
645
                                                                pos++;
646
                                                        }
647
                                                        length=formatted_long_to_string(intdigit,fmt1,buf);
648
                                                        if ((pos+length)
649
                                                        {
650
                                                                memcpy(s,buf,length);
651
                                                                s=s+length;pos=pos+length;
652
                                                        }
653
                                                        break;
654
                                                        case 'o':
655
                                                        if (flag_long==0) {intdigit=va_arg(argp,int);}
656
                                                        if (flag_long==1) {intdigit=va_arg(argp,long);}
657
                                                        if (flag_long==2) {intdigit=va_arg(argp,long long);}
658
                                                        length=formatted_octa_to_string(intdigit,fmt1,flag_register,buf);
659
                                                        if ((pos+length)
660
                                                        {
661
                                                                memcpy(s,buf,length);
662
                                                                s=s+length;pos=pos+length;
663
                                                        }
664
                                                        break;
665
                                                        case 'u':
666
                                                        case 'U':
667
                                                        if (flag_long==0) {intdigit=va_arg(argp,int);}
668
                                                        if (flag_long==1) {intdigit=va_arg(argp,long int);}
669
                                                        if (flag_long==2) {intdigit=va_arg(argp,long long);}
670
 
671
                                                        if (flag_unsigned==1) {
672
                                                                if (intdigit<0) {intdigit=-intdigit;}
673
                                                        }
674
 
675
                                                        length=formatted_long_to_string(intdigit,fmt1,buf);
676
                                                        if ((pos+length)
677
                                                        {
678
                                                                memcpy(s,buf,length);
679
                                                                s=s+length;pos=pos+length;
680
                                                        }
681
                                                        break;
682
                                                        case 'x':
683
                                                        case 'X':
684
                                                        if (flag_long==0) {intdigit=va_arg(argp,int);}
685
                                                        if (flag_long==1) {intdigit=va_arg(argp,long int);}
686
                                                        if (flag_long==2) {intdigit=va_arg(argp,long long);}
687
                                                        length=formatted_hex_to_string(intdigit,fmt1,flag_register,buf);
688
                                                        if ((pos+length)
689
                                                        {
690
                                                                memcpy(s,buf,length);
691
                                                                s=s+length;pos=pos+length;
692
                                                        }
693
                                                        break;
694
                                                        case 'z':
695
                                                        case 'Z':
696
                                                        intdigit=va_arg(argp,size_t);
697
 
698
                                                        if (flag_unsigned==1) {
699
                                                                if (intdigit<0) {intdigit=-intdigit;}
700
                                                        }
701
 
702
                                                        length=formatted_long_to_string(intdigit,fmt1,buf);
703
                                                        if ((pos+length)
704
                                                        {
705
                                                                memcpy(s,buf,length);
706
                                                                s=s+length;pos=pos+length;
707
                                                        }
708
                                                        break;
709
                                                        default:;
710
                                                }
711
                                        }
712
                                        fmt=fmtc+1;
713
                                }
714
                        }
715
                }
716
                else
717
                {
6412 siemargl 718
                        if (!(*s++ = *fmt++)) break;
647 andrew_pro 719
                        pos++;
720
                }
721
                exit_check:;
722
        }
723
        return(pos);
724
}