本文整理汇总了C++中POP函数的典型用法代码示例。如果您正苦于以下问题:C++ POP函数的具体用法?C++ POP怎么用?C++ POP使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了POP函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: setup_romvec
void setup_romvec(void)
{
/* SPARC32 is slightly unusual in that before invoking any loaders, a romvec array
needs to be set up to pass certain parameters using a C struct. Hence this function
extracts the relevant boot information and places it in obp_arg. */
int intprop, proplen, target, device, i;
unsigned int *intprop_ptr;
phandle_t chosen;
char *prop, *id, *name;
static char bootpathbuf[128], bootargsbuf[128], buf[128];
struct linux_mlist_v0 **pp;
/* Get the stdin and stdout paths */
chosen = find_dev("/chosen");
intprop = get_int_property(chosen, "stdin", &proplen);
PUSH(intprop);
fword("get-instance-path");
((struct linux_romvec *)romvec)->pv_stdin = pop_fstr_copy();
intprop = get_int_property(chosen, "stdout", &proplen);
PUSH(intprop);
fword("get-instance-path");
((struct linux_romvec *)romvec)->pv_stdout = pop_fstr_copy();
/* Get the name of the selected boot device, along with the device and unit number */
prop = get_property(chosen, "bootpath", &proplen);
strncpy(bootpathbuf, prop, proplen);
prop = get_property(chosen, "bootargs", &proplen);
strncpy(bootargsbuf, prop, proplen);
/* Set bootpath pointer used in romvec table to the bootpath */
push_str(bootpathbuf);
fword("pathres-resolve-aliases");
bootpath = pop_fstr_copy();
printk("bootpath: %s\n", bootpath);
/* Now do some work to get hold of the target, partition etc. */
push_str(bootpathbuf);
feval("open-dev");
feval("ihandle>boot-device-handle drop to my-self");
push_str("name");
fword("get-my-property");
POP();
name = pop_fstr_copy();
if (!strncmp(name, "sd", 2)) {
/*
Old-style SunOS disk paths are given in the form:
sd(c,t,d):s
where:
c = controller (Nth controller in system, usually 0)
t = target (my-unit phys.hi)
d = device/LUN (my-unit phys.lo)
s = slice/partition (my-args)
*/
/* Controller currently always 0 */
obp_arg.boot_dev_ctrl = 0;
/* Get the target, device and slice */
fword("my-unit");
target = POP();
device = POP();
fword("my-args");
id = pop_fstr_copy();
if (id != NULL) {
snprintf(buf, sizeof(buf), "sd(0,%d,%d):%c", target, device, id[0]);
obp_arg.dev_partition = id[0] - 'a';
} else {
snprintf(buf, sizeof(buf), "sd(0,%d,%d)", target, device);
obp_arg.dev_partition = 0;
}
obp_arg.boot_dev_unit = target;
obp_arg.boot_dev[0] = buf[0];
obp_arg.boot_dev[1] = buf[1];
obp_arg.argv[0] = buf;
obp_arg.argv[1] = bootargsbuf;
} else if (!strncmp(name, "SUNW,fdtwo", 10)) {
obp_arg.boot_dev_ctrl = 0;
obp_arg.boot_dev_unit = 0;
obp_arg.dev_partition = 0;
strcpy(buf, "fd()");
obp_arg.boot_dev[0] = buf[0];
obp_arg.boot_dev[1] = buf[1];
obp_arg.argv[0] = buf;
obp_arg.argv[1] = bootargsbuf;
} else if (!strncmp(name, "le", 2)) {
//.........这里部分代码省略.........
示例2: prim_array_regfilter_prop
void
prim_array_regfilter_prop(PRIM_PROTOTYPE)
{
char buf[BUFFER_LEN];
struct inst *in;
stk_array *arr;
stk_array *nu;
char* prop;
const char* ptr;
muf_re* re;
int flags;
int matchcnt = 0;
const char* errstr = NULL;
CHECKOP(4);
oper4 = POP(); /* int pcreflags */
oper3 = POP(); /* str pattern */
oper2 = POP(); /* str propname */
oper1 = POP(); /* refarr Array */
if (oper1->type != PROG_ARRAY)
abort_interp("Argument not an array. (1)");
if (!array_is_homogenous(oper1->data.array, PROG_OBJECT))
abort_interp("Argument not an array of dbrefs. (1)");
if (oper2->type != PROG_STRING || !oper2->data.string)
abort_interp("Argument not a non-null string. (2)");
if (oper3->type != PROG_STRING)
abort_interp("Argument not a string pattern. (3)");
if (oper4->type != PROG_INTEGER)
abort_interp("Non-integer argument (4)");
ptr = oper2->data.string->data;
while ((ptr = index(ptr, PROPDIR_DELIMITER)))
if (!(*(++ptr)))
abort_interp("Cannot access a propdir directly.");
nu = new_array_packed(0);
arr = oper1->data.array;
flags = PCRE_NO_AUTO_CAPTURE;
if (oper4->data.number & MUF_RE_ICASE)
flags |= PCRE_CASELESS;
if (oper4->data.number & MUF_RE_EXTENDED)
flags |= PCRE_EXTENDED;
re = regmatch_re_get(oper3->data.string, flags, &errstr);
if (errstr)
abort_interp(errstr)
if (re && !re->extra && array_count(arr) > 2) {
/* This pattern is getting used 3 or more times, let's study it. A null
* return is okay, that just means there's nothing to optimize. */
re->extra = pcre_study(re->re, 0, &errstr);
if (errstr)
abort_interp(errstr);
}
prop = (char *) DoNullInd(oper2->data.string);
if (array_first(arr, &temp1)) {
do {
in = array_getitem(arr, &temp1);
if (valid_object(in)) {
ref = in->data.objref;
CHECKREMOTE(ref);
if (prop_read_perms(ProgUID, ref, prop, mlev)) {
ptr = get_property_class(ref, prop);
if (ptr)
strcpy(buf, ptr);
else
strcpy(buf, "");
if ((matchcnt = regmatch_exec(re, buf)) < 0) {
if (matchcnt != PCRE_ERROR_NOMATCH)
abort_interp(muf_re_error(matchcnt));
} else {
array_appenditem(&nu, in);
}
}
}
} while (array_next(arr, &temp1));
}
CLEAR(oper4);
CLEAR(oper3);
CLEAR(oper2);
CLEAR(oper1);
PushArrayRaw(nu);
}
示例3: amx_exec_run
//.........这里部分代码省略.........
case 1:
case 3:
/* cannot change these parameters */
break;
case 2:
hea=pri;
break;
case 4:
stk=pri;
break;
case 5:
frm=pri;
break;
case 6:
cip=(cell *)(amx->code + (int)pri);
break;
} /* switch */
NEXT(cip,op);
op_xchg:
offs=pri; /* offs is a temporary variable */
pri=alt;
alt=offs;
NEXT(cip,op);
op_push_pri:
PUSH(pri);
NEXT(cip,op);
op_push_alt:
PUSH(alt);
NEXT(cip,op);
op_pushr_pri:
PUSH(data+pri);
NEXT(cip,op);
op_pop_pri:
POP(pri);
NEXT(cip,op);
op_pop_alt:
POP(alt);
NEXT(cip,op);
op_pick:
GETPARAM(offs);
pri=_R(data,stk+offs);
NEXT(cip,op);
op_stack:
GETPARAM(offs);
alt=stk;
stk+=offs;
CHKMARGIN();
CHKSTACK();
NEXT(cip,op);
op_heap:
GETPARAM(offs);
alt=hea;
hea+=offs;
CHKMARGIN();
CHKHEAP();
NEXT(cip,op);
op_proc:
PUSH(frm);
frm=stk;
CHKMARGIN();
NEXT(cip,op);
op_ret:
POP(frm);
POP(offs);
/* verify the return address */
if ((long)offs>=amx->codesize)
示例4: prim_regexp
void
prim_regexp(PRIM_PROTOTYPE)
{
stk_array* nu_val = 0;
stk_array* nu_idx = 0;
int matches[MATCH_ARR_SIZE];
muf_re* re;
char* text;
int flags = 0;
int len, i;
int matchcnt = 0;
const char* errstr;
CHECKOP(3);
oper3 = POP(); /* int:Flags */
oper2 = POP(); /* str:Pattern */
oper1 = POP(); /* str:Text */
if (oper1->type != PROG_STRING)
abort_interp("Non-string argument (1)");
if (oper2->type != PROG_STRING)
abort_interp("Non-string argument (2)");
if (oper3->type != PROG_INTEGER)
abort_interp("Non-integer argument (3)");
if (!oper2->data.string)
abort_interp("Empty string argument (2)");
if (oper3->data.number & MUF_RE_ICASE)
flags |= PCRE_CASELESS;
if (oper3->data.number & MUF_RE_EXTENDED)
flags |= PCRE_EXTENDED;
if ((re = muf_re_get(oper2->data.string, flags, &errstr)) == NULL)
abort_interp(errstr);
text = (char *)DoNullInd(oper1->data.string);
len = strlen(text);
if ((matchcnt = pcre_exec(re->re, re->extra, text, len, 0, 0, matches, MATCH_ARR_SIZE)) < 0)
{
if (matchcnt != PCRE_ERROR_NOMATCH)
{
abort_interp(muf_re_error(matchcnt));
}
if (((nu_val = new_array_packed(0)) == NULL) ||
((nu_idx = new_array_packed(0)) == NULL))
{
if (nu_val != NULL)
array_free(nu_val);
if (nu_idx != NULL)
array_free(nu_idx);
abort_interp("Out of memory");
}
}
else
{
if (((nu_val = new_array_packed(matchcnt)) == NULL) ||
((nu_idx = new_array_packed(matchcnt)) == NULL))
{
if (nu_val != NULL)
array_free(nu_val);
if (nu_idx != NULL)
array_free(nu_idx);
abort_interp("Out of memory");
}
for(i = 0; i < matchcnt; i++)
{
int substart = matches[i*2];
int subend = matches[i*2+1];
struct inst idx, val;
stk_array* nu;
if ((substart >= 0) && (subend >= 0) && (substart < len))
snprintf(buf, BUFFER_LEN, "%.*s", (int)(subend - substart), &text[substart]);
else
buf[0] = '\0';
idx.type = PROG_INTEGER;
idx.data.number = i;
val.type = PROG_STRING;
val.data.string = alloc_prog_string(buf);
array_setitem(&nu_val, &idx, &val);
CLEAR(&idx);
CLEAR(&val);
if ((nu = new_array_packed(2)) == NULL)
{
array_free(nu_val);
array_free(nu_idx);
abort_interp("Out of memory");
//.........这里部分代码省略.........
示例5: prim_array_regsub
void
prim_array_regsub(PRIM_PROTOTYPE)
{
struct inst *in;
stk_array *arr;
stk_array *nw;
int matches[MATCH_ARR_SIZE];
int flags = 0;
char* write_ptr = buf;
int write_left = BUFFER_LEN - 1;
muf_re* re;
char* text;
char* textstart;
const char* errstr;
int matchcnt, len;
CHECKOP(4);
oper4 = POP(); /* int:Flags */
oper3 = POP(); /* str:Replace */
oper2 = POP(); /* str:Pattern */
oper1 = POP(); /* str:Text */
if (oper1->type != PROG_ARRAY)
abort_interp("Argument not an array of strings. (1)");
if (!array_is_homogenous(oper1->data.array, PROG_STRING))
abort_interp("Argument not an array of strings. (1)");
if (oper2->type != PROG_STRING)
abort_interp("Non-string argument (2)");
if (oper3->type != PROG_STRING)
abort_interp("Non-string argument (3)");
if (oper4->type != PROG_INTEGER)
abort_interp("Non-integer argument (4)");
if (!oper2->data.string)
abort_interp("Empty string argument (2)");
if (oper4->data.number & MUF_RE_ICASE)
flags |= PCRE_CASELESS;
if (oper4->data.number & MUF_RE_EXTENDED)
flags |= PCRE_EXTENDED;
if ((re = muf_re_get(oper2->data.string, flags, &errstr)) == NULL)
abort_interp(errstr);
nw = new_array_dictionary();
arr = oper1->data.array;
if (!re->extra
&& ((oper4->data.number & MUF_RE_ALL ) || array_count(arr) > 2)) {
/* Study the pattern if the user requested recursive substitution, or
* if the input array contains at least three items. */
re->extra = pcre_study(re->re, 0, &errstr);
if (errstr)
abort_interp(errstr);
}
if (array_first(arr, &temp1)) {
do {
write_ptr = buf;
write_left = BUFFER_LEN - 1;
in = array_getitem(arr, &temp1);
textstart = text = (char *)DoNullInd(in->data.string);
len = strlen(textstart);
while((*text != '\0') && (write_left > 0))
{
if ((matchcnt = pcre_exec(re->re, re->extra, textstart, len,
text-textstart, 0, matches,
MATCH_ARR_SIZE)) < 0)
{
if (matchcnt != PCRE_ERROR_NOMATCH)
{
abort_interp(muf_re_error(matchcnt));
}
while((write_left > 0) && (*text != '\0'))
{
*write_ptr++ = *text++;
write_left--;
}
break;
}
else
{
int allstart = matches[0];
int allend = matches[1];
int substart = -1;
int subend = -1;
char* read_ptr = (char *)DoNullInd(oper3->data.string);
int count;
for(count = allstart-(text-textstart);
(write_left > 0) && (*text != '\0') && (count > 0);
count--)
{
*write_ptr++ = *text++;
//.........这里部分代码省略.........
示例6: eval_term
term_t
eval_term(struct lisp0_state*state,term_t term){
X = term;
CALL(L_eval);
return X;
L_eval:
if(IS_ERROR(X)){
RETURN(X);
}
if(IS_ATOM(X)){
RETURN(subst(ENV,X));
}
if(!IS_LIST(X)){
RETURN(ERR(E_BAD_EXPR));
}
PUSH(CDR(X));
X = CAR(X);
CALL(L_eval);
Y = POP();
switch(TAG(X)){
case TAG_ERROR: RETURN(X);
case TAG_PRIMITIVE:
switch(VALUE(X)){
case PRIM_QUOTE: goto L_quote;
case PRIM_ATOM: goto L_atom;
case PRIM_EQ: goto L_eq;
case PRIM_COND: goto L_cond;
case PRIM_CAR: goto L_car;
case PRIM_CDR: goto L_cdr;
case PRIM_CONS: goto L_cons;
case PRIM_LABEL: goto L_label;
case PRIM_LAMBDA: goto L_lambda;
case PRIM_MACRO: goto L_macro;
default: break;
};
break;
case TAG_POINTER:
if(!X) break;
switch(PTAG(X)){
case PTAG_LAMBDA: goto L_eval_lambda;
case PTAG_MACRO: goto L_eval_macro;
default: break;
};
default: break;
}
RETURN(ERR(E_NOT_CALLABLE));
L_quote:
PARSE_ARG1();
RETURN(X);
L_atom:
PARSE_AND_EVAL_ARG1();
RETURN(((!X)||IS_ATOM(X))?TRUE:FALSE);
L_eq:
PARSE_AND_EVAL_ARG2();
RETURN(eq(Y,X)?TRUE:FALSE);
L_cond:
PARSE_ARG();
PUSH(CDR(Y));
Y = CAR(Y);
PARSE_ARG2();
PUSH(Y);
CLEAR(Y);
CALL(L_eval);
Y = POP();
switch(X){
case TRUE:
X = Y;
CLEAR(Y);
goto L_eval;
case FALSE:
Y = POP();
goto L_cond;
default:
RETURN(ERR(E_COND_END));
};
L_car:
PARSE_AND_EVAL_ARG1();
if(!IS_LIST(X)){
RETURN(ERR(E_ARGUMENT));
}
RETURN(CAR(X));
L_cdr:
PARSE_AND_EVAL_ARG1();
if(!IS_LIST(X)){
RETURN(ERR(E_ARGUMENT));
}
RETURN(CDR(X));
//.........这里部分代码省略.........
示例7: ifpack_multilist_sort
void ifpack_multilist_sort (int *const pbase, double *const daux, size_t total_elems)
{
int itemp;
double dtemp;
const size_t size = 1;
register int *base_ptr = (int *) pbase;
/* Allocating SIZE bytes for a pivot buffer facilitates a better
algorithm below since we can do comparisons directly on the pivot. */
int pivot_buffer[1];
const size_t max_thresh = MAX_THRESH * size;
/* edmond: return if total_elems less than zero */
if (total_elems <= 0)
/* Avoid lossage with unsigned arithmetic below. */
return;
if (total_elems > MAX_THRESH)
{
int *lo = base_ptr;
int *hi = &lo[size * (total_elems - 1)];
/* Largest size needed for 32-bit int!!! */
stack_node stack[STACK_SIZE];
stack_node *top = stack + 1;
while (STACK_NOT_EMPTY)
{
int *left_ptr;
int *right_ptr;
int *pivot = pivot_buffer;
/* Select median value from among LO, MID, and HI. Rearrange
LO and HI so the three values are sorted. This lowers the
probability of picking a pathological pivot value and
skips a comparison for both the LEFT_PTR and RIGHT_PTR. */
int *mid = lo + size * ((hi - lo) / size >> 1);
if (*mid - *lo < 0)
SWAP (mid, lo);
if (*hi - *mid < 0)
SWAP (mid, hi);
else
goto jump_over;
if (*mid - *lo < 0)
SWAP (mid, lo);
jump_over:;
*pivot = *mid;
pivot = pivot_buffer;
left_ptr = lo + size;
right_ptr = hi - size;
/* Here's the famous ``collapse the walls'' section of quicksort.
Gotta like those tight inner loops! They are the main reason
that this algorithm runs much faster than others. */
do
{
while (*left_ptr - *pivot < 0)
left_ptr += size;
while (*pivot - *right_ptr < 0)
right_ptr -= size;
if (left_ptr < right_ptr)
{
SWAP (left_ptr, right_ptr);
left_ptr += size;
right_ptr -= size;
}
else if (left_ptr == right_ptr)
{
left_ptr += size;
right_ptr -= size;
break;
}
}
while (left_ptr <= right_ptr);
/* Set up pointers for next iteration. First determine whether
left and right partitions are below the threshold size. If so,
ignore one or both. Otherwise, push the larger partition's
bounds on the stack and continue sorting the smaller one. */
if ((size_t) (right_ptr - lo) <= max_thresh)
{
if ((size_t) (hi - left_ptr) <= max_thresh)
/* Ignore both small partitions. */
POP (lo, hi);
else
/* Ignore small left partition. */
lo = left_ptr;
}
else if ((size_t) (hi - left_ptr) <= max_thresh)
/* Ignore small right partition. */
hi = right_ptr;
else if ((right_ptr - lo) > (hi - left_ptr))
{
/* Push larger left partition indices. */
//.........这里部分代码省略.........
示例8: esil_commit
static int esil_commit (RAnalEsil *c, const char *op) {
const char *q = POP();
const char *p = POP();
//const char *o = op;
int ss = c->opsize;
if (ss) {
// eprintf (";; GET %d[%s]\n", ss, q);
// eprintf ("PSUH %s %s\n", p, q);
eprintf (";; -> this means that we have to resolve before accessing memory %d\n", c->opsize);
c->opsize = 0;
PUSH (p);
PUSH (q);
return 0;
}
if (!op) {
eprintf ("COMMIT UNKNOWN OP.. THIs IS []\n");
return 0;
}
//eprintf (";;; COMMIT ;;; (%s) %s (%s)\n", p, o, q);
if (IS ("[=")) {
eprintf ("EQUAL------SET\n");
} else
if (IS ("+")) {
// push (get (p)+get (q));
ut64 n = esil_get (c, p) + esil_get (c, q);
char *ns = malloc (32); // XXX memleak
sprintf (ns, "0x%"PFMT64x, n);
PUSH (ns);
eprintf (";;; %s %s\n", p, q);
//eprintf (" (((0x%llx)))\n", esil_get (c, p));
eprintf (";;; +EQUAL! (%s)\n", ns);
} else
if (IS ("-")) {
// push (get (p)+get (q));
ut64 n = esil_get (c, p) - esil_get (c, q);
char *ns = malloc (32); // XXX memleak
sprintf (ns, "0x%"PFMT64x, n);
PUSH (ns);
eprintf (";;; %s %s\n", p, q);
eprintf (";;; -EQUAL! (%s)\n", ns);
} else
if (IS ("*")) {
// push (get (p)+get (q));
ut64 n = esil_get (c, p) * esil_get (c, q);
char *ns = malloc (32); // XXX memleak
sprintf (ns, "0x%"PFMT64x, n);
PUSH (ns);
eprintf (";;; %s %s\n", p, q);
eprintf (";;; *EQUAL! (%s)\n", ns);
}
if (IS ("=")) {
if (p == NULL || q == NULL) {
eprintf ("Invalid construction\n");
return -1;
}
// set (p, get (q))
c->set (c, p, c->get (c, q));
eprintf (";;; EQUAL! (%s=%s)\n", p, q);
}
return 0;
}
示例9: toyvm_function_interpret
static int
toyvm_function_interpret (toyvm_function *fn, int arg, FILE *trace)
{
toyvm_frame frame;
#define PUSH(ARG) (toyvm_frame_push (&frame, (ARG)))
#define POP(ARG) (toyvm_frame_pop (&frame))
frame.frm_function = fn;
frame.frm_pc = 0;
frame.frm_cur_depth = 0;
PUSH (arg);
while (1)
{
toyvm_op *op;
int x, y;
assert (frame.frm_pc < fn->fn_num_ops);
op = &fn->fn_ops[frame.frm_pc++];
if (trace)
{
toyvm_frame_dump_stack (&frame, trace);
toyvm_function_disassemble_op (fn, op, frame.frm_pc, trace);
}
switch (op->op_opcode)
{
/* Ops taking no operand. */
case DUP:
x = POP ();
PUSH (x);
PUSH (x);
break;
case ROT:
y = POP ();
x = POP ();
PUSH (y);
PUSH (x);
break;
case BINARY_ADD:
y = POP ();
x = POP ();
PUSH (x + y);
break;
case BINARY_SUBTRACT:
y = POP ();
x = POP ();
PUSH (x - y);
break;
case BINARY_MULT:
y = POP ();
x = POP ();
PUSH (x * y);
break;
case BINARY_COMPARE_LT:
y = POP ();
x = POP ();
PUSH (x < y);
break;
case RECURSE:
x = POP ();
x = toyvm_function_interpret (fn, x, trace);
PUSH (x);
break;
case RETURN:
return POP ();
/* Ops taking an operand. */
case PUSH_CONST:
PUSH (op->op_operand);
break;
case JUMP_ABS_IF_TRUE:
x = POP ();
if (x)
frame.frm_pc = op->op_operand;
break;
default:
assert (0); /* unknown opcode */
} /* end of switch on opcode */
} /* end of while loop */
#undef PUSH
#undef POP
}
示例10: Agc_trace
void Agc_trace(
SEGCTLPTR *heap_segments
)
{
AREA heap;
AREA area; /* The current area being traced */
TRACINGSTACK tstack; /* Stack of areas to be traced */
SEGCTLPTR segctlp;
SEGCTLPTR *segctlpp;
SIZE temp;
#ifndef A_FUNNY_STEPAREAPTR /* cop-out for weird architectures */
{
/* Check that STEPAREAPTR works correctly on this machine for this nastily aligned structure */
/* If C compiler does tight packing, this could be a problem for the garbage collector */
ASSERT_DECL( struct { PTR p1; char c; PTR p2; } *ass_struct = NIL )
ASSERT_INIT( ( area.addr = (PTR)&ass_struct->c , area.size = sizeof(*ass_struct) ) );
ASSERT_INIT( STEPAREA( area ) );
ASSERT(area.addr == (PTR)&ass_struct->p2,Agc_collect,STEPAREA misbehaving);
}
#endif
heap.addr = SEGSTART( *heap_segments ); heap.size = 0 ;/* inital values to be improved in loop*/
REPORT1(3, "%s\n", "Started trace... setting up bitmaps...");
for ( segctlp = *heap_segments; segctlp != NIL; segctlp = segctlp->next )
{
REPORT6(6,"Agc_collect{mark}: segctlp=0x%p, elsize=%d, start=0x%p, end=0x%p, size=%d,els=%d\n",
(void *)segctlp,SEGELSIZE(segctlp),(void *)SEGSTART(segctlp),(void *)SEGEND(segctlp),SEGSIZE(segctlp),SEGELS(segctlp));
if ( ! ( SEGELSIZE( segctlp ) > 0 && (char *)SEGEND( segctlp ) > (char *)SEGSTART( segctlp ) ) )
{
/* Segment control information has been corrupted. */
/* Most likely this is because of a user scope/bound error, or CTRANS bug; though possibly a collector bug. */
GC_ERROR(HEAP segments corrupt);
}
if ( (char *)SEGSTART( segctlp ) < (char *)(heap.addr) )
{
heap.size += (SIZE)((char *)(heap.addr) - (char *)SEGSTART( segctlp ));
heap.addr = SEGSTART( segctlp );
}
if ( SEGEND( segctlp ) > (PTR)((char *)(heap.addr)+heap.size) )
heap.size = (SIZE)((char *)SEGEND( segctlp ) - (char*)(heap.addr));
GRAB_BITMAP( segctlp->bitmap, SEGELS( segctlp ) + 3 );
SETMARK( segctlp->bitmap, SEGELS( segctlp ) + 0 );
ASSERT(!TSTMARK(segctlp->bitmap,SEGELS(segctlp)+1),Agc_collect,bitmap trailer set at grab);
SETMARK( segctlp->bitmap, SEGELS( segctlp ) + 2 );
/* create an artificial endpoint which can be scanned to */
REPORT2(6,"Agc_collect:\t\tbitmap, ptr=0x%p, size=%d\n", (void *)(segctlp->bitmap), SEGELS( segctlp ));
}
REPORT2(5,"Agc_collect: heap address=0x%p, heap size=%d\n",(void *)heap.addr,heap.size);
INIT_STACK(tstack);
ASSERT_INIT(PUSH(tstack,(PTR)Agc_collect,-42)); /* Assertion mark */
PUSH(tstack, NIL, 0); /* identifies exhausted stack */
REPORT1(3, "%s\n", "Initialising stack scan...");
INIT_AREA(area); /* set area to first area to search - could also PUSH
any additional areas (or use NEXT_AREA) */
do
{
for ( ; !NILAREA(area); /* POP() at end of loop as it may contain statements */ )
{
REPORT3(6,"Agc_collect: AREA scan, ptr=0x%p -> 0x%p, size=%d\n",
(void *)area.addr,(void *)((char *)area.addr+area.size),area.size);
ASSERT(area.size >= 0 && area.size < 100*1024*1024 /* 100Mb */,Agc_collect,area size not sensible);
for ( ; area.size >= sizeof(PTR); STEPAREA(area) )
{
SIZE els, el_in_seg;
PTR p = * (PTR *) area.addr; /* View word as a pointer */
REPORT3(9,"Agc_collect: AREA scan step, ptr=0x%p, size=%d, p=0x%p\n",
(void *)area.addr,area.size,(void *)p);
/* Continue loop if 'p' is unlikely to be a heap pointer. */
/* Keeping the loop small may help some machines with small instruction caches. */
if ( !VALIDPTR( p ) || !PTRINAREA(p,heap) ) continue;
/* p is very likely to be a heap pointer */
for ( segctlpp = heap_segments; (segctlp = *segctlpp) != NIL; segctlpp = &((segctlp)->next ))
{
if ( (char *)p >= (char *)SEGSTART(segctlp) && (char *)p < (char *)SEGEND(segctlp) )
{
/* Segment for heap pointer */
//.........这里部分代码省略.........
示例11: qsort
void qsort( void * base, size_t nmemb, size_t size, int (*compar)( const void *, const void * ) )
{
char * i;
char * j;
_PDCLIB_size_t thresh = T * size;
char * base_ = (char *)base;
char * limit = base_ + nmemb * size;
PREPARE_STACK;
for ( ;; )
{
if ( (size_t)( limit - base_ ) > thresh ) /* QSort for more than T elements. */
{
/* We work from second to last - first will be pivot element. */
i = base_ + size;
j = limit - size;
/* We swap first with middle element, then sort that with second
and last element so that eventually first element is the median
of the three - avoiding pathological pivots.
TODO: Instead of middle element, chose one randomly.
*/
memswp( ( ( ( (size_t)( limit - base_ ) ) / size ) / 2 ) * size + base_, base_, size );
if ( compar( i, j ) > 0 ) memswp( i, j, size );
if ( compar( base_, j ) > 0 ) memswp( base_, j, size );
if ( compar( i, base_ ) > 0 ) memswp( i, base_, size );
/* Now we have the median for pivot element, entering main Quicksort. */
for ( ;; )
{
do
{
/* move i right until *i >= pivot */
i += size;
} while ( compar( i, base_ ) < 0 );
do
{
/* move j left until *j <= pivot */
j -= size;
} while ( compar( j, base_ ) > 0 );
if ( i > j )
{
/* break loop if pointers crossed */
break;
}
/* else swap elements, keep scanning */
memswp( i, j, size );
}
/* move pivot into correct place */
memswp( base_, j, size );
/* larger subfile base / limit to stack, sort smaller */
if ( j - base_ > limit - i )
{
/* left is larger */
PUSH( base_, j );
base_ = i;
}
else
{
/* right is larger */
PUSH( i, limit );
limit = j;
}
}
else /* insertion sort for less than T elements */
{
for ( j = base_, i = j + size; i < limit; j = i, i += size )
{
for ( ; compar( j, j + size ) > 0; j -= size )
{
memswp( j, j + size, size );
if ( j == base_ )
{
break;
}
}
}
if ( stackptr != stack ) /* if any entries on stack */
{
POP( base_, limit );
}
else /* else stack empty, done */
{
break;
}
}
}
}
示例12: main
int main(int argc, char *argv[]) {
//sgenrand(time(NULL));
int k, curr_pos, check;
int chunk; /* Repeat experiment in chunks. */
srand(SEED);
printf("# Info: $Header: /home/ma/p/pruess/.cvsroot/manna_range/dmitry_20151021/manna_stack_clean_edited.c,v 1.2 2015/10/21 11:37:00 pruess Exp $\n");
preamble(argc, argv);
PRINT_PARAM(SEED, "%lu");
PRINT_PARAM(LENGTH, "%lu");
PRINT_PARAM(DROP_LOCATION, "%lu");
PRINT_PARAM(total_malloced, "%lli");
printf("# Info: Expected avalanche size: <s>(x) = 1+(1/2) (<s>(x+1)+<s>(x-1)), BC <s>(0)=0, <s>(L+1)=0, solved by <s>(x)=(L+1-x)x/2.\n");
printf("# Info: Here L=LENGTH=%lu and x=DROP_LOCATION+1=%lu, so expect %g\n", LENGTH, DROP_LOCATION+1, ((double)(DROP_LOCATION+1))*((double)(LENGTH-DROP_LOCATION))/2.);
for (chunk=1; ((chunk<=NUM_CHUNKS) || (NUM_CHUNKS<0)); chunk++) {
MOMENTS_INIT(size);
for (drop = 0; drop < N_ROLLS; drop++) { // big droppping cycle
size=0;
/*
printf("(%i.)", drop);
for(k = 0; k<LENGTH; k++) {
printf("\%i", lattice[k]);
}
printf("\n");
*/
#if (1)
if(check_cell(DROP_LOCATION) == 0) {
lattice[DROP_LOCATION] = 1;
}
else {
stack_push(DROP_LOCATION);
stack_push(DROP_LOCATION);
lattice[DROP_LOCATION] = 0;
}
/* If validated, optimse by turning stack operations into macros,
* optime random number drawing (rather than having doubles in the tree
* have integers there and draw an integer to compare against),
* optimise the shuffling of particles.
*
* I have added MOMENT macros for size. */
while(stack_used != 0) {
curr_pos = stack_pop();
/* This code with the "check" looks clumsy. I suppose
* you are "following through" topplings? I would think
* there is no point doing this later. Anyway, we validate
* this code and take it from there. */
do {
curr_pos = move_ball(curr_pos);
if(curr_pos >= LENGTH || curr_pos < 0) {
check = 0 ;
}
/* Why not just "else" instead of the "if"? */
if(curr_pos < LENGTH && curr_pos >= 0) {
check = check_cell(curr_pos);
if (check == 1) {
stack_push(curr_pos);
}
else {
check = 0;
}
}
}while(check != 0);
}/* end of while(stack_used != 0) look */
#endif
#if (0)
{
int npos;
#define PUSH(a) stack[stack_used++]=(a)
#define POP(a) (a)=stack[--stack_used]
if (lattice[DROP_LOCATION]++==1) {
PUSH(DROP_LOCATION);
while(stack_used) {
size++;
POP(curr_pos);
do {
lattice[curr_pos]-=2;
npos=curr_pos+ ( (rand()>RAND_MAX/2) ? 1 : -1);
if ((npos>=0) && (npos<LENGTH)) {
if (lattice[npos]++==1) {PUSH(npos);}
//.........这里部分代码省略.........
示例13: bpf_jit_compile
/*
* Function that does the real stuff.
*/
bpf_filter_func
bpf_jit_compile(struct bpf_insn *prog, u_int nins, size_t *size)
{
bpf_bin_stream stream;
struct bpf_insn *ins;
int flags, fret, fpkt, fmem, fjmp, fadk;
int save_esp;
u_int i, pass;
/*
* NOTE: Do not modify the name of this variable, as it's used by
* the macros to emit code.
*/
emit_func emitm;
flags = bpf_jit_optimize(prog, nins);
fret = (flags & BPF_JIT_FRET) != 0;
fpkt = (flags & BPF_JIT_FPKT) != 0;
fmem = (flags & BPF_JIT_FMEM) != 0;
fjmp = (flags & BPF_JIT_FJMP) != 0;
fadk = (flags & BPF_JIT_FADK) != 0;
save_esp = (fpkt || fmem || fadk); /* Stack is used. */
if (fret)
nins = 1;
memset(&stream, 0, sizeof(stream));
/* Allocate the reference table for the jumps. */
if (fjmp) {
#ifdef _KERNEL
stream.refs = malloc((nins + 1) * sizeof(u_int), M_BPFJIT,
M_NOWAIT | M_ZERO);
#else
stream.refs = calloc(nins + 1, sizeof(u_int));
#endif
if (stream.refs == NULL)
return (NULL);
}
/*
* The first pass will emit the lengths of the instructions
* to create the reference table.
*/
emitm = emit_length;
for (pass = 0; pass < 2; pass++) {
ins = prog;
/* Create the procedure header. */
if (save_esp) {
PUSH(EBP);
MOVrd(ESP, EBP);
}
if (fmem)
SUBib(BPF_MEMWORDS * sizeof(uint32_t), ESP);
if (save_esp)
PUSH(ESI);
if (fpkt) {
PUSH(EDI);
PUSH(EBX);
MOVodd(8, EBP, EBX);
MOVodd(16, EBP, EDI);
}
for (i = 0; i < nins; i++) {
stream.bpf_pc++;
switch (ins->code) {
default:
#ifdef _KERNEL
return (NULL);
#else
abort();
#endif
case BPF_RET|BPF_K:
MOVid(ins->k, EAX);
if (save_esp) {
if (fpkt) {
POP(EBX);
POP(EDI);
}
POP(ESI);
LEAVE();
}
RET();
break;
case BPF_RET|BPF_A:
if (save_esp) {
if (fpkt) {
POP(EBX);
POP(EDI);
}
POP(ESI);
LEAVE();
//.........这里部分代码省略.........
示例14: NAME
static void
NAME (SCM *const base_ptr, size_t nr_elems, INC_PARAM
SCM less)
{
/* Stack node declarations used to store unfulfilled partition obligations. */
typedef struct {
size_t lo;
size_t hi;
} stack_node;
static const char s_buggy_less[] = "buggy less predicate used when sorting";
#define ELT(i) base_ptr[(i)*INC]
if (nr_elems == 0)
/* Avoid lossage with unsigned arithmetic below. */
return;
if (nr_elems > MAX_THRESH)
{
size_t lo = 0;
size_t hi = nr_elems-1;
stack_node stack[STACK_SIZE];
stack_node *top = stack + 1;
while (STACK_NOT_EMPTY)
{
size_t left;
size_t right;
size_t mid = lo + (hi - lo) / 2;
SCM pivot;
/* Select median value from among LO, MID, and HI. Rearrange
LO and HI so the three values are sorted. This lowers the
probability of picking a pathological pivot value and
skips a comparison for both the left and right. */
SCM_TICK;
if (scm_is_true (scm_call_2 (less, ELT(mid), ELT(lo))))
SWAP (ELT(mid), ELT(lo));
if (scm_is_true (scm_call_2 (less, ELT(hi), ELT(mid))))
SWAP (ELT(mid), ELT(hi));
else
goto jump_over;
if (scm_is_true (scm_call_2 (less, ELT(mid), ELT(lo))))
SWAP (ELT(mid), ELT(lo));
jump_over:;
pivot = ELT(mid);
left = lo + 1;
right = hi - 1;
/* Here's the famous ``collapse the walls'' section of quicksort.
Gotta like those tight inner loops! They are the main reason
that this algorithm runs much faster than others. */
do
{
while (scm_is_true (scm_call_2 (less, ELT(left), pivot)))
{
left += 1;
/* The comparison predicate may be buggy */
if (left > hi)
scm_misc_error (NULL, s_buggy_less, SCM_EOL);
}
while (scm_is_true (scm_call_2 (less, pivot, ELT(right))))
{
right -= 1;
/* The comparison predicate may be buggy */
if (right < lo)
scm_misc_error (NULL, s_buggy_less, SCM_EOL);
}
if (left < right)
{
SWAP (ELT(left), ELT(right));
left += 1;
right -= 1;
}
else if (left == right)
{
left += 1;
right -= 1;
break;
}
}
while (left <= right);
/* Set up pointers for next iteration. First determine whether
left and right partitions are below the threshold size. If so,
ignore one or both. Otherwise, push the larger partition's
bounds on the stack and continue sorting the smaller one. */
if ((size_t) (right - lo) <= MAX_THRESH)
{
if ((size_t) (hi - left) <= MAX_THRESH)
/* Ignore both small partitions. */
POP (lo, hi);
//.........这里部分代码省略.........
示例15: bf_parse_json
static package
bf_parse_json(Var arglist, Byte next, void *vdata, Objid progr)
{
yajl_handle hand;
yajl_parser_config cfg = { 1, 1 };
yajl_status stat;
struct parse_context pctx;
pctx.top = &pctx.stack;
pctx.stack.v.type = TYPE_INT;
pctx.stack.v.v.num = 0;
pctx.mode = MODE_COMMON_SUBSET;
const char *str = arglist.v.list[1].v.str;
size_t len = strlen(str);
package pack;
int done = 0;
if (1 < arglist.v.list[0].v.num) {
if (!mystrcasecmp(arglist.v.list[2].v.str, "common-subset")) {
pctx.mode = MODE_COMMON_SUBSET;
} else if (!mystrcasecmp(arglist.v.list[2].v.str, "embedded-types")) {
pctx.mode = MODE_EMBEDDED_TYPES;
} else {
free_var(arglist);
return make_error_pack(E_INVARG);
}
}
hand = yajl_alloc(&callbacks, &cfg, NULL, (void *)&pctx);
while (!done) {
if (len == 0)
done = 1;
if (done)
stat = yajl_parse_complete(hand);
else
stat = yajl_parse(hand, (const unsigned char *)str, len);
len = 0;
if (done) {
if (stat != yajl_status_ok) {
/* clean up the stack */
while (pctx.top != &pctx.stack) {
Var v = POP(pctx.top);
free_var(v);
}
pack = make_error_pack(E_INVARG);
} else {
Var v = POP(pctx.top);
pack = make_var_pack(v);
}
}
}
yajl_free(hand);
free_var(arglist);
return pack;
}