int do_add (int argc, char **argv) { int ret = -1; struct in6_addr sid; if (argc < 5) { printf ("Command line is not complete.\n"); goto end; } if (inet_pton (AF_INET6, argv[3], &sid) != 1) { printf ("Error: inet6 prefix is expected rather than \"%s\".\n", argv[3]); goto end; } params.sid = argv[3]; params.func = argv[4]; if (strcmp (argv[4], END) == 0) ret = add_end (argc, argv); else if (strcmp (argv[4], END_DX2) == 0) ret = add_end_dx2 (argc, argv); else if ((strcmp (argv[4], END_X) == 0) || (strcmp (argv[4], END_DX6) == 0)) ret = add_end_x (argc, argv); else if (strcmp (argv[4], END_DX4) == 0) ret = add_end_dx4 (argc, argv); else if ((strcmp (argv[4], END_AD4) == 0) || (strcmp (argv[4], END_EAD4) == 0)) ret = add_end_ad4 (argc, argv); else if ((strcmp (argv[4], END_AM) == 0) || (strcmp (argv[4], END_AD6) == 0) || (strcmp (argv[4], END_EAD6) == 0)) ret = add_end_ad6 (argc, argv); else if (strcmp (argv[4], END_AS4) == 0) ret = add_end_as4 (argc, argv); else if (strcmp (argv[4], END_AS6) == 0) ret = add_end_as6 (argc, argv); else printf ("SRv6 behavior \"%s\" is not supported\n", argv[4]); end: return ret; }
static void decompile_match_like(std::ostringstream &out, const char *name, ehval_p *paras, int level) { out << name << " " << paras[0]->decompile(level); for(ehval_p node = paras[1]; node->get<Enum_Instance>()->member_id != T_END; node = node->get<Enum_Instance>()->members[1]) { out << "\n"; add_tabs(out, level + 1); Enum_Instance::t *inner_op = node->get<Enum_Instance>()->members[0]->get<Enum_Instance>(); out << "case " << inner_op->members[0]->decompile(level + 1) << "\n"; add_tabs(out, level + 2); out << inner_op->members[1]->decompile(level + 2); } add_end(out, level); }
/*---------------------------------------------------------------------------*/ static void send_discover(void) { uint8_t *end; struct dhcp_msg *m = (struct dhcp_msg *)uip_appdata; create_msg(m); end = add_msg_type(&m->options[4], DHCPDISCOVER); end = add_req_options(end); end = add_end(end); uip_send(uip_appdata, end - (uint8_t *)uip_appdata); }
static void send_discover(void) { uint8_t *end; struct dhcp_msg *m = (struct dhcp_msg *)&dhcp_msg_buf; create_msg(m); end = add_msg_type(&m->options[4], DHCPDISCOVER); end = add_req_options(end); end = add_end(end); uosFileWrite(s.conn, (void*)m, end - (uint8_t*)m); }
static void send_request (void) { u8_t *end; dhcpMsg_t *m = (dhcpMsg_t *) uip_appdata; create_msg (m); end = add_msg_type (&m->options [4], DHCPREQUEST); end = add_server_id (end); end = add_req_ipaddr (end); end = add_end (end); uip_send (uip_appdata, end - (u8_t *) uip_appdata); }
/*---------------------------------------------------------------------------*/ static void send_request(void) { uint8_t *end; struct dhcp_msg *m = (struct dhcp_msg *)uip_appdata; create_msg(m); end = add_msg_type(&m->options[4], DHCPREQUEST); end = add_server_id(end); end = add_req_ipaddr(end); end = add_end(end); uip_send(uip_appdata, (int)(end - (uint8_t *)uip_appdata)); }
/*---------------------------------------------------------------------------*/ static void send_request(void) { uint8_t *end; struct dhcp_msg *m = (struct dhcp_msg *)&dhcp_msg_buf; create_msg(m); end = add_msg_type(&m->options[4], DHCPREQUEST); end = add_server_id(end); end = add_req_ipaddr(end); end = add_end(end); uosFileWrite(s.conn, (void*)m, end - (uint8_t*)m); }
main() { char ch; B *headptr=0; int node=0; do { add_end(&headptr); printf("do you want to add new node at end..Y/y\n"); scanf(" %c",&ch); node++; }while((ch=='Y')||(ch=='y')); print(headptr); printf("Total node=%d",node); }
static void make_list_item(char *str, t_pipe **start) { if (str[0] == ';') add_end(str, 0, SEMICOL, start); else if (str[0] == '>' && str[1] == '>') add_end(str, 3, DB_AR_RIGHT, start); else if (str[0] == '|' && str[1] == '|') add_end(str, 1, OR, start); else if (str[0] == '&' && str[1] == '&') add_end(str, 1, AND, start); else if (str[0] == '>') add_end(str, 3, AR_RIGHT, start); else if (str[0] == '<' && str[1] == '<') add_end(str, 3, DB_AR_LEFT, start); else if (str[0] == '<') add_end(str, 3, AR_LEFT, start); else if (str[0] == '|' && str[1] == '\0') add_end(str, 2, PIPE, start); else add_end(str, 4, COM, start); }
/*---------------------------------------------------------------------------*/ static void send_request(void) { u8_t *end; struct dhcp_msg *m = (struct dhcp_msg *)uip_appdata; create_msg(m); end = add_msg_type(&m->options[4], DHCPREQUEST); end = add_server_id(end); end = add_req_ipaddr(end); end = add_req_host_name(end, HOSTNAME); end = add_end(end); uip_send(uip_appdata, end - (u8_t *)uip_appdata); }
GeomTextDataViewer(BinaryDataEditor *owner, bool read_only) : BinaryDataViewer(owner), _text(mforms::VerticalScrollBar) { set_spacing(8); add(&_selector, false, true); add_end(&_text, true, true); _text.set_read_only(read_only && false); //TODO: data editing (need to figure out a way to send WKT data to the server when saving) _selector.add_item("View as WKT"); _selector.add_item("View as GeoJSON"); _selector.add_item("View as GML"); _selector.add_item("View as KML"); _selector.signal_changed()->connect(boost::bind(&GeomTextDataViewer::data_changed, this)); }
t_list *put_in_list(t_var *var) { t_list *list; int i; i = 0; list = NULL; while (var->land[i] != NULL) { list = add_end(list, var->land[i]); i++; } while (list->first != 1) list = list->next; return (list); }
ObjectSelectionPage::ObjectSelectionPage(WbPluginDbImport *form) : WizardObjectFilterPage(form, "objectFilter"), _box(false) { set_title(_("Select Objects to Reverse Engineer")); set_short_title(_("Select Objects")); _box.set_padding(12); add_end(&_box, false); _empty_label.set_text(_("The selected schemas contain no objects.")); _box.add(&_empty_label, false); _autoplace_check.set_text(_("Place imported objects on a diagram")); _autoplace_check.set_active(true); _box.add(&_autoplace_check, false); }
int main(int argc, char **argv) { t_lists lists; int i; i = 1; if (argc == 1) { ft_putendl("non"); return (0); } while (argv[i++]) lists = add_head(&lists, argv[i]); lists = add_end(&lists, "end list"); print_list(&lists); return (0); }
TextDataViewer(BinaryDataEditor *owner, const std::string &encoding, bool read_only) : BinaryDataViewer(owner), _text(), _encoding(encoding) { if (_encoding.empty()) _encoding = "UTF-8"; add(&_message, false, true); add_end(&_text, true, true); _text.set_language(mforms::LanguageNone); _text.set_features(mforms::FeatureWrapText, true); _text.set_features(mforms::FeatureReadOnly, read_only); scoped_connect(_text.signal_changed(),boost::bind(&TextDataViewer::edited, this)); _text.set_show_find_panel_callback(boost::bind(&TextDataViewer::embed_find_panel, this, _2)); }
void add(list **start, list **end) // add some new item in the end list { int val; int fl = 0; cout << " ###############################################################" << endl; cout << " # ADD NEW ITEM IN THE LIST #" << endl; cout << " # FOR EXIT PRESS 0 #" << endl; cout << " ###############################################################" << endl; val = scan_data(); if (*end == NULL) { first_item(start, end); } while (val) { add_end(end, val); val = scan_data(); } // while }
void dhcpdPollHandler(void) { if (dhcpd_state == DHCPD_IDLE) return; printf("<<dhcp poll>> "); struct dhcp_msg *m = (struct dhcp_msg *)uip_appdata; memcpy(m,(uint8_t*) &dhcp_header,sizeof(dhcp_header)); m->op = DHCP_REPLY; //uip_ipaddr_t ipaddr; //uip_ipaddr( m->yiaddr, 192, 168, 12, 2); uip_ipaddr_copy(m->yiaddr,dhcpd_client_ipaddr); memset(m->ciaddr,0,4); //memset(m->siaddr,0,4); uip_ipaddr_copy(m->siaddr,uip_hostaddr); memcpy(m->options, magic_cookie, sizeof(magic_cookie)); u8_t *end; switch (dhcpd_state) { case DHCPD_SEND_OFFER: end = add_msg_type(&m->options[4], DHCPOFFER); break; case DHCPD_SEND_ACK: end = add_msg_type(&m->options[4], DHCPACK); dhcpd_address_assigned(); // notify the rest of teh system break; default: return; } //end = add_subnetmask(end, 255,255,255,0); end = add_subnetmask(end, 255,255,255, 0xfc); // a /30 address end = add_lease_time(end); end = add_server_id_myself(end); //end = add_dns_server_myself(end); //end = add_domain_name(end); end = add_end(end); uip_send(uip_appdata, end - (u8_t *)uip_appdata); dhcpd_state = DHCPD_IDLE; }
/* Prepare DHCPv4 Message request and send it to peer */ static void send_request(struct net_if *iface, bool renewal) { struct net_buf *buf; buf = prepare_message(iface, DHCPV4_MSG_TYPE_REQUEST); if (!buf) { goto fail; } if (!add_server_id(buf) || !add_req_ipaddr(buf) || !add_end(buf)) { goto fail; } setup_header(buf); if (net_send_data(buf) < 0) { goto fail; } if (renewal) { iface->dhcpv4.state = NET_DHCPV4_RENEWAL; } else { iface->dhcpv4.state = NET_DHCPV4_REQUEST; } iface->dhcpv4.attempts++; k_delayed_work_init(&iface->dhcpv4_timeout, dhcpv4_timeout); k_delayed_work_submit(&iface->dhcpv4_timeout, get_dhcpv4_timeout()); return; fail: NET_DBG("Message preparation failed"); if (!buf) { net_nbuf_unref(buf); } }
int main() { Node *head=NULL; int iRetCode=eFailed; iRetCode = add_begin(&head,11); LOG_CHECK_ERROR(iRetCode); iRetCode = add_begin(&head,22); LOG_CHECK_ERROR(iRetCode); iRetCode = add_begin(&head,33); LOG_CHECK_ERROR(iRetCode); iRetCode = add_end(&head,44); LOG_CHECK_ERROR(iRetCode); print(head); Reverse_list(&head); print(head); Exit0: return 0; }
int main(void) { AddressBook *myabook; myabook = new_item("*****@*****.**", "foo", 1); /* Con la chiamata alla funzione add_front(), il nuovo elemento andra' in testa alla lista */ myabook = add_front(myabook, new_item("*****@*****.**", "bar", 2)); /* Con la chiamata alla funzione add_end(), il nuovo elemento andra' in coda alla lista */ myabook = add_end(myabook, new_item("*****@*****.**", "baz", 3)); // Stampa ciascun elemento della rubrica apply(myabook, print_values, "%d: <%s> \'%s\'\n"); // Quanti elementi contiene la rubrica int n = 0; apply(myabook, count_elements, &n); printf("AddressBook contains \'%d\' elements\n", n); return(EXIT_SUCCESS); }
/* Prepare DHCPv4 Discover message and broadcast it */ static void send_discover(struct net_if *iface) { struct net_buf *buf; iface->dhcpv4.xid++; buf = prepare_message(iface, DHCPV4_MSG_TYPE_DISCOVER); if (!buf) { goto fail; } if (!add_req_options(buf) || !add_end(buf)) { goto fail; } setup_header(buf); if (net_send_data(buf) < 0) { goto fail; } iface->dhcpv4.state = NET_DHCPV4_DISCOVER; k_delayed_work_init(&iface->dhcpv4_timeout, dhcpv4_timeout); k_delayed_work_submit(&iface->dhcpv4_timeout, get_dhcpv4_timeout()); return; fail: NET_DBG("Message preparation failed"); if (!buf) { net_nbuf_unref(buf); } }
int main() { node_t head = NULL; node_t first = NULL; node_t second = NULL; node_t merged = NULL; int choice = 0; int ele; int pos; node_t node_pointer = NULL; int n; int is_cycle = 0; node_t list_cycle = NULL; int isPalindrome = 0; int intersection = 0; node_t resultant_of_addition = NULL; int k = 0; int m; while(1) { printf("--------------------------------------------------------------------------------------------------------\n"); printf("1. Add node in the front end \n"); printf("2. Display the list \n"); printf("3. Exit \n"); printf("4. Add node at the rear end of the list \n"); printf("5. Delete a node at the front end of the list \n"); printf("6. Delete a node from the rear end of the list \n"); printf("7. Insert a node in order to the list \n"); printf("8. Merge two ordered linked lists \n"); printf("9. Search for an item in the list \n"); printf("10. Delete a node whose value is specified \n"); printf("11. Delete a node at the specified position \n"); printf("12. Reverse list wihtout creating extra nodes \n"); printf("13. Delete a node given only a pointer to the node \n"); printf("14. Print middle element of the list \n"); printf("15. Print the nth last element in the list \n"); printf("16. Delete the entire list \n"); printf("17. Detect a loop in the list \n"); printf("18. Check whether a list is a palindrome \n"); printf("19. Find the intersection of two lists \n"); printf("20. Print reverse recursively \n"); printf("21. Remove duplicates in a sorted linked list \n"); printf("22. Move the last node in the list to the first node \n"); printf("23. Reverse the list pairwise \n"); printf("24. Find the intersection of two lists recursively \n"); printf("25. Delete alternate nodes in the list \n"); printf("26. Alternating split of the list \n"); printf("27. Delete nodes whose neighbours value is greater \n"); printf("28. Sepearate into even and odd in that order \n"); printf("29. Add two lists and give the resultant list \n"); printf("30. Rotate the list by k elements \n"); printf("31. Separate into 0s and 1s \n"); printf("32. Delete n nodes after the first m nodes \n"); printf("-------------------------------------------------------------------------------------------------------\n"); printf("Enter the choice\n"); scanf("%d", &choice); switch(choice) { case 1: printf("Enter the element to enter to the front end of the list \n"); scanf("%d", &ele); head = add_front(head, ele); break; case 2: display(head); break; case 3: exit(0); case 4: printf("Enter an element to be added to the end of the list \n"); scanf("%d", &ele); head = add_end(head, ele); break; case 5: head = delete_front(head); break; case 6: head = delete_rear(head); break; case 7: printf("Enter the element to be inserted \n"); scanf("%d", &ele); head = insert_in_order(head, ele); break; case 8: first = insert_in_order(first, 92); first = insert_in_order(first, 42); first = insert_in_order(first, 35); second = insert_in_order(second, 100); second = insert_in_order(second, 432); second = insert_in_order(second, 90); second = insert_in_order(second, 10); printf("The elements of the first list are: \n"); display(first); printf("The elements of the second list are \n"); display(second); merged = merge_ordered_lists(first, second); printf("The ordered list is: \n"); display(merged); case 9: printf("Enter the element of the list to be searched for \n"); scanf("%d", &ele); int pos = search(head, ele); if(pos != -1) { printf("The element is found at %d: \n", pos); } else { printf("The element is not found in the list \n"); } break; case 10: printf("Enter the element of the list to be deleted: \n"); scanf("%d", &ele); head = delete_with_info(head, ele); if(head == (node_t)NULL) { printf("The list is empty or the element u specified is not found: \n"); } break; case 11: printf("Enter the position with the first node as position 1 \n"); scanf("%d", &ele); head = delete_with_pos(head, ele); if(head == (node_t)NULL) { printf("Either the list is empty or the position specified is not appropriate \n"); } break; case 12: head = reverse(head); break; case 13: node_pointer = head -> link -> link; delete_node_given_pointer(node_pointer); break; case 14: print_middle(head); break; case 15: printf("Enter the value of n \n"); scanf("%d",&n); print_nth_last(head, n); break; case 16: head = delete_list(head); break; case 17: list_cycle = add_end(list_cycle,1); list_cycle = add_end(list_cycle,2); list_cycle = add_end(list_cycle,3); list_cycle = add_end(list_cycle,4); list_cycle = add_end(list_cycle,5); list_cycle -> link -> link -> link -> link -> link = list_cycle -> link; is_cycle = find_cycle(list_cycle); if(is_cycle) { printf("There is a cycle in the list \n"); } else { printf("There is no cycle in the list \n"); } break; case 18: isPalindrome = is_palindrome(&head, head); if(isPalindrome) { printf("The list is a palindrome \n"); } else { printf("The list is not a palindrome \n"); } break; case 19: first = add_end(first,10); first = add_end(first,20); second = add_end(second,43); second = add_end(second,3); second = add_end(second,34); second = add_end(second,44); first -> link -> link = second -> link; intersection = find_intersection(first, second); printf("The intersection point of the two lists are %d \n", intersection); break; case 20: print_reverse_recursively(head); printf("\n"); break; case 21: remove_duplicates(head); break; case 22: head = move_last_to_first(head); break; case 23: head = pairwise_reverse(head); break; case 24: first = add_end(first, 10); first = add_end(first, 30); first = add_end(first, 40); first = add_end(first, 50); first = add_end(first, 60); second = add_end(second, 10); second = add_end(second, 20); second = add_end(second, 30); find_common_recursively(first, second); break; case 25: head = delete_alternate(head); break; case 26: alternating_split_v2(head); break; case 27: head = delete_node_when_neigbour_higher(head); break; case 28: head = separate_into_even_odd_v2(head); break; case 29: first = add_front(first, 2); first = add_front(first, 4); first = add_front(first, 8); second = add_front(second,2); second = add_front(second,4); second = add_front(second,5); second = add_front(second,3); resultant_of_addition = add_two_lists(first, second); printf("The resultant list is as follows \n"); display(resultant_of_addition); break; case 30: printf("Enter the value of k \n"); scanf("%d",&k); head = rotate_by_k(head, k); break; case 31: head = separate_into_zeroes_ones(head); break; case 32: printf("Enter the value of m \n"); scanf("%d", &m); printf("Enter the value of n \n"); scanf("%d", &n); head = retain_m_delte_n(head, m , n); break; default: printf("Invalid choice... Please try again \n"); break; } } }
static void ICACHE_FLASH_ATTR send_ack(struct dhcps_msg *m) { u8_t *end; struct pbuf *p, *q; u8_t *data; u16_t cnt=0; u16_t i; create_msg(m); end = add_msg_type(&m->options[4], DHCPACK); end = add_offer_options(end); end = add_end(end); p = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcps_msg), PBUF_RAM); #if DHCPS_DEBUG os_printf("udhcp: send_ack>>p->ref = %d\n", p->ref); #endif if(p != NULL){ #if DHCPS_DEBUG os_printf("dhcps: send_ack>>pbuf_alloc succeed\n"); os_printf("dhcps: send_ack>>p->tot_len = %d\n", p->tot_len); os_printf("dhcps: send_ack>>p->len = %d\n", p->len); #endif q = p; while(q != NULL){ data = (u8_t *)q->payload; for(i=0; i<q->len; i++) { data[i] = ((u8_t *) m)[cnt++]; #if DHCPS_DEBUG os_printf("%02x ",data[i]); if((i+1)%16 == 0){ os_printf("\n"); } #endif } q = q->next; } }else{ #if DHCPS_DEBUG os_printf("dhcps: send_ack>>pbuf_alloc failed\n"); #endif return; } #if DHCPS_DEBUG err_t SendAck_err_t = udp_sendto( pcb_dhcps, p, &broadcast_dhcps, DHCPS_CLIENT_PORT ); os_printf("dhcps: send_ack>>udp_sendto result %x\n",SendAck_err_t); #else udp_sendto( pcb_dhcps, p, &broadcast_dhcps, DHCPS_CLIENT_PORT ); #endif if(p->ref != 0){ #if DHCPS_DEBUG os_printf("udhcp: send_ack>>free pbuf\n"); #endif pbuf_free(p); } }
int main(void) { //struct list_node *list,*list2; struct list_node *list; list=NULL; print(list); printf("1\n"); add_beg(&list,1); print(list); remove_beg(&list); print(list); printf("2\n"); add_end(&list,1); print(list); remove_beg(&list); print(list); printf("3\n"); add_beg(&list,1); print(list); remove_beg(&list); //remove_end(&list); print(list); printf("4\n"); add_end(&list,1); print(list); remove_beg(&list); //remove_end(&list); print(list); printf("5\n"); add_beg(&list,1); print(list); add_beg(&list,2); print(list); remove_beg(&list); print(list); remove_beg(&list); print(list); printf("6\n"); add_end(&list,1); print(list); add_end(&list,3); print(list); add_beg(&list,1); print(list); remove_beg(&list); print(list); remove_end(&list); print(list); add_end(&list,3); print(list); remove_end(&list); print(list); add_end(&list,3); print(list); remove_beg(&list); print(list); remove_end(&list); print(list); remove_end(&list); print(list); remove_beg(&list); print(list); return 0; }
node_t insert_in_table(node_t head, int ele) { head = add_end(head, ele); return head; }
static void dhcpdHandlePacket(void) { struct dhcp_msg *m = (struct dhcp_msg *)uip_appdata; if (!ipaddr_set) { uip_ipaddr( ipaddr, 10, 200, 0, 1); uip_ipaddr( dhcpd_client_ipaddr, 10, 200, 0, 2); uip_ipaddr( dhcpd_broadcast_ipaddr, 10, 200, 0, 3); uip_sethostaddr(ipaddr); ipaddr_set = 1; } printf("This is a DHCP broadcast op=%d ",m->op); if (m->op == DHCP_REQUEST) { //printf("xid = %02x %02x %02x %02x ",(m->xid)[0],(m->xid)[1],(m->xid)[2],(m->xid)[3]); //printf("secs = %02x ",m->secs); //printf("flags (bc?) = %02x ",m->flags); if (memcmp(m->options,magic_cookie,4)==0) printf("found magic cookie "); else { printf("magic cookie missing! "); return; } int type = parse_options(&m->options[4], uip_datalen()); //printf("DHCP message type %d ",type); if (type == DHCPDISCOVER) { printf("<<discover>> "); memcpy((uint8_t*) &dhcp_header,m,sizeof(dhcp_header)); dhcpd_state = DHCPD_SEND_OFFER; udp_poll_request = 1; return; m->op = DHCP_REPLY; uip_ipaddr_t ipaddr; //uip_ipaddr( m->yiaddr, 192, 168, 12, 2); uip_ipaddr_copy(m->yiaddr,dhcpd_client_ipaddr); memset(m->ciaddr,0,4); //memset(m->siaddr,0,4); uip_ipaddr_copy(m->siaddr,uip_hostaddr); u8_t *end; end = add_msg_type(&m->options[4], DHCPOFFER); //end = add_subnetmask(end, 255,255,255,0); end = add_subnetmask(end, 255,255,255, 0xfc); // a /30 address end = add_lease_time(end); end = add_server_id_myself(end); //end = add_dns_server_myself(end); //end = add_domain_name(end); end = add_end(end); uip_send(uip_appdata, end - (u8_t *)uip_appdata); } if (type == DHCPREQUEST) { printf("<<request>> "); memcpy((uint8_t*) &dhcp_header,m,sizeof(dhcp_header)); dhcpd_state = DHCPD_SEND_ACK; udp_poll_request = 1; return; m->op = DHCP_REPLY; uip_ipaddr_t ipaddr; //uip_ipaddr( m->yiaddr, 192, 168, 12, 2); uip_ipaddr_copy(m->yiaddr,dhcpd_client_ipaddr); memset(m->ciaddr,0,4); //memset(m->siaddr,0,4); uip_ipaddr_copy(m->siaddr,uip_hostaddr); u8_t *end; end = add_msg_type(&m->options[4], DHCPACK); //end = add_subnetmask(end, 255,255,255,0); //end = add_subnetmask(end, 255,255,255, 0xfC); // a /30 address //end = add_subnetmask(end, 255,255,255, 0xfe); // a /31 address end = add_subnetmask(end, 255,255,255, 0xfc); // a /30 address end = add_lease_time(end); end = add_server_id_myself(end); //end = add_dns_server_myself(end); //end = add_domain_name(end); end = add_end(end); uip_send(uip_appdata, end - (u8_t *)uip_appdata); dhcpd_address_assigned(); // notify the rest of teh system } } }
std::string Node::decompile(int level) const { std::ostringstream out; const Node *op = this; if(op == nullptr) { return ""; } switch(op->member_id) { case T_LITERAL: out << op->members[0]->decompile(level); break; case T_NULL: out << "()"; break; case T_ANYTHING: out << "_"; break; case T_ASSIGN: out << op->members[0]->decompile(level) << " = " << op->members[1]->decompile(level); break; case T_ADD: out << op->members[0]->decompile(level) << " + " << op->members[1]->decompile(level); break; case T_SUBTRACT: out << op->members[0]->decompile(level) << " - " << op->members[1]->decompile(level); break; case T_MULTIPLY: out << op->members[0]->decompile(level) << " * " << op->members[1]->decompile(level); break; case T_DIVIDE: out << op->members[0]->decompile(level) << " / " << op->members[1]->decompile(level); break; case T_MODULO: out << op->members[0]->decompile(level) << " % " << op->members[1]->decompile(level); break; case T_GREATER: out << op->members[0]->decompile(level) << " > " << op->members[1]->decompile(level); break; case T_BAR: out << op->members[0]->decompile(level) << " | " << op->members[1]->decompile(level); break; case T_COMMA: case T_MIXED_TUPLE: out << op->members[0]->decompile(level) << ", " << op->members[1]->decompile(level); break; case T_ACCESS: out << op->members[0]->decompile(level) << "." << op->members[1]->get<String>(); break; case T_CALL_METHOD: out << op->members[0]->decompile(level) << "." << op->members[1]->get<String>() << "(" << op->members[2]->decompile(level) << ")"; break; case T_CALL: out << op->members[0]->decompile(level) << " " << op->members[1]->decompile(level); break; case T_NOT: out << "!" << op->members[0]->decompile(level); break; case T_BINARY_COMPLEMENT: out << "~" << op->members[0]->decompile(level); break; case T_NAMED_ARGUMENT: out << op->members[0]->get<String>() << ": " << op->members[1]->decompile(level); break; case T_VARIABLE: out << op->members[0]->get<String>(); break; case T_GROUPING: out << '(' << op->members[0]->decompile(level) << ')'; break; case T_RANGE: out << op->members[0]->decompile(level) << " .. " << op->members[1]->decompile(level); break; case T_ARROW: // no space out << op->members[0]->decompile(level) << "->" << op->members[1]->decompile(level); break; case T_AND: out << op->members[0]->decompile(level) << " && " << op->members[1]->decompile(level); break; case T_OR: out << op->members[0]->decompile(level) << " || " << op->members[1]->decompile(level); break; case T_XOR: out << op->members[0]->decompile(level) << " ^^ " << op->members[1]->decompile(level); break; case T_SEPARATOR: { out << op->members[0]->decompile(level); ehval_p r = op->members[1]; if(!Node::is_a(r) || r->get<Enum_Instance>()->member_id != T_SEPARATOR || r->get<Enum_Instance>()->member_id != T_END) { out << "\n"; add_tabs(out, level); out << op->members[1]->decompile(level); } break; } case T_END: // ignore, used to end lists break; case T_THIS: out << "this"; break; case T_SCOPE: out << "scope"; break; case T_RET: out << "ret " << op->members[0]->decompile(level); break; case T_CLASS_MEMBER: out << op->members[0]->decompile(level) << op->members[1]->decompile(level); break; case T_ATTRIBUTE: out << op->members[0]->decompile(level) << " " << op->members[1]->decompile(level); break; case T_IF: decompile_if(out, op->members, level); add_end(out, level); break; case T_IF_ELSE: decompile_if(out, op->members, level); out << "\n"; add_tabs(out, level); out << "else\n"; add_tabs(out, level + 1); out << op->members[3]->decompile(level + 1); add_end(out, level); break; case T_WHILE: out << "while " << op->members[0]->decompile(level) << "\n"; add_tabs(out, level + 1); out << op->members[1]->decompile(level + 1); add_end(out, level); break; case T_TRY: decompile_try_catch(out, op->members, level); add_end(out, level); break; case T_TRY_FINALLY: decompile_try_catch(out, op->members, level); out << "\n"; add_tabs(out, level); out << "finally\n"; add_tabs(out, level + 1); out << op->members[2]->decompile(level + 1); add_end(out, level); break; case T_NAMED_CLASS: out << "class " << op->members[0]->get<String>() << "\n"; add_tabs(out, level + 1); out << op->members[1]->decompile(level + 1); add_end(out, level); break; case T_ENUM: out << "enum " << op->members[0]->get<String>() << "\n"; add_tabs(out, level + 1); // decompile member list for(ehval_p node = op->members[1]; ; node = node->get<Enum_Instance>()->members[1]) { ehval_p current_member; bool is_last; if(node->get<Enum_Instance>()->member_id == T_COMMA) { current_member = node->get<Enum_Instance>()->members[0]; is_last = false; } else { current_member = node; is_last = true; } // handle the member out << current_member->get<Enum_Instance>()->members[0]->get<String>(); if(current_member->get<Enum_Instance>()->member_id == T_ENUM_WITH_ARGUMENTS) { out << "("; for(ehval_p argument = current_member->get<Enum_Instance>()->members[1]; ; argument = argument->get<Enum_Instance>()->members[1]) { ehval_p name = Node::is_a(argument) ? ehval_p(argument->get<Enum_Instance>()->members[0]) : argument; out << name->get<String>(); if(!Node::is_a(argument) || argument->get<Enum_Instance>()->member_id != T_COMMA) { break; } else { out << ", "; } } out << ")"; } if(is_last) { break; } else { out << ", "; } } out << "\n"; add_tabs(out, level + 1); // decompile code out << op->members[2]->decompile(level + 1); add_end(out, level); break; case T_CLASS: out << "class\n"; add_tabs(out, level + 1); out << op->members[0]->decompile(level + 1); add_end(out, level); break; case T_FUNC: out << "func: " << op->members[0]->decompile(level) << "\n"; add_tabs(out, level + 1); out << op->members[1]->decompile(level + 1); add_end(out, level); break; case T_MATCH: decompile_match_like(out, "match", op->members, level); break; case T_FOR: out << "for " << op->members[0]->decompile(level) << "\n"; add_tabs(out, level + 1); out << op->members[1]->decompile(level + 1); add_end(out, level); break; case T_FOR_IN: out << "for " << op->members[0]->decompile(level) << " in " << op->members[1]->decompile(level) << "\n"; add_tabs(out, level + 1); out << op->members[2]->decompile(level + 1); add_end(out, level); break; case T_ARRAY_LITERAL: out << "["; for(ehval_p n = op->members[0]; n->get<Enum_Instance>()->member_id != T_END; n = n->get<Enum_Instance>()->members[1]) { Enum_Instance::t *member_op = n->get<Enum_Instance>()->members[0]->get<Enum_Instance>(); out << member_op->members[0]->decompile(level); if(member_op->member_id == T_ARRAY_MEMBER) { out << " => " << member_op->members[1]->decompile(level); } if(n->get<Enum_Instance>()->members[1]->get<Enum_Instance>()->member_id != T_END) { out << ", "; } } out << "]"; break; case T_MATCH_SET: out << "@"; out << op->members[0]->get<String>(); break; case T_HASH_LITERAL: out << "{"; for(ehval_p n = op->members[0]; n->get<Enum_Instance>()->member_id != T_END; n = n->get<Enum_Instance>()->members[1]) { Enum_Instance::t *member_op = n->get<Enum_Instance>()->members[0]->get<Enum_Instance>(); out << member_op->members[0]->decompile(level); out << ": " << member_op->members[1]->decompile(level); if(n->get<Enum_Instance>()->members[1]->get<Enum_Instance>()->member_id != T_END) { out << ", "; } } out << "}"; break; case T_COMMAND: out << "$" << op->members[0]->get<String>(); for(ehval_p node = op->members[1]; node->get<Enum_Instance>()->member_id != T_END; node = node->get<Enum_Instance>()->members[1]) { Enum_Instance::t *node2 = node->get<Enum_Instance>()->members[0]->get<Enum_Instance>(); switch(node2->member_id) { case T_SHORTPARA: out << " -" << node2->members[0]->decompile(level); out << "=" << node2->members[1]->decompile(level); break; case T_LONGPARA: out << " --" << node2->members[0]->decompile(level); out << "=" << node2->members[1]->decompile(level); break; default: out << " " << node->get<Enum_Instance>()->members[0]->decompile(level); break; } } out << "\n"; break; default: out << "(cannot decode value: " << op->member_id << ")"; break; } return out.str(); }