/* user.c */ #include "main.h" #include "message.h" #include "process.h" #include "program.h" #include "scheduler.h" #include "string.h" #include "tty3.h" #include "user.h" void lcd() { int id = get_running(); int pid = id + 1; char str[MAX_STR_LEN]; char lcd_string[MAX_STR_LEN]; string_memcpy(str, PCB_list[id].arg_1); int index = -8; while (1) { sub_string(lcd_string, str, index, 8); display_word(lcd_string); if (index == str_length(str)) { index = -8; } index++; hold(pid); } terminate(pid); } void increment() { int id = get_running(); int max = string_to_int(PCB_list[id].arg_1); int i; for (i = 1; i <= max; i++) { print_int(i); NEWLINE; } terminate(id + 1); } void fibonacci() { int id = get_running(); int max = string_to_int(PCB_list[id].arg_1); int prev = 0; int result = 1; int sum, i; for (i = 0; i < max; i++) { sum = result + prev; prev = result; result = sum; print_int(result); NEWLINE; } terminate(id + 1); } void console() { int id = get_running(); int pid = id + 1; char s[MAX_STR_LEN]; char inputs[3][MAX_STR_LEN]; print_string("CONSOLE"); char argv[2][MAX_STR_LEN]; while (1) { print_string("\nEnter command: "); get_input(pid); string_memcpy(s, PCB_list[id].input); int start = 0; int end = 0; int i = 0; while (1) { if (s[end] == ' ') { sub_string(inputs[i], s, start, end - start); start = end + 1; i++; } else if (s[end] == '\0') { sub_string(inputs[i], s, start, end - start); break; } end++; } if (program_exists(inputs[0])) { string_memcpy(argv[0], inputs[1]); string_memcpy(argv[1], inputs[2]); new_p(inputs[0], argv); hold(pid); } } } void prg_malta() { int id = get_running(); display_word(PCB_list[id].arg_1); terminate(id + 1); } void pgr_ps() { ps(); terminate(get_running() + 1); } void pgr_prio() { int id = get_running(); PCB_list[string_to_int(PCB_list[id].arg_1) - 1].priority = string_to_int(PCB_list[id].arg_2); terminate(id + 1); } void pgr_terminate() { int id = get_running(); terminate(string_to_int(PCB_list[id].arg_1)); terminate(id + 1); } void ring() { int id = get_running(); int pid = id + 1; int nodes = string_to_int(PCB_list[id].arg_1); int i; for (i = 0; i < nodes; i++) { char argv[2][MAX_STR_LEN]; int_to_string(argv[0], i); int_to_string(argv[1], nodes - 1); new_p("node", argv); } send_message("start", 2, pid + 1); terminate(pid); } void node() { int id = get_running(); int pid = id + 1; int node_index = string_to_int(PCB_list[id].arg_1); int last_node = string_to_int(PCB_list[id].arg_2); int messages_received = 0; while(1) { if (receive_message()) { if (!node_index) { if (++messages_received != 2) { send_message("OK!", 1, pid + 1); } else { break; } } else { if (node_index != last_node) { send_message("OK!", 1, pid + 1); } else { send_message("OK!", 1, pid - node_index); } break; } } } terminate(pid); } void super() { int id = get_running(); int pid = id + 1; char args[2][MAX_STR_LEN]; string_memcpy(args[0], "hello"); int child_pid = new_p("lcd", args); int child_id = child_pid - 1; PCB_list[child_id].supervisor_pid = pid; while (PCB_list[child_id].status != CRASHED) { send_message("spam", 1, child_pid); } while (PCB_list[child_id].status == CRASHED) ; terminate(pid); }