/** * Compute command */ void command_compute(char* line) { char cmd[MAX_BUFFER]; char key[MAX_BUFFER]; char func[MAX_BUFFER]; char arg1[MAX_BUFFER]; int argc = sscanf(line, "%s %s %s %s", cmd, func, key, arg1); if (argc < 3) { goto invalid; } MATRIX_GUARD(key); uint32_t result = 0; if (strcasecmp(func, "sum") == 0) { result = get_sum(m); } else if (strcasecmp(func, "trace") == 0) { result = get_trace(m); } else if (strcasecmp(func, "minimum") == 0) { result = get_minimum(m); } else if (strcasecmp(func, "maximum") == 0) { result = get_maximum(m); } else if (strcasecmp(func, "frequency") == 0) { result = get_frequency(m, atoll(arg1)); } else { goto invalid; } printf("%" PRIu32 "\n", result); return; invalid: puts("invalid arguments"); }
/** * Show command */ void command_show(char* line) { char cmd[MAX_BUFFER]; char key[MAX_BUFFER]; char func[MAX_BUFFER]; char arg1[MAX_BUFFER]; char arg2[MAX_BUFFER]; int argc = sscanf(line, "%s %s %s %s %s", cmd, key, func, arg1, arg2); if (argc < 2) { goto invalid; } MATRIX_GUARD(key); if (argc == 2) { display(m); return; } const uint32_t v1 = atoll(arg1) - 1; if (v1 >= g_order) { goto invalid; } if (argc == 4 && strcasecmp(func, "row") == 0) { display_row(m, v1); } else if (argc == 4 && strcasecmp(func, "column") == 0) { display_column(m, v1); } else if (argc == 5 && strcasecmp(func, "element") == 0) { const uint32_t v2 = atoll(arg2) - 1; if (v2 >= g_order) { goto invalid; } display_element(m, v1, v2); } return; invalid: puts("invalid arguments"); }
/** * Compute command. */ void command_compute(char* line) { char cmd[MAX_BUFFER]; char key[MAX_BUFFER]; char func[MAX_BUFFER]; char arg1[MAX_BUFFER]; int argc = sscanf(line, "%s %s %s %s", cmd, func, key, arg1); if (argc < 3) { goto invalid; } MATRIX_GUARD(key); float result = 0; if (strcasecmp(func, "sum") == 0) { result = get_sum(m); } else if (strcasecmp(func, "trace") == 0) { result = get_trace(m); } else if (strcasecmp(func, "minimum") == 0) { result = get_minimum(m); } else if (strcasecmp(func, "maximum") == 0) { result = get_maximum(m); } else if (strcasecmp(func, "determinant") == 0) { result = get_determinant(m); } else if (strcasecmp(func, "frequency") == 0) { ssize_t count = get_frequency(m, atof(arg1)); printf("%zu\n", count); return; } else { goto invalid; } printf("%.2f\n", result); return; invalid: puts("invalid arguments"); }
/** * Set command */ void command_set(const char* line) { char cmd[MAX_BUFFER]; char key[MAX_BUFFER]; char func[MAX_BUFFER]; char arg1[MAX_BUFFER]; char arg2[MAX_BUFFER]; int argc = sscanf(line, "%s %s = %s %s %s", cmd, key, func, arg1, arg2); if (argc < 3) { puts("invalid arguments"); return; } uint32_t* matrix = NULL; switch (argc) { case 3: if (strcasecmp(func, "identity") == 0) { matrix = identity_matrix(); } else { goto invalid; } break; case 4: if (strcasecmp(func, "random") == 0) { uint32_t seed = atoll(arg1); matrix = random_matrix(seed); } else if (strcasecmp(func, "uniform") == 0) { uint32_t value = atoll(arg1); matrix = uniform_matrix(value); } else if (strcasecmp(func, "cloned") == 0) { MATRIX_GUARD(arg1); matrix = cloned(m); } else if (strcasecmp(func, "reversed") == 0) { MATRIX_GUARD(arg1); matrix = reversed(m); } else if (strcasecmp(func, "transposed") == 0) { MATRIX_GUARD(arg1); matrix = transposed(m); } else { goto invalid; } break; case 5: if (strcasecmp(func, "sequence") == 0) { uint32_t start = atoll(arg1); uint32_t step = atoll(arg2); matrix = sequence_matrix(start, step); } else if (strcasecmp(func, "scalar#add") == 0) { MATRIX_GUARD(arg1); uint32_t value = atoll(arg2); matrix = scalar_add(m, value); } else if (strcasecmp(func, "scalar#mul") == 0) { MATRIX_GUARD(arg1); uint32_t value = atoll(arg2); matrix = scalar_mul(m, value); } else if (strcasecmp(func, "matrix#add") == 0) { MATRIX_GUARD_PAIR(arg1, arg2); matrix = matrix_add(m1, m2); } else if (strcasecmp(func, "matrix#mul") == 0) { MATRIX_GUARD_PAIR(arg1, arg2); matrix = matrix_mul(m1, m2); } else if (strcasecmp(func, "matrix#pow") == 0) { MATRIX_GUARD(arg1); uint32_t exponent = atoll(arg2); matrix = matrix_pow(m, exponent); } else { goto invalid; } break; } entry* e = find_entry(key); if (e == NULL) { e = add_entry(key); } else { free(e->matrix); } e->matrix = matrix; puts("ok"); return; invalid: puts("invalid arguments"); }