summaryrefslogtreecommitdiff
path: root/x68/fconvert.c
blob: 9a0bc0e0887fd4d01ece1cf286bad93a045eb2c7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/*
 * PROJECT C Library, X68000 PROGRAMMING INTERFACE DEFINITION
 * --------------------------------------------------------------------
 * This file is written by the Project C Library Group,  and completely
 * in public domain. You can freely use, copy, modify, and redistribute
 * the whole contents, without this notice.
 * --------------------------------------------------------------------
 * $Id$
 */
/* changed 1997.2.3 by K.Okabe */

/* System headers */
#include <stdlib.h>
#include <sys/xstdlib.h>

/* Functions */
char *fconvert (double x, int ndigit, int *decpt, int *sign, char *buffer)
{
    int pos, n;
    char *src, *dst;
    char string[24];
    int figup;

    /* 18桁の文字列に変換 */
    _dtos18 (x, decpt, sign, string);

    /* コピー元アドレスを設定 */
    src = string;

    /* コピー先アドレスを設定 */
    dst = buffer;

    /* 小数点位置を得る */
    pos = *decpt;

    /* 小数点位置が負なら */
    if (pos < 0) {

	/* 埋める桁数を計算 */
	n = min (-pos, ndigit);

	/* 先頭を0で埋める */
	while (n-- > 0)
	    *dst++ = '0';

	/* 小数点位置は0になる */
	*decpt = 0;

    }

    /* 残りのコピー桁数 */
    n = ndigit + pos;

    /* 格納先にコピー */
    while (n-- > 0) {

	/* 足りない部分は0で埋める */
	if (*src == '\0') {
	    while (n-- >= 0)
		*dst++ = '0';
	    break;
	}

	/* 変換文字列からコピー */
	*dst++ = *src++;

    }

    /* 丸める */
    *decpt += (figup = _round (buffer, dst, *src));

    /* 繰り上がりがあれば末尾に0を追加する */
    if (figup)
	*dst++ = '0';

    /* 終端に NUL を打つ */
    *dst = '\0';

    /* アドレスを返す */
    return buffer;
}