VirtualBox

Changeset 2141 in kBuild for trunk


Ignore:
Timestamp:
Dec 25, 2008 8:21:22 PM (16 years ago)
Author:
bird
Message:

kmk: new function $(printf fmt,arg0,arg1,...).

Location:
trunk/src/kmk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kmk/Makefile.am

    r2101 r2141  
    139139        -DCONFIG_WITH_FILE_SIZE \
    140140        -DCONFIG_WITH_WHICH \
     141        -DCONFIG_WITH_PRINTF \
    141142        -DCONFIG_WITH_EVALPLUS \
    142143        -DCONFIG_WITH_MINIMAL_STATS \
  • trunk/src/kmk/Makefile.kmk

    r2108 r2141  
    165165        CONFIG_WITH_FILE_SIZE \
    166166        CONFIG_WITH_WHICH \
     167        CONFIG_WITH_PRINTF \
    167168        CONFIG_WITH_EVALPLUS \
    168169        CONFIG_WITH_MINIMAL_STATS \
  • trunk/src/kmk/function.c

    r2118 r2141  
    3535#ifdef KMK_HELPERS
    3636# include "kbuild.h"
     37#endif
     38#ifdef CONFIG_WITH_PRINTF
     39# include "kmkbuiltin.h"
    3740#endif
    3841#ifdef CONFIG_WITH_XARGS /* bird */
     
    45454548  { STRING_SIZE_TUPLE("not"),           0,  1,  1,  func_not},
    45464549#endif
     4550#ifdef CONFIG_WITH_PRINTF
     4551  { STRING_SIZE_TUPLE("printf"),        1,  0,  1,  kmk_builtin_func_printf},
     4552#endif
    45474553#ifdef CONFIG_WITH_LAZY_DEPS_VARS
    45484554  { STRING_SIZE_TUPLE("deps"),          1,  2,  1,  func_deps},
  • trunk/src/kmk/kmkbuiltin.h

    r2127 r2141  
    5454extern int kmk_builtin_kDepIDB(int argc, char **argv, char **envp);
    5555
     56extern char *kmk_builtin_func_printf(char *o, char **argv, const char *funcname);
     57
    5658extern int kbuild_version(const char *);
    5759
  • trunk/src/kmk/kmkbuiltin/printf.c

    r2132 r2141  
    4646#endif*/ /* not lint */
    4747
    48 #include "config.h"
     48#if !defined(kmk_builtin_printf) && !defined(BUILTIN) && !defined(SHELL)
     49# include "../make.h"
     50# include "../filedef.h"
     51# include "../variable.h"
     52#else
     53# include "config.h"
     54#endif
    4955#include <sys/types.h>
    5056
     
    6874#endif
    6975
    70 #include "kmkbuiltin.h"
     76#include "../kmkbuiltin.h"
    7177
    7278
     
    8288static int      rval;
    8389static char  **gargv;
     90#if !defined(kmk_builtin_printf) && !defined(BUILTIN) && !defined(SHELL)
     91static char *g_o = NULL;
     92#endif
    8493static struct option long_options[] =
    8594{
     
    9099
    91100
     101static int       common_printf(int argc, char *argv[]);
    92102static void      conv_escape_str(char *, void (*)(int));
    93103static char     *conv_escape(char *, char *);
     
    105115static void     b_count(int);
    106116static void     b_output(int);
     117static int      wrap_putchar(int ch);
     118static int      wrap_printf(const char *, ...);
    107119
    108120#ifdef BUILTIN          /* csh builtin */
     
    118130        if (fieldwidth != -1) { \
    119131                if (precision != -1) \
    120                         (void)printf(f, fieldwidth, precision, func); \
     132                        (void)wrap_printf(f, fieldwidth, precision, func); \
    121133                else \
    122                         (void)printf(f, fieldwidth, func); \
     134                        (void)wrap_printf(f, fieldwidth, func); \
    123135        } else if (precision != -1) \
    124                 (void)printf(f, precision, func); \
     136                (void)wrap_printf(f, precision, func); \
    125137        else \
    126                 (void)printf(f, func); \
     138                (void)wrap_printf(f, func); \
    127139}
    128140
     
    141153int kmk_builtin_printf(int argc, char *argv[], char **envp)
    142154{
    143         char *fmt, *start;
    144         int fieldwidth, precision;
    145         char nextch;
    146         char *format;
     155        int rc;
    147156        int ch;
    148 
    149         /* kmk: reinitialize globals */
    150         b_length = 0;
    151         b_fmt = NULL;
    152         rval = 0;
    153         gargv = NULL;
    154157
    155158        /* kmk: reset getopt and set progname */
     
    182185                return usage(stderr);
    183186        }
     187
     188        rc = common_printf(argc, argv);
     189        return rc;
     190}
     191
     192#ifndef kmk_builtin_printf
     193/* entry point used by function.c $(printf ..,..). */
     194char *kmk_builtin_func_printf(char *o, char **argv, const char *funcname)
     195{
     196        int rc;
     197        int argc;
     198
     199        for (argc = 0; argv[argc] != NULL; argc++)
     200                /* nothing */;
     201
     202        g_o = o;
     203        rc = common_printf(argc, argv);
     204        o = g_o;
     205        g_o = NULL;
     206
     207        (void)funcname;
     208        if (rc != 0)
     209                fatal (NILF, _("$(%s): failure rc=%d\n"), rc);
     210        return o;
     211}
     212#endif
     213
     214static int common_printf(int argc, char *argv[])
     215{
     216        char *fmt, *start;
     217        int fieldwidth, precision;
     218        char nextch;
     219        char *format;
     220        int ch;
     221
     222        /* kmk: reinitialize globals */
     223        b_length = 0;
     224        b_fmt = NULL;
     225        rval = 0;
     226        gargv = NULL;
    184227
    185228        format = *argv;
     
    203246                                char c_ch;
    204247                                fmt = conv_escape(fmt, &c_ch);
    205                                 putchar(c_ch);
     248                                wrap_putchar(c_ch);
    206249                                continue;
    207250                        }
    208251                        if (ch != '%' || (*fmt == '%' && ++fmt)) {
    209                                 (void)putchar(ch);
     252                                (void)wrap_putchar(ch);
    210253                                continue;
    211254                        }
     
    272315                                conv_escape_str(cp, b_output);
    273316                                /* Add any trailing spaces */
    274                                 printf("%s", b_fmt);
     317                                wrap_printf("%s", b_fmt);
    275318                                break;
    276319                        }
     
    346389                        return;
    347390                case ' ':
    348                         putchar(' ');
     391                        wrap_putchar(' ');
    349392                        break;
    350393                default:
    351                         putchar(ch);
     394                        wrap_putchar(ch);
    352395                        return;
    353396                }
    354397        }
     398}
     399
     400static int wrap_putchar(int ch)
     401{
     402#ifndef kmk_builtin_printf
     403        if (g_o) {
     404                char sz[2];
     405                sz[0] = ch; sz[1] = '\0';
     406                g_o = variable_buffer_output(g_o, sz, 1);
     407                return ch;
     408        }
     409#endif
     410        return putchar(ch);
     411}
     412
     413static int wrap_printf(const char * fmt, ...)
     414{
     415        int rc;
     416        va_list va;
     417
     418#ifndef kmk_builtin_printf
     419        if (g_o) {
     420                char *str;
     421
     422                va_start(va, fmt);
     423                rc = vasprintf(&str, fmt, va);
     424                va_end(va);
     425                if (rc >= 0) {
     426                        g_o = variable_buffer_output(g_o, str, rc);
     427                        free(str);
     428                }
     429                return rc;
     430        }
     431#endif
     432
     433        va_start(va, fmt);
     434        rc = vprintf(fmt, va);
     435        va_end(va);
     436        return rc;
    355437}
    356438
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette