From: miha-q <> Date: Mon, 12 Feb 2024 04:10:36 +0000 (-0500) Subject: Sun Feb 11 11:10:36 PM EST 2024 X-Git-Url: http://www.foleosoft.com/?a=commitdiff_plain;h=a5a1b68474cf9a03841a89e4b4aa839c5b1fc1fe;p=QAnsel.git Sun Feb 11 11:10:36 PM EST 2024 --- diff --git a/src/QAnsel.c b/src/QAnsel.c index e7b507b..907e4fd 100644 --- a/src/QAnsel.c +++ b/src/QAnsel.c @@ -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]);