]> foleosoft.com Git - QAnsel.git/commitdiff
Sun Feb 11 11:10:36 PM EST 2024
authormiha-q <>
Mon, 12 Feb 2024 04:10:36 +0000 (23:10 -0500)
committermiha-q <>
Mon, 12 Feb 2024 04:10:36 +0000 (23:10 -0500)
src/QAnsel.c

index e7b507b84ba6aa7215207eb8cf50690b528643da..907e4fd319219f30863f5a1ab40ac2fe636155f5 100644 (file)
@@ -603,8 +603,18 @@ void process(int argc, char** argv)
                char g;
                int q0, q1, q2;
                float a0, a1, a2;
-
-               if (sscanf(lines[i], "qreg q[%i]", &q0) == 1)
+               uint32_t matchedCount;
+               uint32_t lineLen = strlen(lines[i]);
+               if (lineLen > 1)
+               {
+                       while (lineLen > 1 && (lines[i][lineLen - 1] == ' ' || lines[i][lineLen - 1] == '\t'))
+                       {
+                               lines[i][lineLen - 1] = 0;
+                               lineLen--;
+                       }
+               }
+               
+               if (sscanf(lines[i], "qreg q[%i]%n", &q0, &matchedCount) == 1)
                {
                        if (qubitCount == 0xFF)
                        {
@@ -623,7 +633,7 @@ void process(int argc, char** argv)
                                break;
                        }
                }
-               else if (sscanf(lines[i], "creg c[%i]", &q0) == 1)
+               else if (sscanf(lines[i], "creg c[%i]%n", &q0, &matchedCount) == 1)
                {
                        if (bitCount == 0xFF)
                        {
@@ -642,7 +652,7 @@ void process(int argc, char** argv)
                                break;
                        }
                }
