void monty_mul_interleaved(z *a, z *b, z *c, z *n) { fp_digit nhat = montyconst.nhat.val[0], u; int i,j,t=n->size; int szb = abs(b->size); fp_digit k; z *t1,*t2; z s1,s2; zInit(&s1); zInit(&s2); t1 = &s1; t2 = &s2; zClear(t1); zClear(t2); for (i=0;i<t;i++) { u = (t1->val[0] + a->val[i] * b->val[0]) * nhat; //truncation will provide mod b /****** short mul of b with ai, simultaneous with addition of A (in t1) ********/ for (j=t1->size;j<szb;j++) t1->val[j] = 0; //zero any unused words up to size of b, so we can add //mul and add up to size of b k=0; for (j=0;j<szb ;j++) spMulAdd(b->val[j],a->val[i],t1->val[j],k,t2->val + j,&k); //continue with add if A has more words for (;j<t1->size;j++) spAdd(t1->val[j],k,t2->val+j,&k); //adjust size if (t1->size > szb) t2->size = t1->size; else t2->size = szb; //account for carry if (k) { t2->val[t2->size]=k; t2->size++; j++; } /****** short mul of b with ai, simultaneous with addition of A (in t1) ********/ /****** short mul of n with u, simultaneous with add. of prev step (in t2) and with right shift of one word ********/ for (;j<t;j++) t2->val[j] = 0; //zero any unused words up to size of n, so we can add //mul and add up to size of n, store into one word previous k=0; //needs first mul to get k set right, answer gets shifted to oblivion spMulAdd(n->val[0],u,t2->val[0],k,t1->val,&k); for (j=1;j<t;j++) spMulAdd(n->val[j],u,t2->val[j],k,t1->val + j - 1,&k); //continue if t2 is bigger than n for (;j<t2->size;j++) spAdd(t2->val[j],k,t1->val+j-1,&k); //adjust size if (t2->size > t) t1->size = t2->size - 1; else t1->size = t - 1; //account for carry if (k) { t1->val[t1->size]=k; t1->size++; } /****** short mul of n with u, simultaneous with add. of prev step (in t2) and with right shift of one word ********/ } //almost done if (zCompare(t1,n) >= 0) zSub(t1,n,c); else zCopy(t1,c); zFree(&s1); zFree(&s2); return; }
int edit_posns (uint32_t * num_ret, SwitchPos ** sp_ret, AppData * a) { MENU *my_menu; SwitchPos *sp = *sp_ret; uint32_t i, maxx; int state = 0; ITEM **my_items; char **mnu_str; // WINDOW * menu_win,*menu_sub; uint32_t num_strings; int lbl_x, idx = 0; uint32_t num = *num_ret; message (a, "Select and press enter to edit. Use d to delete a position or a to add a new one. Use c to cancel and backspace to exit(and store!). Press p to select a preset configuration.\n"); while (state >= 0) { num_strings = num; state = 0; maxx = getmaxx (stdscr); if (num) { debugMsg ("allocating items\n"); my_items = (ITEM **) utlCalloc (num_strings + 1, sizeof (ITEM *)); mnu_str = utlCalloc (num_strings, sizeof (char *)); for (i = 0; i < num_strings; ++i) { mnu_str[i] = utlCalloc (20, sizeof (char)); snprintf (mnu_str[i], 20, "%" PRIu32, i); my_items[i] = new_item (mnu_str[i], mnu_str[i]); if (NULL == my_items[i]) { if (errno == E_BAD_ARGUMENT) errMsg ("badarg i=%" PRIu32 "\n", i); if (errno == E_SYSTEM_ERROR) errMsg ("new_item: syserr i=%" PRIu32 "\n", i); } } my_items[num_strings] = (ITEM *) NULL; my_menu = new_menu ((ITEM **) my_items); set_menu_opts (my_menu, O_ONEVALUE | O_NONCYCLIC | O_ROWMAJOR); appDataMakeMenuWnd (my_menu); lbl_x = 3 + (maxx - 6) / 2 - strlen ("Positions") / 2; mvwprintw (menu_win (my_menu), 1, lbl_x, "%s", "Positions"); post_menu (my_menu); debugMsg ("starting menu loop\n"); wrefresh (menu_win (my_menu)); while (state == 0) { int c; ITEM *selection; c = getch (); switch (c) { case 263: //ESC case K_BACK: //Backspace state = -1; break; case KEY_DOWN: menu_driver (my_menu, REQ_DOWN_ITEM); break; case KEY_UP: menu_driver (my_menu, REQ_UP_ITEM); break; case KEY_RESIZE: //windows need to be resized.. ignore break; case 'd': selection = current_item (my_menu); idx = item_index (selection); state = 1; break; case 'a': state = 2; break; case 'c': state = 3; break; case 'p': state = 4; break; case 13: //enter selection = current_item (my_menu); idx = item_index (selection); state = 5; break; default: break; } wrefresh (menu_win (my_menu)); } unpost_menu (my_menu); appDataDestroyMenuWnd (my_menu); free_menu (my_menu); for (i = 0; i < num_strings; ++i) { free_item (my_items[i]); utlFAN (mnu_str[i]); } utlFAN (mnu_str); utlFAN (my_items); } else { WINDOW *wnd; wnd = appDataMakeEmptyWnd (); wrefresh (wnd); while (state == 0) { int c; c = getch (); switch (c) { case KEY_RESIZE: wnd = appDataResizeEmpty (wnd); break; case 263: //ESC case K_BACK: //Backspace state = -1; break; case 'a': state = 2; break; case 'c': state = 3; break; case 'p': state = 4; break; default: break; } wrefresh (wnd); } assert (ERR != delwin (wnd)); } if (state > 0) { switch (state) { case 1: //del spDel (&sp, &num, idx); break; case 2: //add(at the end) spAdd (&sp, &num, num); break; case 3: //cancel *sp_ret = sp; *num_ret = num; return 1; case 4: //preset sel_preset (&num, &sp, a); break; case 5: //edit edit_pos (sp + idx, a); break; default: break; } } } *sp_ret = sp; *num_ret = num; return 0; }