array_t create_array(compare_t fun) { array_t list; __alloc(&list); __priv_alloc(&list->priv); list->add = add; list->add_first = add_first; list->add_last = add_last; list->del = del; list->del_first = del_first; list->del_last = del_last; list->compare = fun; list->copy = copy; list->copy_idx = copy_idx; list->copy_len = copy_len; list->get_index = get_index; list->get_size = get_size; list->get_count = get_count; list->lookup = lookup; list->replace = replace; list->priv->count = 0; list->priv->size = MINSIZE; __set(list->priv->size, &list->priv->array); return list; }
void __lcd_ports_init(void){ __lcd_light_on(); __lcd_rs_off(); __lcd_rw_off(); __lcd_e_off(); __set(LCD_DDR,RS); __set(LCD_DDR,E); __set(LCD_DDR,RW); __set(LCD_DDR,DB7); __set(LCD_DDR,DB6); __set(LCD_DDR,DB5); __set(LCD_DDR,DB4); __set(LCD_DDR,LIGHT); }
void shutdown(int exit_val, char *err_cause, int line_no) { static int in_shutdown = 0; /* In case we get called recursively by a set() call below */ if (in_shutdown++) return; seteuid(0); if (queue != -1) if (mq_close(queue)) perror("mq_close() during shutdown"); if (queue_path) /* * Be silent if this fails, if we cleaned up already it's * expected to fail */ mq_unlink(queue_path); if (default_settings) { if (saved_def_msgs) __set(def_msgs, saved_def_msgs, "failed to restore saved_def_msgs"); if (saved_def_msgsize) __set(def_msgsize, saved_def_msgsize, "failed to restore saved_def_msgsize"); } if (saved_max_msgs) __set(max_msgs, saved_max_msgs, "failed to restore saved_max_msgs"); if (saved_max_msgsize) __set(max_msgsize, saved_max_msgsize, "failed to restore saved_max_msgsize"); if (exit_val) error(exit_val, errno, "%s at %d", err_cause, line_no); exit(0); }
slong _nmod_poly_xgcd_hgcd(mp_ptr G, mp_ptr S, mp_ptr T, mp_srcptr A, slong lenA, mp_srcptr B, slong lenB, nmod_t mod) { const slong cutoff = FLINT_BIT_COUNT(mod.n) <= 8 ? NMOD_POLY_SMALL_GCD_CUTOFF : NMOD_POLY_GCD_CUTOFF; slong lenG, lenS, lenT; if (lenB == 1) { G[0] = B[0]; T[0] = 1; lenG = 1; lenS = 0; lenT = 1; } else { mp_ptr q = _nmod_vec_init(lenA + lenB); mp_ptr r = q + lenA; slong lenq, lenr; __divrem(q, lenq, r, lenr, A, lenA, B, lenB); if (lenr == 0) { __set(G, lenG, B, lenB); T[0] = 1; lenS = 0; lenT = 1; } else { mp_ptr h, j, v, w, R[4], X; slong lenh, lenj, lenv, lenw, lenR[4]; int sgnR; lenh = lenj = lenB; lenv = lenw = lenA + lenB - 2; lenR[0] = lenR[1] = lenR[2] = lenR[3] = (lenB + 1) / 2; X = _nmod_vec_init(2 * lenh + 2 * lenv + 4 * lenR[0]); h = X; j = h + lenh; v = j + lenj; w = v + lenv; R[0] = w + lenw; R[1] = R[0] + lenR[0]; R[2] = R[1] + lenR[1]; R[3] = R[2] + lenR[2]; sgnR = _nmod_poly_hgcd(R, lenR, h, &lenh, j, &lenj, B, lenB, r, lenr, mod); if (sgnR > 0) { _nmod_vec_neg(S, R[1], lenR[1], mod); _nmod_vec_set(T, R[0], lenR[0]); } else { _nmod_vec_set(S, R[1], lenR[1]); _nmod_vec_neg(T, R[0], lenR[0], mod); } lenS = lenR[1]; lenT = lenR[0]; while (lenj != 0) { __divrem(q, lenq, r, lenr, h, lenh, j, lenj); __mul(v, lenv, q, lenq, T, lenT); { slong l; _nmod_vec_swap(S, T, FLINT_MAX(lenS, lenT)); l = lenS; lenS = lenT; lenT = l; } __sub(T, lenT, T, lenT, v, lenv); if (lenr == 0) { __set(G, lenG, j, lenj); goto cofactor; } if (lenj < cutoff) { mp_ptr u0 = R[0], u1 = R[1]; slong lenu0 = lenr - 1, lenu1 = lenj - 1; lenG = _nmod_poly_xgcd_euclidean(G, u0, u1, j, lenj, r, lenr, mod); MPN_NORM(u0, lenu0); MPN_NORM(u1, lenu1); __mul(v, lenv, S, lenS, u0, lenu0); __mul(w, lenw, T, lenT, u1, lenu1); __add(S, lenS, v, lenv, w, lenw); goto cofactor; } sgnR = _nmod_poly_hgcd(R, lenR, h, &lenh, j, &lenj, j,lenj, r, lenr, mod); __mul(v, lenv, R[1], lenR[1], T, lenT); __mul(w, lenw, R[2], lenR[2], S, lenS); __mul(q, lenq, S, lenS, R[3], lenR[3]); if (sgnR > 0) __sub(S, lenS, q, lenq, v, lenv); else __sub(S, lenS, v, lenv, q, lenq); __mul(q, lenq, T, lenT, R[0], lenR[0]); if (sgnR > WORD(0)) __sub(T, lenT, q, lenq, w, lenw); else __sub(T, lenT, w, lenw, q, lenq); } __set(G, lenG, h, lenh); cofactor: __mul(v, lenv, S, lenS, A, lenA); __sub(w, lenw, G, lenG, v, lenv); __div(T, lenT, w, lenw, B, lenB); _nmod_vec_clear(X); } _nmod_vec_clear(q); } flint_mpn_zero(S + lenS, lenB - 1 - lenS); flint_mpn_zero(T + lenT, lenA - 1 - lenT); return lenG; }