Added $(shell xxx) support
authorRobert Pengelly <robertapengelly@hotmail.com>
Mon, 24 Mar 2025 01:50:50 +0000 (01:50 +0000)
committerRobert Pengelly <robertapengelly@hotmail.com>
Mon, 24 Mar 2025 01:50:50 +0000 (01:50 +0000)
read.c
variable.c

diff --git a/read.c b/read.c
index 673a51fc007d1cf3a1b7dcb910fab747f99587bc..0932c3d32c86925653c55d14d7c55b26bdfa95f3 100644 (file)
--- a/read.c
+++ b/read.c
@@ -883,6 +883,7 @@ int read_makefile (const char *filename) {
 
 void read_memory_makefile (const char *filename, unsigned long line_no, char *memory) {
 
+    struct if_stack *saved_if_stack;
     struct linebuf lbuf;
     
     lbuf.size = 256;
@@ -894,8 +895,13 @@ void read_memory_makefile (const char *filename, unsigned long line_no, char *me
     lbuf.filename = filename;
     lbuf.line_no = line_no;
     
+    saved_if_stack = cur_if_stack;
+    cur_if_stack = 0;
+    
     read_lbuf (&lbuf, 1);
     free (lbuf.start);
+    
+    cur_if_stack = saved_if_stack;
 
 }
 
index a1c6559194fb5e521bfccbecf9a1e06a37e2b163..8fc50a7e9aa78ff46f6ec0a56126748229078e24 100644 (file)
 #include    <xmake/variable.h>
 #include    <xmake/xmake.h>
 
+struct linebuf {
+
+    char *start;
+    unsigned long size;
+    
+    FILE *f;
+
+};
+
 struct builtin_function {
 
     const char *name;
@@ -27,18 +36,83 @@ static char *func_eval (const char *filename, unsigned long line_no, char *input
 
 }
 
+static void read_line (struct linebuf *lbuf) {
+
+    char *end = lbuf->start + lbuf->size;
+    char *p = lbuf->start;
+    
+    while (fgets (p, end - p, lbuf->f)) {
+    
+        size_t offset;
+        
+        p += strlen (p);
+        offset = p - lbuf->start;
+        
+        if (p[-1] == '\n') {
+        
+            p--;
+            
+            if (p[-1] == '\r') {
+                p[-1] = ' ';
+            }
+        
+        }
+        
+        if (end - p >= 80) {
+            continue;
+        }
+        
+        lbuf->size *= 2;
+        lbuf->start = xrealloc (lbuf->start, lbuf->size);
+        
+        p = lbuf->start + offset;
+        end = lbuf->start + lbuf->size;
+    
+    }
+
+}
+
 static char *func_error (const char *filename, unsigned long line_no, char *input) {
 
-    fprintf (stderr, "%s: %s: %lu: %s\n", program_name, filename, line_no, input);
+    fprintf (stderr, "%s: %s: %lu: *** %s. Stop.\n", program_name, filename, line_no, input);
     exit (EXIT_FAILURE);
 
 }
 
+static char *func_shell (const char *filename, unsigned long line_no, char *input) {
+
+    struct linebuf lbuf;
+    FILE *fp;
+    
+    if (!*input) {
+    
+        fprintf (stderr, "%s: %s: %lu: empty call\n", program_name, filename, line_no);
+        return 0;
+    
+    }
+    
+    if (!(fp = popen (input, "rb"))) {
+        return 0;
+    }
+    
+    lbuf.size = 256;
+    
+    lbuf.start = xmalloc (lbuf.size);
+    lbuf.f = fp;
+    
+    read_line (&lbuf);
+    pclose(fp);
+    
+    return lbuf.start;
+
+}
+
 static struct builtin_function builtin_functions[] ={
 
-    {   "eval",     &func_eval      },
     {   "error",    &func_error     },
+    {   "shell",    &func_shell     },
     
+    {   "eval",     &func_eval      },
     {   0,          0               }
 
 };
@@ -238,7 +312,17 @@ char *variable_expand_line (const char *filename, unsigned long line_no, char *l
                         q++;
                     }
                     
-                    alloc_replacement = func->func (filename, line_no, q);
+                    if ((alloc_replacement = func->func (filename, line_no, q))) {
+                    
+                        new = xmalloc (pos + strlen (alloc_replacement) + 1);
+                        
+                        memcpy (new, line, pos);
+                        memcpy (new + pos, alloc_replacement, strlen (alloc_replacement));
+                        
+                        free (alloc_replacement);
+                        return new;
+                    
+                    }
                 
                 } else if ((q = strchr (content, '='))) {