⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testconv.c

📁 短小精悍的C语言标准函数库。提供450个以上的可移植的算法和工具代码。
💻 C
📖 第 1 页 / 共 2 页
字号:
    if (result == NULL)
        result = "<Error>";

    /*  Replace spaces by underlines for visibility                          */
    for (scan = result; *scan; scan++)
        if (*scan == ' ')
            *scan = '_';

    printf (" dtos: %-55s", line);
    printf ("   => %s\n", result);

    if (conv_reason)
        printf ("Error: %s\n", conv_reason_text [conv_reason]);

    mem_free (order);
    mem_free (format);
    mem_free (flags);
}


/*---------------------------------------------------------------------------
 *  Run test through conv_str_date; format is:
 *
 *  datestr order format flags
 */

static void
test_stod (char *line)
{
    long
        result;
    int
        offset = 0,
        order_val,
        format_val;
    char
        *string,
        *order,
        *format,
        *flags,
        *flags_ptr;
    word
        flags_val;

    string  = mem_strdup (get_token (line, &offset));
    order   = mem_strdup (get_token (line, &offset));
    format  = mem_strdup (get_token (line, &offset));
    flags   = mem_strdup (get_token (line, &offset));

    order_val = streq (order, "YMD")? DATE_ORDER_YMD:
                streq (order, "DMY")? DATE_ORDER_DMY:
                streq (order, "MDY")? DATE_ORDER_MDY:
                /*  else  */          0;

    flags_val = 0;
    for (flags_ptr = flags; *flags_ptr; flags_ptr++)
      {
        switch (*flags_ptr)
          {
            case 'D': flags_val |= FLAG_D_DD_AS_D;   break;
            case 'M': flags_val |= FLAG_D_MM_AS_M;   break;
            case 'a': flags_val |= FLAG_D_MONTH_ABC; break;
            case 'c': flags_val |= FLAG_D_CENTURY;   break;
            case 'u': flags_val |= FLAG_D_UPPER;     break;
            case 'y': flags_val |= FLAG_D_ORDER_YMD; break;
            case 'm': flags_val |= FLAG_D_ORDER_MDY; break;
            case 'd': flags_val |= FLAG_D_ORDER_DMY; break;
          }
      }
    format_val = streq (format, "YMD")?  DATE_YMD_COMPACT:
                 streq (format, "YMD/")? DATE_YMD_DELIM:
                 streq (format, "YMDb")? DATE_YMD_SPACE:
                 streq (format, "YMD,")? DATE_YMD_COMMA:
                 streq (format, "YM")?   DATE_YM_COMPACT:
                 streq (format, "YM/")?  DATE_YM_DELIM:
                 streq (format, "YMb")?  DATE_YM_SPACE:
                 streq (format, "MD")?   DATE_MD_COMPACT:
                 streq (format, "MD/")?  DATE_MD_DELIM:
                 streq (format, "MDb")?  DATE_MD_SPACE:
                 /*  else  */            0;

    result = conv_str_date (string, flags_val, format_val, order_val);
    printf (" stod: %-55s", line);
    printf ("   => %ld\n", result);

    if (conv_reason)
        printf ("Error: %s\n", conv_reason_text [conv_reason]);

    mem_free (string);
    mem_free (order);
    mem_free (format);
    mem_free (flags);
}


/*---------------------------------------------------------------------------
 *  Run test through conv_time_pict; format is:
 *
 *  hhmmsscc picture
 */

static void
test_ttop (char *line)
{
    long
        time;
    int
        offset = 0;
    char
        *picture,
        *scan,
        *result;

    time    = atol       (get_token (line, &offset));
    picture = mem_strdup (get_token (line, &offset));
    result  = conv_time_pict (time, picture);
    if (result == NULL)
        result = "<Error>";

    /*  Replace spaces by underlines for visibility                          */
    for (scan = result; *scan; scan++)
        if (*scan == ' ')
            *scan = '_';

    printf (" dtop: %-55s", line);
    printf ("   => %s\n", result);

    if (conv_reason)
        printf ("Error: %s\n", conv_reason_text [conv_reason]);

    mem_free (picture);
}


/*---------------------------------------------------------------------------
 *  Run test through conv_time_str; format is:
 *
 *  hhmmsscc flags width
 */

static void
test_ttos (char *line)
{
    long
        time;
    int
        offset = 0,
        width;
    char
        *flags,
        *flags_ptr,
        *scan,
        *result;
    word
        flags_val;

    time  = atol       (get_token (line, &offset));
    flags = mem_strdup (get_token (line, &offset));
    width = atoi       (get_token (line, &offset));

    flags_val = 0;
    for (flags_ptr = flags; *flags_ptr; flags_ptr++)
      {
        switch (*flags_ptr)
          {
            case 'h': flags_val |= FLAG_T_HH_AS_H;   break;
            case 'm': flags_val |= FLAG_T_MM_AS_M;   break;
            case 's': flags_val |= FLAG_T_SS_AS_S;   break;
            case 'c': flags_val |= FLAG_T_CC_AS_C;   break;
            case '/': flags_val |= FLAG_T_COMPACT;   break;
            case 'p': flags_val |= FLAG_T_12_HOUR;   break;
          }
      }
    result = conv_time_str (time, flags_val, ':', width);
    if (result == NULL)
        result = "<Error>";

    /*  Replace spaces by underlines for visibility                          */
    for (scan = result; *scan; scan++)
        if (*scan == ' ')
            *scan = '_';

    printf (" ttos: %-55s", line);
    printf ("   => %s\n", result);

    if (conv_reason)
        printf ("Error: %s\n", conv_reason_text [conv_reason]);

    mem_free (flags);
}


