lib.c: Fix some commentary blunders.
[runlisp] / lib.c
diff --git a/lib.c b/lib.c
index 523ca23..b509cea 100644 (file)
--- a/lib.c
+++ b/lib.c
@@ -51,7 +51,7 @@ void set_progname(const char *prog)
   const char *p;
 
   p = strrchr(prog, '/');
-  progname = p ? p + 1 : progname;
+  progname = p ? p + 1 : prog;
 }
 
 /* Report an error or warning in Unix style, given a captured argument
@@ -267,7 +267,7 @@ void argv_ensure(struct argv *av, size_t n)
   if (need <= av->sz) return;
   newsz = av->sz ? 2*av->sz : 8;
   while (newsz < need) newsz *= 2;
-  av->v = xrealloc(av->v - av->o, newsz*sizeof(char *)) + av->o;
+  av->v = xrealloc(av->v - av->o, newsz*sizeof(char *)); av->v += av->o;
   av->sz = newsz;
 }
 
@@ -377,7 +377,7 @@ void argv_prependl(struct argv *av, ...)
 /* Return nonzero if the AN-byte string A is strictly precedes the BN-byte
  * string B in a lexicographic ordering.
  *
- * All comparisons of keys is handled by this function.
+ * All comparison of keys is handled by this function.
  */
 static int str_lt(const char *a, size_t an, const char *b, size_t bn)
 {
@@ -436,7 +436,7 @@ void *treap_lookup(const struct treap *t, const char *k, size_t kn)
  * This is similar to `treap_lookup', in that it returns the requested node
  * if it already exists, or null otherwise, but it also records in P
  * information to be used by `treap_insert' to insert a new node with the
- * given key it's not there already.
+ * given key if it's not there already.
  */
 void *treap_probe(struct treap *t, const char *k, size_t kn,
                  struct treap_path *p)
@@ -509,17 +509,17 @@ void treap_insert(struct treap *t, const struct treap_path *p,
      * subtree of U, then we rotate like this:
      *
      *                 |                   |
-     *                 U                   N
+     *                 U                  (N)
      *               /   \               /   \
      *            (N)      Z   --->    X       U
      *           /   \                       /   \
      *         X       Y                   Y       Z
      *
-     * On the other hand, if we ere planning to hook N as the right subtree
+     * On the other hand, if we were planning to hook N as the right subtree
      * of U, then we do the opposite rotation:
      *
      *             |                           |
-     *             U                           N
+     *             U                          (N)
      *           /   \                       /   \
      *         X      (N)      --->        U       Z
      *               /   \               /   \
@@ -594,7 +594,7 @@ void *treap_remove(struct treap *t, const char *k, size_t kn)
      *               /   \               /   \
      *             L       R   --->    X      (N)
      *           /   \                       /   \
-     *         X       Y                   Y       Z
+     *         X       Y                   Y       R
      *
      * or
      *
@@ -608,8 +608,10 @@ void *treap_remove(struct treap *t, const char *k, size_t kn)
      * Again, these transformations clearly preserve the ordering of nodes in
      * the binary search tree, and the heap condition.
      */
-    else if (l->wt > r->wt) { *nn = l; n->left = l->right; nn = &l->right; }
-    else { *nn = r; n->right = r->left; nn = &r->left; }
+    else if (l->wt > r->wt)
+      { *nn = l; nn = &l->right; l = n->left = l->right; }
+    else
+      { *nn = r; nn = &r->left; r = n->right = r->left; }
 
   /* Release the key buffer, and return the node that we've now detached. */
   free(n->k); return (n);
@@ -691,9 +693,9 @@ void *treap_next(struct treap_iter *i)
    *
    *   * If the current node's right subtree is not empty, then the next node
    *    to be visited is the leftmost node in that subtree.  All of the
-   *    nodes on the stack are ancestors of the current nodes, and the right
+   *    nodes on the stack are ancestors of the current node, and the right
    *    subtree consists of its descendants, so none of them are already on
-   *    the stack, and they're all greater than the current node, and
+   *    the stack; and they're all greater than the current node, and
    *    therefore haven't been visited.  Therefore, we must push the current
    *    node's right child, its /left/ child, and so on, proceeding
    *    leftwards until we fall off the bottom of the tree.
@@ -733,7 +735,7 @@ static void check_subtree(struct treap_node *n, unsigned maxwt,
   if (khi) assert(STRCMP(n->k, <, khi));
 
   /* Check the left subtree.  Node weights must be bounded above by our own
-   * weight.  And everykey in the left subtree must be smaller than our
+   * weight.  And every key in the left subtree must be smaller than our
    * current key.  We propagate the lower bound.
    */
   if (n->left) check_subtree(n->left, n->wt, klo, n->k);
@@ -930,7 +932,7 @@ static void set_config_section_parents(struct config *conf,
      * to have, so we can allocate the `parents' vector and fill it in.
      */
     sect->nparents = av.n/2;
-    sect->parents = xmalloc(sect->nparents*sizeof(sect->parents));
+    sect->parents = xmalloc(sect->nparents*sizeof(*sect->parents));
     for (i = 0; i < av.n; i += 2) {
       n = av.v[i + 1] - av.v[i];
       parent = config_find_section_n(conf, 0, av.v[i], n);
@@ -1059,34 +1061,38 @@ struct config_var *config_find_var_n(struct config *conf,
 /* Set variable NAME to VALUE in SECT, with associated flags F.
  *
  * The names are null-terminated.  The flags are variable flags: see `struct
- * config_var' for details.
+ * config_var' for details.  Returns the variable.
  *
  * If the variable is already set and has the `CF_OVERRIDE' flag, then this
  * function does nothing unless `CF_OVERRIDE' is /also/ set in F.
  */
-void config_set_var(struct config *conf, struct config_section *sect,
-                   unsigned f, const char *name, const char *value)
+struct config_var *config_set_var(struct config *conf,
+                                 struct config_section *sect,
+                                 unsigned f,
+                                 const char *name, const char *value)
 {
-  config_set_var_n(conf, sect, f,
-                  name, strlen(name),
-                  value, strlen(value));
+  return (config_set_var_n(conf, sect, f,
+                          name, strlen(name),
+                          value, strlen(value)));
 }
 
 /* As `config_set_var', except that the variable NAME and VALUE have explicit
  * lengths (NAMELEN and VALUELEN, respectively) rather than being null-
  * terminated.
  */
-void config_set_var_n(struct config *conf, struct config_section *sect,
-                     unsigned f,
-                     const char *name, size_t namelen,
-                     const char *value, size_t valuelen)
+struct config_var *config_set_var_n(struct config *conf,
+                                   struct config_section *sect,
+                                   unsigned f,
+                                   const char *name, size_t namelen,
+                                   const char *value, size_t valuelen)
 {
   struct config_var *var =
     config_find_var_n(conf, sect, CF_CREAT, name, namelen);
 
-  if (var->f&~f&CF_OVERRIDE) return;
+  if (var->f&~f&CF_OVERRIDE) return (var);
   free(var->val); var->val = xstrndup(value, valuelen); var->n = valuelen;
   var->f = f;
+  return (var);
 }
 
 /* Initialize I to iterate over the variables directly defined in SECT. */
@@ -1330,8 +1336,9 @@ static void filter_string(const char *p, const char *l,
 
 /* Scan and resolve a `[SECT:]VAR' specifier at P.
  *
- * Return the address of the next character following the specifier.  L is a
- * limit on the region of the buffer that we should process; SB is the
+ * Return the address of the next character following the specifier; and set
+ * *VAR_OUT to point to the variable we found, or null if it's not there.  L
+ * is a limit on the region of the buffer that we should process; SB is the
  * substitution state which provides the home section if none is given
  * explicitly; FILE and LINE are the source location to blame for problems.
  */
@@ -1373,7 +1380,11 @@ static const char *subst(const char *p, const char *l,
   size_t n;
 
   /* It would be best if we could process literal text at high speed.  To
-   * this end,
+   * this end, we have a table, indexed by the low-order bits of F, to tell
+   * us which special characters we need to stop at.  This way, we can use
+   * `strcspn' to skip over literal text and stop at the next character which
+   * needs special handling.  Entries in this table with a null pointer
+   * correspond to impossible flag settings.
    */
   static const char *const delimtab[] = {
 
@@ -1445,7 +1456,7 @@ static const char *subst(const char *p, const char *l,
        * to it.
        */
 
-      /* If there's no next charact3er then we should be upset. */
+      /* If there's no next character then we should be upset. */
       p++; if (p >= l) lose("%s:%u: unfinished `\\' escape", file, line);
 
       if (!(f&SF_SKIP)) {
@@ -1577,13 +1588,13 @@ static const char *subst(const char *p, const char *l,
               * toothpick, so now we need Q + (Q + 1) = 2 Q + 1 toothpicks.
               *
               * Calculate this here rather than at each point toothpicks
-              * needs to be deployed.
+              * need to be deployed.
               */
 
              subqfilt = 2*subqfilt + 1;
 
            else if (t - p == 1 && *p == 'l')
-             /* `u' -- convert to uppercase.
+             /* `l' -- convert to lowercase.
               *
               * If a case conversion is already set, then that will override
               * whatever we do here, so don't bother.