-               else if (sscanf(lines[i], "u(%f,%f,%f) q[%i]", &a0, &a1, &a2, &q0) == 4)
+               else if (sscanf(lines[i], "u(%f,%f,%f) q[%i]%n", &a0, &a1, &a2, &q0, &matchedCount) == 4)
                {
                        if (qubitCount == 0xFF)
                        {
@@ -673,67 +683,67 @@ void process(int argc, char** argv)
                {
                        double angle;
                        char ty;
-                       if (sscanf(lines[i], "r%c(%f/%f) q[%i]", &ty, &a0, &a1, &q0) == 4)
+                       if (sscanf(lines[i], "r%c(%f/%f) q[%i]%n", &ty, &a0, &a1, &q0, &matchedCount) == 4)
                        {
                                angle = a0 / a1;
                        }
-                       else if (sscanf(lines[i], "r%c(%f/%fpi) q[%i]", &ty, &a0, &a1, &q0) == 4)
+                       else if (sscanf(lines[i], "r%c(%f/%fpi) q[%i]%n", &ty, &a0, &a1, &q0, &matchedCount) == 4)
                        {
                                angle = a0 / (a1 * M_PI);
                        }
-                       else if (sscanf(lines[i], "r%c(%f/pi) q[%i]", &ty, &a0, &q0) == 3)
+                       else if (sscanf(lines[i], "r%c(%f/pi) q[%i]%n", &ty, &a0, &q0, &matchedCount) == 3)
                        {
                                angle = a0 / M_PI;
                        }
-                       else if (sscanf(lines[i], "r%c(%f/-pi) q[%i]", &ty, &a0, &q0) == 3)
+                       else if (sscanf(lines[i], "r%c(%f/-pi) q[%i]%n", &ty, &a0, &q0, &matchedCount) == 3)
                        {
                                angle = a0 / -M_PI;
                        }
-                       else if (sscanf(lines[i], "r%c(%fpi/%f) q[%i]", &ty, &a0, &a1, &q0) == 4)
+                       else if (sscanf(lines[i], "r%c(%fpi/%f) q[%i]%n", &ty, &a0, &a1, &q0, &matchedCount) == 4)
                        {
                                angle = (a0 * M_PI) / a1;
                        }
-                       else if (sscanf(lines[i], "r%c(pi/%f) q[%i]", &ty, &a0, &q0) == 3)
+                       else if (sscanf(lines[i], "r%c(pi/%f) q[%i]%n", &ty, &a0, &q0, &matchedCount) == 3)
                        {
                                angle = M_PI / a0;
                        }
-                       else if (sscanf(lines[i], "r%c(-pi/%f) q[%i]", &ty, &a0, &q0) == 3)
+                       else if (sscanf(lines[i], "r%c(-pi/%f) q[%i]%n", &ty, &a0, &q0, &matchedCount) == 3)
                        {
                                angle = -M_PI / a0;
                        }
-                       else if (sscanf(lines[i], "r%c(%fpi/%fpi) q[%i]", &ty, &a0, &a1, &q0) == 4)
+                       else if (sscanf(lines[i], "r%c(%fpi/%fpi) q[%i]%n", &ty, &a0, &a1, &q0, &matchedCount) == 4)
                        {
                                angle = (a0 * M_PI) / (a1 * M_PI);
                        }
-                       else if (sscanf(lines[i], "r%c(pi/pi) q[%i]", &ty, &q0) == 2)
+                       else if (sscanf(lines[i], "r%c(pi/pi) q[%i]%n", &ty, &q0, &matchedCount) == 2)
                        {
                                angle = 1;
                        }
-                       else if (sscanf(lines[i], "r%c(-pi/pi) q[%i]", &ty, &q0) == 2)
+                       else if (sscanf(lines[i], "r%c(-pi/pi) q[%i]%n", &ty, &q0, &matchedCount) == 2)
                        {
                                angle = -1;
                        }
-                       else if (sscanf(lines[i], "r%c(pi/-pi) q[%i]", &ty, &q0) == 2)
+                       else if (sscanf(lines[i], "r%c(pi/-pi) q[%i]%n", &ty, &q0, &matchedCount) == 2)
                        {
                                angle = -1;
                        }
-                       else if (sscanf(lines[i], "r%c(-pi/-pi) q[%i]", &ty, &q0) == 2)
+                       else if (sscanf(lines[i], "r%c(-pi/-pi) q[%i]%n", &ty, &q0, &matchedCount) == 2)
                        {
                                angle = 1;
                        }
-                       else if (sscanf(lines[i], "r%c(%fpi) q[%i]", &ty, &a0, &q0) == 3)
+                       else if (sscanf(lines[i], "r%c(%fpi) q[%i]%n", &ty, &a0, &q0, &matchedCount) == 3)
                        {
                                angle = a0 * M_PI;
                        }
-                       else if (sscanf(lines[i], "r%c(pi) q[%i]", &ty, &q0) == 2)
+                       else if (sscanf(lines[i], "r%c(pi) q[%i]%n", &ty, &q0, &matchedCount) == 2)
                        {
                                angle = M_PI;
                        }
-                       else if (sscanf(lines[i], "r%c(-pi) q[%i]", &ty, &q0) == 2)
+                       else if (sscanf(lines[i], "r%c(-pi) q[%i]%n", &ty, &q0, &matchedCount) == 2)
                        {
                                angle = -M_PI;
                        }
-                       else if (sscanf(lines[i], "r%c(%f) q[%i]", &ty, &a0, &q0) == 3)
+                       else if (sscanf(lines[i], "r%c(%f) q[%i]%n", &ty, &a0, &q0, &matchedCount) == 3)
                        {
                                angle = a0;
                        }
@@ -780,7 +790,7 @@ void process(int argc, char** argv)
                        }
                        instrLen++;
                }
-               else if (sscanf(lines[i], "density q[%i]", &q0) == 1)
+               else if (sscanf(lines[i], "density q[%i]%n", &q0, &matchedCount) == 1)
                {
                        g = lines[i][0];
                        if (qubitCount == 0xFF)
@@ -801,12 +811,12 @@ void process(int argc, char** argv)
                }
                else if
                (
-                       sscanf(lines[i], "h q[%i]", &q0) == 1
-                       || sscanf(lines[i], "x q[%i]", &q0) == 1
-                       || sscanf(lines[i], "y q[%i]", &q0) == 1
-                       || sscanf(lines[i], "z q[%i]", &q0) == 1
-                       || sscanf(lines[i], "t q[%i]", &q0) == 1
-                       || sscanf(lines[i], "s q[%i]", &q0) == 1
+                       sscanf(lines[i], "h q[%i]%n", &q0, &matchedCount) == 1
+                       || sscanf(lines[i], "x q[%i]%n", &q0, &matchedCount) == 1
+                       || sscanf(lines[i], "y q[%i]%n", &q0, &matchedCount) == 1
+                       || sscanf(lines[i], "z q[%i]%n", &q0, &matchedCount) == 1
+                       || sscanf(lines[i], "t q[%i]%n", &q0, &matchedCount) == 1
+                       || sscanf(lines[i], "s q[%i]%n", &q0, &matchedCount) == 1
                )
                {
                        g = lines[i][0];
@@ -827,7 +837,7 @@ void process(int argc, char** argv)
                        instr[instrLen].n[1] = 0;
                        instr[instrLen++].q0 = (uint8_t)q0;
                }
-               else if (sscanf(lines[i], "cx q[%i], q[%i]", &q0, &q1) == 2)
+               else if (sscanf(lines[i], "cx q[%i], q[%i]%n", &q0, &q1, &matchedCount) == 2)
                {
                        if (qubitCount == 0xFF)
                        {
@@ -846,7 +856,7 @@ void process(int argc, char** argv)
                        instr[instrLen].q0 = q0; 
                        instr[instrLen++].q1 = q1; 
                }
-               else if (sscanf(lines[i], "swap q[%i], q[%i]", &q0, &q1) == 2)
+               else if (sscanf(lines[i], "swap q[%i], q[%i]%n", &q0, &q1, &matchedCount) == 2)
                {
                        if (qubitCount == 0xFF)
                        {
@@ -867,8 +877,8 @@ void process(int argc, char** argv)
                }
                else if
                (
-                       sscanf(lines[i], "cswap q[%i], q[%i], q[%i]", &q0, &q1, &q2) == 3
-                       || sscanf(lines[i], "fredkin q[%i], q[%i], q[%i]", &q0, &q1, &q2) == 3
+                       sscanf(lines[i], "cswap q[%i], q[%i], q[%i]%n", &q0, &q1, &q2, &matchedCount) == 3
+                       || sscanf(lines[i], "fredkin q[%i], q[%i], q[%i]%n", &q0, &q1, &q2, &matchedCount) == 3
                )
                {
                        if (qubitCount == 0xFF)
@@ -897,8 +907,8 @@ void process(int argc, char** argv)
                }
                else if
                (
-                       sscanf(lines[i], "ccx q[%i], q[%i], q[%i]", &q0, &q1, &q2) == 3
-                       || sscanf(lines[i], "toffoli q[%i], q[%i], q[%i]", &q0, &q1, &q2) == 3
+                       sscanf(lines[i], "ccx q[%i], q[%i], q[%i]%n", &q0, &q1, &q2, &matchedCount) == 3
+                       || sscanf(lines[i], "toffoli q[%i], q[%i], q[%i]%n", &q0, &q1, &q2, &matchedCount) == 3
                )
                {
                        if (qubitCount == 0xFF)
@@ -925,7 +935,7 @@ void process(int argc, char** argv)
                        instr[instrLen].q1 = q1; 
                        instr[instrLen++].q2 = q2; 
                }
-               else if (sscanf(lines[i], "measure q[%i] -> c[%i]", &q0, &q1) == 2)
+               else if (sscanf(lines[i], "measure q[%i] -> c[%i]%n", &q0, &q1, &matchedCount) == 2)
                {
                        if (bitCount == 0xFF)
                        {
@@ -944,7 +954,7 @@ void process(int argc, char** argv)
                        instr[instrLen].q0 = q0; 
                        instr[instrLen++].q1 = q1; 
                }
-               else if (sscanf(lines[i], "if(c==%i)", &q0) == 1)
+               else if (sscanf(lines[i], "if(c==%i)%n", &q0, &matchedCount) == 1)
                {
                        if (bitCount == 0xFF)
                        {
@@ -962,7 +972,7 @@ void process(int argc, char** argv)
                        strcpy(instr[instrLen].n, "if_all");
                        instr[instrLen++].q0 = q0; 
                }
-               else if (sscanf(lines[i], "if(c[%i]==%i)", &q0, &q1) == 2)
+               else if (sscanf(lines[i], "if(c[%i]==%i)%n", &q0, &q1, &matchedCount) == 2)
                {
                        if (bitCount == 0xFF)
                        {
@@ -993,6 +1003,7 @@ void process(int argc, char** argv)
                }*/
                else if (strcmp(lines[i], "print q") == 0)
                {
+                       matchedCount = lineLen;
                        if (qubitCount == 0xFF)
                        {
                                fprintf(stderr, "QAnsel: Qubit instruction used before initialization");
@@ -1005,6 +1016,7 @@ void process(int argc, char** argv)
                }
                else if (strcmp(lines[i], "print c") == 0)
                {
+                       matchedCount = lineLen;
                        if (bitCount == 0xFF)
                        {
                                fprintf(stderr, "QAnsel: Bit instruction used before initialization");
@@ -1015,7 +1027,7 @@ void process(int argc, char** argv)
                        strcpy(instr[instrLen].n, "printc_all");
                        instrLen++;
                }
-               else if (sscanf(lines[i], "print q[%i]", &q0) == 1)
+               else if (sscanf(lines[i], "print q[%i]%n", &q0, &matchedCount) == 1)
                {
                        if (qubitCount == 0xFF)
                        {
@@ -1033,7 +1045,7 @@ void process(int argc, char** argv)
                        strcpy(instr[instrLen].n, "printq");
                        instr[instrLen++].q0 = q0; 
                }
-               else if (sscanf(lines[i], "print c[%i]", &q0) == 1)
+               else if (sscanf(lines[i], "print c[%i]%n", &q0, &matchedCount) == 1)
                {
                        if (bitCount == 0xFF)
                        {
@@ -1053,6 +1065,7 @@ void process(int argc, char** argv)
                }
                else if (strcmp(lines[i], "born") == 0 || strcmp(lines[i], "born q") == 0)
                {
+                       matchedCount = lineLen;
                        if (qubitCount == 0xFF)
                        {
                                fprintf(stderr, "QAnsel: Qubit instruction used before initialization");
@@ -1063,7 +1076,7 @@ void process(int argc, char** argv)
                        strcpy(instr[instrLen].n, "born_all");
                        instrLen++;
                }
-               else if (sscanf(lines[i], "born q[%i]", &q0) == 1)
+               else if (sscanf(lines[i], "born q[%i]%n", &q0, &matchedCount) == 1)
                {
                        if (qubitCount == 0xFF)
                        {
@@ -1081,7 +1094,7 @@ void process(int argc, char** argv)
                        strcpy(instr[instrLen].n, "born");
                        instr[instrLen++].q0 = q0; 
                }
-               else if (sscanf(lines[i], "reset q[%i]", &q0) == 1)
+               else if (sscanf(lines[i], "reset q[%i]%n", &q0, &matchedCount) == 1)
                {
                        if (qubitCount == 0xFF)
                        {
@@ -1099,7 +1112,7 @@ void process(int argc, char** argv)
                        strcpy(instr[instrLen].n, "resetq");
                        instr[instrLen++].q0 = q0; 
                }
-               else if (sscanf(lines[i], "reset c[%i]", &q0) == 1)
+               else if (sscanf(lines[i], "reset c[%i]%n", &q0, &matchedCount) == 1)
                {
                        if (bitCount == 0xFF)
                        {
@@ -1119,12 +1132,14 @@ void process(int argc, char** argv)
                }
                else if (strcmp(lines[i], "reset") == 0)
                {
+                       matchedCount = lineLen;
                        instr = realloc(instr, (instrLen + 1) * sizeof(QInstr));
                        strcpy(instr[instrLen].n, "reset_all");
                        instrLen++;
                }
                else if (strcmp(lines[i], "barrier q") == 0)
                {
+                       matchedCount = lineLen;
                        if (qubitCount == 0xFF)
                        {
                                fprintf(stderr, "QAnsel: Qubit instruction used before initialization");
@@ -1135,7 +1150,7 @@ void process(int argc, char** argv)
                        //  optimizations that this instruction
                        //  would prevent
                }
-               else if (sscanf(lines[i], "barrier q[%i]", &q0) == 1)
+               else if (sscanf(lines[i], "barrier q[%i]%n", &q0, &matchedCount) == 1)
                {
                        if (qubitCount == 0xFF || bitCount == 0xFF)
                        {
@@ -1153,7 +1168,7 @@ void process(int argc, char** argv)
                        //  optimizations that this instruction
                        //  would prevent
                }
-               else if (sscanf(lines[i], "hvar %f", &a0) == 1)
+               else if (sscanf(lines[i], "hvar %f%n", &a0, &matchedCount) == 1)
                {
                        instr = realloc(instr, (instrLen + 1) * sizeof(QInstr));
                        strcpy(instr[instrLen].n, "hvar");
@@ -1161,12 +1176,14 @@ void process(int argc, char** argv)
                }
                else if (strcmp(lines[i], "rand") == 0)
                {
+                       matchedCount = lineLen;
                        instr = realloc(instr, (instrLen + 1) * sizeof(QInstr));
                        strcpy(instr[instrLen].n, "rand");
                        instrLen++;
                }
                else if (strcmp(lines[i], "sample") == 0 || strcmp(lines[i], "sample c") == 0)
                {
+                       matchedCount = lineLen;
                        if (i != linesLen - 1)
                        {
                                fprintf(stderr, "QAnsel: Sampling should be performed at the end of the program;");
@@ -1181,7 +1198,7 @@ void process(int argc, char** argv)
                        }
                        fullSample = 255;
                }
-               else if (sscanf(lines[i], "sample c[%i]", &q0) == 1)
+               else if (sscanf(lines[i], "sample c[%i]%n", &q0, &matchedCount) == 1)
                {
                        if (i != linesLen - 1)
                        {
@@ -1203,6 +1220,14 @@ void process(int argc, char** argv)
                        errFound = 1;
                        break;
                }
+               printf(">%s: %i;%i<\n", lines[i], strlen(lines[i]), matchedCount);
+               if (lineLen != matchedCount)
+               {
+                       fprintf(stderr, "QAnsel: Invalid trailing text");
+                       errFound = 1;
+                       break;
+               }
+
        }
 
        for (uint32_t i = 0; i < linesLen; i++) free(lines[i]);