/*---------------------------------------------------------------------------
 *  Run test through conv_str_time; format is:
 *
 *  timestr
 */

static void
test_stot (char *line)
{
    long
        result;
    int
        offset = 0;
    char
        *string;

    string = get_token (line, &offset);

    result = conv_str_time (string);
    printf (" stot: %-55s", line);
    printf ("   => %ld\n", result);

    if (conv_reason)
        printf ("Error: %s\n", conv_reason_text [conv_reason]);
}


/*---------------------------------------------------------------------------
 *  Run test through conv_number_str; format is:
 *
 *  +00012345 {-.<0B,} decs ./, 1.10|1.1|1 n-|n+|-n|+n|(n) width
 */

static void
test_ntos (char *line)
{
    int
        offset = 0,
        decimals,
        decfmt_val,
        negfmt_val,
        width;
    word
        flags_val;
    char
        *number,
        *result,
        *flags,
        *flags_ptr,
        decpoint,
        *scan,
        *decfmt,
        *negfmt;

    number    = mem_strdup (get_token (line, &offset));
    flags     = mem_strdup (get_token (line, &offset));
    decimals  = atoi       (get_token (line, &offset));
    decpoint  =            *get_token (line, &offset);
    decfmt    = mem_strdup (get_token (line, &offset));
    negfmt    = mem_strdup (get_token (line, &offset));
    width     = atoi       (get_token (line, &offset));

    flags_val = 0;
    for (flags_ptr = flags; *flags_ptr; flags_ptr++)
      {
        switch (*flags_ptr)
          {
            case '-': flags_val += FLAG_N_SIGNED;     break;
            case '.': flags_val += FLAG_N_DECIMALS;   break;
            case '<': flags_val += FLAG_N_LEFT;       break;
            case '0': flags_val += FLAG_N_ZERO_FILL;  break;
            case 'B': flags_val += FLAG_N_ZERO_BLANK; break;
            case ',': flags_val += FLAG_N_THOUSANDS;  break;
          }
      }
    negfmt_val = streq (negfmt, "n-")  ? SIGN_NEG_TRAIL:
                 streq (negfmt, "n+")  ? SIGN_ALL_TRAIL:
                 streq (negfmt, "-n")  ? SIGN_NEG_LEAD:
                 streq (negfmt, "+n")  ? SIGN_ALL_LEAD:
                 streq (negfmt, "(n)") ? SIGN_FINANCIAL:
                 /*  else  */          0;

    decfmt_val = streq (decfmt, "1.10") ? DECS_SHOW_ALL:
                 streq (decfmt, "1.1")  ? DECS_DROP_ZEROS:
                 streq (decfmt, "1")    ? DECS_HIDE_ALL:
                 /*  else  */           0;

    printf (" ntos: %-55s", line);
    result = conv_number_str (number, flags_val, decpoint,
                              decimals, decfmt_val, width, negfmt_val);

    /*  Replace spaces by underlines for visibility                          */
    if (result)
      {
        for (scan = result; *scan; scan++)
            if (*scan == ' ')
                *scan = '_';

        printf ("   => %s\n", result);
      }
    else
        printf ("   => (null)\n");

    if (conv_reason)
        printf ("Error: %s\n", conv_reason_text [conv_reason]);

    mem_free (number);
    mem_free (flags);
    mem_free (decfmt);
    mem_free (negfmt);
}


/*---------------------------------------------------------------------------
 *  Run test through conv_str_number; format is:
 *
 *  +00012345 {-.<0B,} decs ./, 1.10|1.1|1 width
 */

static void
test_ston (char *line)
{
    int
        offset = 0,
        decimals,
        decfmt_val,
        width;
    word
        flags_val;
    char
        *result,
        *scan,
        *string,
        *flags,
        *flags_ptr,
        decpoint,
        *decfmt;

    string    = mem_strdup (get_token (line, &offset));
    flags     = mem_strdup (get_token (line, &offset));
    decimals  = atoi       (get_token (line, &offset));
    decpoint  =            *get_token (line, &offset);
    decfmt    = mem_strdup (get_token (line, &offset));
    width     = atoi       (get_token (line, &offset));

    flags_val = 0;
    for (flags_ptr = flags; *flags_ptr; flags_ptr++)
      {
        switch (*flags_ptr)
          {
            case '-': flags_val += FLAG_N_SIGNED;     break;
            case '.': flags_val += FLAG_N_DECIMALS;   break;
            case '<': flags_val += FLAG_N_LEFT;       break;
            case '0': flags_val += FLAG_N_ZERO_FILL;  break;
            case 'B': flags_val += FLAG_N_ZERO_BLANK; break;
            case ',': flags_val += FLAG_N_THOUSANDS;  break;
          }
      }
    decfmt_val = streq (decfmt, "1.10") ? DECS_SHOW_ALL:
                 streq (decfmt, "1.1")  ? DECS_DROP_ZEROS:
                 streq (decfmt, "1")    ? DECS_HIDE_ALL:
                 /*  else  */           0;

    printf (" ston: %-55s", line);
    result = conv_str_number (string, flags_val, decpoint,
                              decimals, decfmt_val, width);

    /*  Replace spaces by underlines for visibility                          */
    if (result)
      {
        for (scan = result; *scan; scan++)
            if (*scan == ' ')
                *scan = '_';

        printf ("   => %s\n", result);
      }
    else
        printf ("   => (null)\n");

    if (conv_reason)
        printf ("Error: %s\n", conv_reason_text [conv_reason]);

    mem_free (string);
    mem_free (flags);
    mem_free (decfmt);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -