static int p_set_par_goal(value v, type t) { pword *old_tg = TG; pword term, *term_as_bytes; amsg_data_t *msg_data; if (par_goal_msg_) (void) amsg_free(par_goal_msg_); /* encode the term */ term.val.all = v.all; term.tag.kernel = t.kernel; term_as_bytes = term_to_dbformat(&term, D_UNKNOWN); /* fill into a message buffer */ if (amsg_alloc((amsg_size_t) BufferSize(term_as_bytes), &msg_data, &par_goal_msg_) != AMSG_OK) { Bip_Error(MPS_ERROR); } bmem_cpy( (generic_ptr) msg_data, (generic_ptr) BufferStart(term_as_bytes), (bmem_size_t) BufferSize(term_as_bytes)); TG = old_tg; /* pop the temporary stack string */ Succeed_; }
void SSLBufferTryWrite(struct sslbuffer_t *sslbuffer) { int res; unsigned long error; if (!sslbuffer->fl_writing) { if (BufferSize(sslbuffer->write_buffer_1) > 0) BufferCopy(sslbuffer->write_buffer_2, sslbuffer->write_buffer_1); } if (BufferSize(sslbuffer->write_buffer_2) > 0) { res = SSL_write( sslbuffer->ssl, BufferStart(sslbuffer->write_buffer_2), BufferSize(sslbuffer->write_buffer_2)); if (res <= 0) { error = SSL_get_error(sslbuffer->ssl, res); sslbuffer->fl_writing = 1; if (error == SSL_ERROR_WANT_READ) sslbuffer->fl_want_read = 1; else if (error == SSL_ERROR_WANT_WRITE) sslbuffer->fl_want_write = 1; else { printf("%s:%d: unknown error %lu\n", __FILE__, __LINE__, error); print_errors(); event_base_loopbreak(sslbuffer->base); } return; } BufferRemove(sslbuffer->write_buffer_2, (size_t) res); sslbuffer->fl_writing = 0; sslbuffer->fl_want_write = 0; sslbuffer->fl_want_read = 0; } if ( (BufferSize(sslbuffer->write_buffer_1) == 0) && (BufferSize(sslbuffer->write_buffer_2) == 0)) { event_del(sslbuffer->ev_write); } }
static int p_dbag_enter(value vbag, type tbag, value vterm, type tterm) { aport_id_t bag_aport_id; pword term, *term_as_bytes; pword *old_tg = TG; amsg_size_t msg_size; amsg_t msg; amsg_data_t *msg_data; Check_Integer(tbag); bag_aport_id = (aport_id_t) vbag.nint; /* encode the term */ term.val.all = vterm.all; term.tag.kernel = tterm.kernel; term_as_bytes = term_to_dbformat(&term, D_UNKNOWN); /* fill into a message buffer */ msg_size = BufferSize(term_as_bytes) + sizeof(amsg_ref_t); if (amsg_alloc(msg_size, &msg_data, &msg) != AMSG_OK) { Bip_Error(MPS_ERROR); } bmem_cpy((generic_ptr) ((char *) msg_data + sizeof(amsg_ref_t)), (generic_ptr) BufferStart(term_as_bytes), (bmem_size_t) BufferSize(term_as_bytes)); TG = old_tg; /* pop the temporary stack string */ /* send the message */ if (amsg_send(bag_aport_id, msg, MDT_BYTE, (amsg_count_t) msg_size, 0) != AMSG_OK) { Bip_Error(MPS_ERROR); } Succeed_; }
static int p_text_to_string(value v, type t, value vs, type ts) { pword *pw, *list; char *s; int len; pword *old_tg = Gbl_Tg; if (IsRef(t)) { Bip_Error(PDELAY_1); } if (IsString(t)) { Kill_DE; Return_Unify_Pw(v, t, vs, ts); } if (IsAtom(t)) /* not including [] ! */ { Kill_DE; Return_Unify_String(vs, ts, DidString(v.did)); } if (IsNil(t)) { Kill_DE; Return_Unify_String(vs, ts, empty_string); } if (IsList(t)) /* make a string from a list */ { int element_type = 0; list = v.ptr; /* space for the string header */ Push_Buffer(1); /* make minimum buffer */ s = (char *) BufferStart(old_tg); /* start of the new string */ for(;;) /* loop through the list */ { int c; pw = list++; Dereference_(pw); /* get the list element */ if (IsRef(pw->tag)) /* check it */ { Gbl_Tg = old_tg; Push_var_delay(vs.ptr, ts.all); Push_var_delay(pw, pw->tag.all); Bip_Error(PDELAY); } else if (IsInteger(pw->tag)) /* char code */ { element_type |= 1; c = pw->val.nint; if (c < 0 || 255 < c) { Gbl_Tg = old_tg; Bip_Error(RANGE_ERROR); } } else if (IsAtom(pw->tag)) /* char atom */ { element_type |= 2; if (DidLength(pw->val.did) != 1) { Gbl_Tg = old_tg; Bip_Error(RANGE_ERROR); } c = DidName(pw->val.did)[0]; } else { Gbl_Tg = old_tg; Bip_Error(TYPE_ERROR); } *s++ = c; if (s == (char *) Gbl_Tg) /* we need another pword */ { Gbl_Tg += 1; Check_Gc; } Dereference_(list); /* get the list tail */ if (IsRef(list->tag)) { Gbl_Tg = old_tg; Push_var_delay(vs.ptr, ts.all); Push_var_delay(list, list->tag.all); Bip_Error(PDELAY); } else if (IsList(list->tag)) list = list->val.ptr; else if (IsNil(list->tag)) break; /* end of the list */ else { Gbl_Tg = old_tg; Bip_Error(TYPE_ERROR); } } if (element_type != 1 && element_type != 2) /* mixed type list? */ { Gbl_Tg = old_tg; Bip_Error(TYPE_ERROR); } *s = '\0'; /* terminate the string */ Set_Buffer_Size(old_tg, s - (char *)(old_tg + 1) + 1); Kill_DE; Return_Unify_String(vs, ts, old_tg); } Bip_Error(TYPE_ERROR); }
static int p_string_list(value vs, type ts, value vl, type tl) { register pword *pw, *list; register char *s; register int len; pword *old_tg = Gbl_Tg; if (IsRef(ts)) /* no string given */ { if (IsRef(tl)) /* we need at least one */ { Bip_Error(PDELAY_1_2); } else if (IsList(tl)) /* make a string from a list */ { list = vl.ptr; /* space for the string header */ Push_Buffer(1); /* make minimum buffer */ s = (char *) BufferStart(old_tg); /* start of the new string */ for(;;) /* loop through the list */ { pw = list++; Dereference_(pw); /* get the list element */ if (IsRef(pw->tag)) /* check it */ { Gbl_Tg = old_tg; Push_var_delay(vs.ptr, ts.all); Push_var_delay(pw, pw->tag.all); Bip_Error(PDELAY); } else if (!IsInteger(pw->tag)) { Gbl_Tg = old_tg; Bip_Error(TYPE_ERROR); } else if (pw->val.nint < 0 || pw->val.nint > 255) { Gbl_Tg = old_tg; Bip_Error(RANGE_ERROR); } *s++ = pw->val.nint; if (s == (char *) Gbl_Tg) /* we need another pword */ { Gbl_Tg += 1; Check_Gc; } Dereference_(list); /* get the list tail */ if (IsRef(list->tag)) { Gbl_Tg = old_tg; Push_var_delay(vs.ptr, ts.all); Push_var_delay(list, list->tag.all); Bip_Error(PDELAY); } else if (IsList(list->tag)) list = list->val.ptr; else if (IsNil(list->tag)) break; /* end of the list */ else { Gbl_Tg = old_tg; Bip_Error(TYPE_ERROR); } } *s = '\0'; /* terminate the string */ Set_Buffer_Size(old_tg, s - (char *)(old_tg + 1) + 1); Kill_DE; Return_Unify_String(vs, ts, old_tg); } else if (IsNil(tl)) { Kill_DE; Return_Unify_String(vs, ts, empty_string); } else { Bip_Error(TYPE_ERROR); } } else if (IsString(ts)) { Kill_DE; Check_Output_List(tl); s = StringStart(vs); /* get a pointer to the string */ len = StringLength(vs); if (len == 0) { Return_Unify_Nil(vl, tl); } /* Additional a-priori overflow check because adding to TG may * may wrap around the address space and break Check_Gc below */ Check_Available_Pwords(2*len); pw = Gbl_Tg; /* reserve space for the list */ Gbl_Tg += 2*len; Check_Gc; pw->val.nint = *s++ & 0xFFL; /* construct the list */ pw++->tag.kernel = TINT; while (--len > 0) { pw->val.ptr = pw + 1; pw++->tag.kernel = TLIST; pw->val.nint = *s++ & 0xFFL; pw++->tag.kernel = TINT; } pw->tag.kernel = TNIL; Return_Unify_List(vl, tl, old_tg); } else { Bip_Error(TYPE_ERROR); } }