bug-make
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[bug #35384] Request for a "writefile" function


From: John Coiner
Subject: [bug #35384] Request for a "writefile" function
Date: Sat, 28 Jan 2012 00:06:25 +0000
User-agent: Mozilla/5.0 (Ubuntu; X11; Linux x86_64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1

Follow-up Comment #2, bug #35384 (project make):

diff -u -r make-3.82/doc/make.texi make-3.82-mine/doc/make.texi
--- make-3.82/doc/make.texi     2010-07-19 03:10:54.000000000 -0400
+++ make-3.82-mine/doc/make.texi        2012-01-27 10:39:02.221433328 -0500
@@ -7694,6 +7694,32 @@
 This function does nothing more than print its (expanded) argument(s)
 to standard output.  No makefile name or line number is added.  The
 result of the expansion of this function is the empty string.
+
address@hidden $(writefile @var{file}, @address@hidden)
address@hidden writefile
address@hidden printing messages
+This function prints its (expanded) @var{text} argument(s)
+into @var{file}.  No makefile name or line number is added.  The
+result of the expansion of this function is the empty string.
+
+This is useful if you need to pass the value of a Make variable
+through to a program, and the value is either too large to fit
+on a command line due to OS limits, or it contains shell control
+characters that you would need to escape if you passed the value
+as a command line argument.
+
+For example,
+
address@hidden
+
+KLINGON_NOVEL = Heghlu'meH QaQ jajvam! ... and so on for 100,000 words.
+
+translate :
+        $(writefile novel.klingon.txt, $(KLINGON_NOVEL)) 
+        translate.pl -in novel.klingon.txt -out novel.english.txt
+
address@hidden example
+
 @end table
 
 @node Running, Implicit Rules, Functions, Top
diff -u -r make-3.82/function.c make-3.82-mine/function.c
--- make-3.82/function.c        2010-07-12 21:20:39.000000000 -0400
+++ make-3.82-mine/function.c   2012-01-27 10:11:10.701434083 -0500
@@ -1117,6 +1117,42 @@
   return o;
 }
 
+/*
+  write text into a file
+*/
+static char *
+func_writefile (char *o, char **argv, const char *funcname)
+{
+  char **argvp;
+  char *msg, *p;
+  int len;
+
+  /* The arguments will be broken on commas.  Rather than create yet
+     another special case where function arguments aren't broken up,
+     just create a format string that puts them back together.  */
+  for (len=0, argvp=argv+1; *argvp != 0; ++argvp)
+    len += strlen (*argvp) + 2;
+
+  p = msg = alloca (len + 1);
+
+  for (argvp=argv+1; argvp[1] != 0; ++argvp)
+    {
+      strcpy (p, *argvp);
+      p += strlen (*argvp);
+      *(p++) = ',';
+      *(p++) = ' ';
+    }
+  strcpy (p, *argvp);
+
+  FILE *fp = fopen( *argv, "w" );
+  if( fp == NULL )
+      fatal (reading_file, "writefile: unable to open '%s'", *argv );
+  fprintf( fp, "%s", msg );
+  fclose( fp );
+
+  /* The writefile function expands to the empty string.  */
+  return o;
+}
 
 /*
   chop argv[0] into words, and sort them.
@@ -2125,6 +2161,7 @@
   { STRING_SIZE_TUPLE("info"),          0,  1,  1,  func_error},
   { STRING_SIZE_TUPLE("error"),         0,  1,  1,  func_error},
   { STRING_SIZE_TUPLE("warning"),       0,  1,  1,  func_error},
+  { STRING_SIZE_TUPLE("writefile"),     2,  2,  1,  func_writefile},
   { STRING_SIZE_TUPLE("if"),            2,  3,  0,  func_if},
   { STRING_SIZE_TUPLE("or"),            1,  0,  0,  func_or},
   { STRING_SIZE_TUPLE("and"),           1,  0,  0,  func_and},


    _______________________________________________________

Reply to this item at:

  <http://savannah.gnu.org/bugs/?35384>

_______________________________________________
  Message sent via/by Savannah
  http://savannah.gnu.org/




reply via email to

[Prev in Thread] Current Thread [Next in Thread]