aboutsummaryrefslogtreecommitdiffstats
path: root/qm.c
diff options
context:
space:
mode:
Diffstat (limited to 'qm.c')
-rw-r--r--qm.c122
1 files changed, 122 insertions, 0 deletions
diff --git a/qm.c b/qm.c
new file mode 100644
index 0000000..9c66f8a
--- /dev/null
+++ b/qm.c
@@ -0,0 +1,122 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <stdbool.h>
+#include <string.h>
+#include "qm.h"
+
+#define VALID_VARIABLES "ABCDEFGHIJKLMNOPQRSTUVXYZ"
+
+int main(int argc, char* argv[]) {
+ if (argc != 2) {
+ fprintf(stderr, "Incorrect number of arguments provided.\n");
+ }
+
+ parseDNFStr(argv[1]);
+}
+
+DNF parseDNFStr(const char* inpStr) {
+ //remove whitespace
+ char inpBfr[strlen(inpStr)];
+ int i = 0, j = 0;
+ while (inpStr[i] != '\0') {
+ if (inpStr[i] != ' ') {
+ inpBfr[j++] = inpStr[i];
+ }
+ i++;
+ }
+ inpBfr[j] = '\0';
+
+ DNF dnf;
+ dnf.numTerms = strcnt(inpBfr, '+') + 1;
+
+ //split up, by '+'s
+ const char* delim = "+";
+ char* subStr = strtok(inpBfr, delim);
+ i = 0;
+ while (subStr != NULL) {
+ dnf.terms[i++] = parseDNFTerm(subStr);
+ // printf("term %i: '%s'\n", i, subStr);
+ subStr = strtok(NULL, delim);
+ }
+
+ // printf("%i terms\n", dnf.numTerms);
+ printForm(dnf);
+ printForm2(dnf);
+ return dnf;
+}
+
+DNFTerm parseDNFTerm(const char* termStr) {
+ DNFTerm term;
+ term.numVars = 0;
+ char c;
+ for (int i = 0; i < INT_MAX; i++) {
+ c = termStr[i];
+ if (c == '\0') {
+ break;
+ }
+ if (strcnt(VALID_VARIABLES, c) == 1) {
+ term.vars[term.numVars] = (Variable){c, termStr[i - 1] == '-'};
+ // printf("%i %c\n", term.numVars, term.vars[term.numVars]);
+ term.numVars++;
+ }
+ }
+ return term;
+}
+
+// returns an integer of how many times a char was found in a char
+// array
+unsigned int strcnt(const char* str, const char cnt) {
+ int count = 0;
+ for (int i = 0; i < INT_MAX; i++) {
+ char c = str[i];
+ if (c == '\0') {
+ break;
+ }
+ if (c == cnt) {
+ count++;
+ }
+ }
+ return count;
+}
+
+void printForm(const DNF form) {
+ for (int i = 0; i < form.numTerms; i++) {
+ printf("(");
+ DNFTerm term = form.terms[i];
+
+ for (int j = 0; j < term.numVars; j++) {
+ if (term.vars[j].not_) {
+ printf("¬");
+ }
+ printf("%c", term.vars[j].var);
+ if (term.numVars - 1 != j) {
+ printf("∧");
+ }
+ }
+
+ if (form.numTerms - 1 != i) {
+ printf(") ∨ ");
+ }
+ }
+ printf(")\n");
+}
+
+void printForm2(const DNF form) {
+ for (int i = 0; i < form.numTerms; i++) {
+ DNFTerm term = form.terms[i];
+
+ for (int j = 0; j < term.numVars; j++) {
+ printf("%c", term.vars[j].var);
+ if (term.vars[j].not_) {
+ printf("'");
+ }
+ }
+
+ if (form.numTerms - 1 != i) {
+ printf(" + ");
+ }
+ }
+ printf("\n");
+}
+