]> git.sur5r.net Git - cc65/commitdiff
Working on .MID
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 25 Jun 2000 17:48:28 +0000 (17:48 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 25 Jun 2000 17:48:28 +0000 (17:48 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@130 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/ca65/nexttok.c
src/ca65/toklist.c
src/ca65/toklist.h

index 418130d86fe53e29bf8f920279053d20fd740ecf..72c80708a22777dd6076c05ec94e8ce4c9be4326 100644 (file)
@@ -61,7 +61,7 @@ static TokList* CollectTokens (unsigned Start, unsigned Count)
     /* Read the token list */
     unsigned Current = 0;
     unsigned Parens  = 0;
-    while (Parens != 0 && Tok != TOK_RPAREN) {
+    while (Parens != 0 || Tok != TOK_RPAREN) {
 
        /* Check for end of line or end of input */
        if (Tok == TOK_SEP || Tok == TOK_EOF) {
@@ -83,6 +83,7 @@ static TokList* CollectTokens (unsigned Start, unsigned Count)
        }
 
        /* Get the next token */
+       ++Current;
        NextTok ();
     }
 
@@ -187,7 +188,7 @@ static void FuncMid (void)
 
     /* Count argument */
     Count = ConstExpression ();
-    if (Count > 100) {
+    if (Count < 0 || Count > 100) {
        Error (ERR_RANGE);
        Count = 1;
     }
@@ -197,9 +198,7 @@ static void FuncMid (void)
     List = CollectTokens ((unsigned) Start, (unsigned) Count);
 
     /* Insert it into the scanner feed */
-
-
-
+    PushTokList (List, ".MID");
 }
 
 
index a45d8f0a9c737e6bd51ec4207dbd52a070f46f0d..fc4eec608ad28915e7caadbad9aaf19ccf4af7f1 100644 (file)
@@ -37,6 +37,7 @@
 
 #include "../common/xmalloc.h"
 
+#include "istack.h"
 #include "scanner.h"
 #include "toklist.h"
 
@@ -181,3 +182,56 @@ void AddCurTok (TokList* List)
 
 
 
+static int ReplayTokList (void* List)
+/* Function that gets the next token from a token list and sets it. This
+ * function may be used together with the PushInput function from the istack
+ * module.
+ */
+{
+    /* Cast the generic pointer to an actual list */
+    TokList* L = List;
+
+    /* Set the next token from the list */
+    TokSet (L->Last);
+
+    /* If this was the last token, decrement the repeat counter. If it goes
+     * zero, delete the list and remove the function from the stack.
+     */
+    if (L->Last == 0) {
+       if (--L->Repeat == 0) {
+           /* Done with this list */
+           FreeTokList (L);
+           PopInput ();
+       } else {
+           /* Replay one more time */
+           L->Last = L->Root;
+       }
+    }
+
+    /* We have a token */
+    return 1;
+}
+
+
+
+void PushTokList (TokList* List, const char* Desc)
+/* Push a token list to be used as input for InputFromStack. This includes
+ * several initializations needed in the token list structure, so don't use
+ * PushInput directly.
+ */
+{
+    /* If the list is empty, just delete it and bail out */
+    if (List->Count == 0) {
+       FreeTokList (List);
+       return;
+    }
+
+    /* Reset the last pointer to the first element */
+    List->Last = List->Root;
+
+    /* Insert the list specifying our input function */
+    PushInput (ReplayTokList, List, Desc);
+}
+
+
+
index fb035134970581dd7e3eadbcae4b23958df7161f..498631d830b2f661f593e9f37b3aa9c98fc4b1a3 100644 (file)
@@ -105,6 +105,12 @@ void FreeTokList (TokList* T);
 void AddCurTok (TokList* T);
 /* Add the current token to the token list */
 
+void PushTokList (TokList* List, const char* Desc);
+/* Push a token list to be used as input for InputFromStack. This includes
+ * several initializations needed in the token list structure, so don't use
+ * PushInput directly.
+ */
+
 
 
 /* End of toklist.h */