* Fix backward incompatibility in new function implementation.
authorPaul Smith <psmith@gnu.org>
Thu, 22 Jul 1999 04:31:11 +0000 (04:31 +0000)
committerPaul Smith <psmith@gnu.org>
Thu, 22 Jul 1999 04:31:11 +0000 (04:31 +0000)
* Add support for ARFZMAG archive formats.

ChangeLog
arscan.c
function.c

index f3fdffa954007ce46844de6293bfa28267ba7189..69b8797ed7421f476a1a5bd5205ae4d7b5dc3489 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
        dmalloc (http://www.dmalloc.com/) with make.  Use --enable-dmalloc
        with configure to enable it.
 
+       * function.c (function_table_entry): Whoops!  The function.c
+       rewrite breaks backward compatibility: all text to a function is
+       broken into arguments, and extras are ignored.  So $(sort a,b,c)
+       returns "a"!  Etc.  Ouch.  Fix it by making a positive value in
+       the REQUIRED_ARGS field mean exactly that many arguments to the
+       function; any "extras" are considered part of the last argument as
+       before.  A negative value means at least that many, but may be
+       more: in this case all text is broken on commas.
+       (handle_function): Stop when we've seen REQUIRED_ARGS args, if >0.
+       (expand_builtin_function): Compare number of args to the absolute
+       value of REQUIRED_ARGS.
+
 1999-07-20  Paul D. Smith  <psmith@gnu.org>
 
        * job.c (start_job_command): Ensure that the state of the target
        (struct file): Per-file considered toggle bit.  * file.c: New
        global toggle variable considered.
 
+1999-04-05  Paul D. Smith  <psmith@gnu.org>
+
+       * arscan.c (ar_scan): Added support for ARFZMAG (compressed
+       archives?) for Digital UNIX C++.  Information provided by
+       Patrick E. Krogel <pekrogel@mtu.edu>.
+       (ar_member_touch): Ditto.
+
 1999-04-03  Paul D. Smith  <psmith@gnu.org>
 
        * remake.c (f_mtime): If: a) we found a file and b) we didn't
index 0632ddb0d9d8bb309797c46077ecd2cdc4fefdac..b1b7d1058423e7dd71730b0051559c47b96beccb 100644 (file)
--- a/arscan.c
+++ b/arscan.c
@@ -517,8 +517,20 @@ ar_scan (archive, function, arg)
          break;
 
        if (nread != AR_HDR_SIZE
-#ifdef ARFMAG
-           || bcmp (member_header.ar_fmag, ARFMAG, 2)
+#if defined(ARFMAG) || defined(ARFZMAG)
+           || (
+# ifdef ARFMAG
+                bcmp (member_header.ar_fmag, ARFMAG, 2)
+# else
+                1
+# endif
+                &&
+# ifdef ARFZMAG
+                bcmp (member_header.ar_fmag, ARFZMAG, 2)
+# else
+                1
+# endif
+               )
 #endif
            )
          {
@@ -768,7 +780,7 @@ ar_member_touch (arname, memname)
 #else
   fstat (fd, &statbuf);
 #endif
-#if defined(ARFMAG) || defined(AIAMAG)
+#if defined(ARFMAG) || defined(ARFZMAG) || defined(AIAMAG)
   /* Advance member's time to that time */
   for (i = 0; i < sizeof ar_hdr.ar_date; i++)
     ar_hdr.ar_date[i] = ' ';
index 04b835bffc94f5f1bc2b0081ffc1ad5817ff24d4..0550dd81cd9c7ab98f8e29f2c0084730a55e8f24 100644 (file)
@@ -33,8 +33,8 @@ struct function_table_entry
   {
     const char *name;
     int len;
-    int required_arguments;
-    int expand_all_arguments;
+    int required_args;
+    int expand_args;
     char *(*func_ptr) PARAMS((char *output, char **argv, const char*funcname));
   };
 
@@ -315,7 +315,11 @@ expand_builtin_function (o, argc, argv, entry_p)
      char **argv;
      struct function_table_entry *entry_p;
 {
-  if (argc < entry_p->required_arguments && entry_p->required_arguments >= 0)
+  int min = (entry_p->required_args > 0
+             ? entry_p->required_args
+             : -entry_p->required_args);
+
+  if (argc < min)
     fatal (reading_file,
            "Insufficient number of arguments (%d) to function `%s'",
            argc, entry_p->name);
@@ -383,10 +387,12 @@ handle_function (op, stringp)
   /* Get some memory to store the arg pointers.  */
   argvp = argv = (char **) alloca (sizeof(char *) * (nargs + 2));
 
-  /* Chop the string into arguments, then store the end pointer and a nul.  */
+  /* Chop the string into arguments, then store the end pointer and a nul.
+     If REQUIRED_ARGS is positive, as soon as we hit that many assume the
+     rest of the string is part of the last argument.  */
   *argvp = argbeg;
   nargs = 1;
-  while (1)
+  while (entry_p->required_args > 0 && nargs < entry_p->required_args)
     {
       char *next = find_next_argument (openparen, closeparen, *argvp, p);
 
@@ -401,7 +407,7 @@ handle_function (op, stringp)
   *(++argvp) = 0;
 
   /* If we should expand, do it.  */
-  if (entry_p->expand_all_arguments)
+  if (entry_p->expand_args)
     {
       for (argvp=argv; argvp[1] != 0; ++argvp)
        *argvp = expand_argument (*argvp, argvp[1]-1);
@@ -414,7 +420,7 @@ handle_function (op, stringp)
   *op = expand_builtin_function (*op, nargs, argv, entry_p);
 
   /* If we allocated memory for the expanded args, free it again.  */
-  if (entry_p->expand_all_arguments)
+  if (entry_p->expand_args)
     for (argvp=argv; *argvp != 0; ++argvp)
       free (*argvp);
 
@@ -1805,12 +1811,14 @@ func_call (o, argv, funcname)
    some efficiency by moving most often used functions to the start of the
    table.
 
-   REQUIRED_ARGUMENTS is the minimum number of arguments.  A function
-   can have more, but if they have less an error will be generated.
+   If REQUIRED_ARGS is positive, the function takes exactly that many
+   arguments.  All subsequent text is included with the last argument.  So,
+   since $(sort a,b,c) takes only one argument, it will be the full string
+   "a,b,c".  If the value is negative, it's the minimum number of arguments.
+   A function can have more, but if it has less an error is generated.
 
-   EXPAND_ALL_ARGUMENTS means that all arguments should be expanded
-   before invocation.  Functions that do namespace tricks (foreach)
-   don't automatically expand.  */
+   EXPAND_ARGS means that all arguments should be expanded before invocation.
+   Functions that do namespace tricks (foreach) don't automatically expand.  */
 
 static struct function_table_entry function_table[] =
 {
@@ -1837,7 +1845,7 @@ static struct function_table_entry function_table[] =
   { STRING_SIZE_TUPLE("words"),         1,  1,  func_words},
   { STRING_SIZE_TUPLE("origin"),        1,  1,  func_origin},
   { STRING_SIZE_TUPLE("foreach"),       3,  0,  func_foreach},
-  { STRING_SIZE_TUPLE("call"),          1,  1,  func_call},
+  { STRING_SIZE_TUPLE("call"),         -1,  1,  func_call},
   { STRING_SIZE_TUPLE("error"),         1,  1,  func_error},
   { STRING_SIZE_TUPLE("warning"),       1,  1,  func_error},
 #ifdef EXPERIMENTAL