📄 option.c
字号:
i = OE_RECOGNISED; h->flags |= FLG_LOGREALLOCS; } break; case 'M': if (matchoption(o, "MEDIUMBOUND")) if (*a == '\0') i = OE_NOARGUMENT; else if (a[readnumber(a, (long *) &n, 1)] != '\0') i = OE_BADNUMBER; else { if (n == 0) h->prof.mbound = MP_MEDIUMBOUND; else h->prof.mbound = n; i = OE_RECOGNISED; } break; case 'N': if (matchoption(o, "NOFREE")) if (*a == '\0') i = OE_NOARGUMENT; else if (a[readnumber(a, (long *) &n, 1)] != '\0') i = OE_BADNUMBER; else { if (h->alloc.fmax = n) h->alloc.flags |= FLG_NOFREE; else h->alloc.flags &= ~FLG_NOFREE; i = OE_RECOGNISED; } else if (matchoption(o, "NOPROTECT")) { if (*a != '\0') i = OE_IGNARGUMENT; else i = OE_RECOGNISED; h->flags |= FLG_NOPROTECT; } break; case 'O': if (matchoption(o, "OFLOWBYTE")) if (*a == '\0') i = OE_NOARGUMENT; else if (a[readnumber(a, (long *) &n, 1)] != '\0') i = OE_BADNUMBER; else if (n > 0xFF) i = OE_BIGNUMBER; else { h->alloc.obyte = n; i = OE_RECOGNISED; } else if (matchoption(o, "OFLOWSIZE")) if (*a == '\0') i = OE_NOARGUMENT; else if ((a[readnumber(a, (long *) &n, 1)] != '\0') || ((n == 0) && (h->alloc.flags & FLG_PAGEALLOC))) i = OE_BADNUMBER; else { h->alloc.oflow = __mp_poweroftwo(n); if (h->alloc.flags & FLG_PAGEALLOC) h->alloc.oflow = __mp_roundup(h->alloc.oflow, h->alloc.heap.memory.page); i = OE_RECOGNISED; } else if (matchoption(o, "OFLOWWATCH")) { if (*a != '\0') i = OE_IGNARGUMENT; else i = OE_RECOGNISED;#if MP_WATCH_SUPPORT h->alloc.flags |= FLG_OFLOWWATCH;#endif /* MP_WATCH_SUPPORT */ } break; case 'P': if (matchoption(o, "PAGEALLOC")) if (*a == '\0') i = OE_NOARGUMENT; else if (matchoption(a, "LOWER")) {#if MP_PROTECT_SUPPORT h->alloc.flags |= FLG_PAGEALLOC; if (h->alloc.oflow == 0) h->alloc.oflow = 1; h->alloc.oflow = __mp_roundup(h->alloc.oflow, h->alloc.heap.memory.page);#endif /* MP_PROTECT_SUPPORT */ i = OE_RECOGNISED; } else if (matchoption(a, "UPPER")) {#if MP_PROTECT_SUPPORT h->alloc.flags |= FLG_PAGEALLOC | FLG_ALLOCUPPER; if (h->alloc.oflow == 0) h->alloc.oflow = 1; h->alloc.oflow = __mp_roundup(h->alloc.oflow, h->alloc.heap.memory.page);#endif /* MP_PROTECT_SUPPORT */ i = OE_RECOGNISED; } else i = OE_LOWERORUPPER; else if (matchoption(o, "PRESERVE")) { if (*a != '\0') i = OE_IGNARGUMENT; else i = OE_RECOGNISED; h->alloc.flags |= FLG_PRESERVE; } else if (matchoption(o, "PROF")) { if (*a != '\0') i = OE_IGNARGUMENT; else i = OE_RECOGNISED; h->prof.profiling = 1; } else if (matchoption(o, "PROFFILE")) if (*a == '\0') i = OE_NOARGUMENT; else { p = a; i = OE_RECOGNISED; } else if (matchoption(o, "PROGFILE")) if (*a == '\0') i = OE_NOARGUMENT; else { h->alloc.heap.memory.prog = a; i = OE_RECOGNISED; } break; case 'R': if (matchoption(o, "REALLOCSTOP")) if (*a == '\0') i = OE_NOARGUMENT; else if (a[readnumber(a, (long *) &n, 1)] != '\0') i = OE_BADNUMBER; else { h->rstop = n; i = OE_RECOGNISED; } break; case 'S': if (matchoption(o, "SAFESIGNALS")) { if (*a != '\0') i = OE_IGNARGUMENT; else i = OE_RECOGNISED; h->flags |= FLG_SAFESIGNALS; } else if (matchoption(o, "SHOWALL")) { if (*a != '\0') i = OE_IGNARGUMENT; else i = OE_RECOGNISED; h->flags |= FLG_SHOWFREE | FLG_SHOWFREED | FLG_SHOWUNFREED | FLG_SHOWMAP | FLG_SHOWSYMBOLS; } else if (matchoption(o, "SHOWFREE")) { if (*a != '\0') i = OE_IGNARGUMENT; else i = OE_RECOGNISED; h->flags |= FLG_SHOWFREE; } else if (matchoption(o, "SHOWFREED")) { if (*a != '\0') i = OE_IGNARGUMENT; else i = OE_RECOGNISED; h->flags |= FLG_SHOWFREED; } else if (matchoption(o, "SHOWMAP")) { if (*a != '\0') i = OE_IGNARGUMENT; else i = OE_RECOGNISED; h->flags |= FLG_SHOWMAP; } else if (matchoption(o, "SHOWSYMBOLS")) { if (*a != '\0') i = OE_IGNARGUMENT; else i = OE_RECOGNISED; h->flags |= FLG_SHOWSYMBOLS; } else if (matchoption(o, "SHOWUNFREED")) { if (*a != '\0') i = OE_IGNARGUMENT; else i = OE_RECOGNISED; h->flags |= FLG_SHOWUNFREED; } else if (matchoption(o, "SMALLBOUND")) if (*a == '\0') i = OE_NOARGUMENT; else if (a[readnumber(a, (long *) &n, 1)] != '\0') i = OE_BADNUMBER; else { if (n == 0) h->prof.sbound = MP_SMALLBOUND; else h->prof.sbound = n; i = OE_RECOGNISED; } break; case 'T': if (matchoption(o, "TRACE")) { if (*a != '\0') i = OE_IGNARGUMENT; else i = OE_RECOGNISED; h->trace.tracing = 1; h->alloc.heap.tracing = 1; } else if (matchoption(o, "TRACEFILE")) if (*a == '\0') i = OE_NOARGUMENT; else { t = a; i = OE_RECOGNISED; } break; case 'U': if (matchoption(o, "UNFREEDABORT")) if (*a == '\0') i = OE_NOARGUMENT; else if (a[readnumber(a, (long *) &n, 1)] != '\0') i = OE_BADNUMBER; else { h->uabort = n; i = OE_RECOGNISED; } else if (matchoption(o, "USEDEBUG")) { if (*a != '\0') i = OE_IGNARGUMENT; else i = OE_RECOGNISED; h->syms.lineinfo = 1; } else if (matchoption(o, "USEMMAP")) { if (*a != '\0') i = OE_IGNARGUMENT; else i = OE_RECOGNISED;#if MP_MMAP_SUPPORT if (h->alloc.list.size == 0) h->alloc.heap.memory.flags |= FLG_USEMMAP;#endif /* MP_MMAP_SUPPORT */ } break; default: break; } /* Now check the error code returned from attempting to match * the keyword and report if anything went wrong. */ switch (i) { case OE_UNRECOGNISED: if (*a == '\0') __mp_error(ET_MAX, AT_MAX, NULL, 0, "unrecognised option " "`%s'\n", o); else __mp_error(ET_MAX, AT_MAX, NULL, 0, "unrecognised option " "`%s=%s'\n", o, a); break; case OE_NOARGUMENT: __mp_error(ET_MAX, AT_MAX, NULL, 0, "missing argument for " "option `%s'\n", o); break; case OE_BADNUMBER: __mp_error(ET_MAX, AT_MAX, NULL, 0, "bad numeric argument `%s' " "for option `%s'\n", a, o); break; case OE_BADRANGE: __mp_error(ET_MAX, AT_MAX, NULL, 0, "bad numeric range `%s' " "for option `%s'\n", a, o); break; case OE_BIGNUMBER: __mp_error(ET_MAX, AT_MAX, NULL, 0, "numeric argument `%s' is " "too large for option `%s'\n", a, o); break; case OE_LOWERORUPPER: __mp_error(ET_MAX, AT_MAX, NULL, 0, "must specify `LOWER' or " "`UPPER' for option `%s'\n", o); break; case OE_IGNARGUMENT: __mp_warn(ET_MAX, AT_MAX, NULL, 0, "ignoring argument `%s' for " "option `%s'\n", a, o); break; default: break; } } else if (*a != '\0') __mp_warn(ET_MAX, AT_MAX, NULL, 0, "missing option for argument " "`%s'\n", a); } /* Check the validity of the profiling allocation boundaries. There is * potential for error if either of the small or large bounds overlap the * medium bound and the medium bound is either 1 or the maximum sized * integer, but it will just result in wrong profiling and nothing more. */ if (h->prof.sbound >= h->prof.mbound) { __mp_error(ET_MAX, AT_MAX, NULL, 0, "small allocation boundary `%lu' " "overlaps medium allocation boundary `%lu'\n", h->prof.sbound, h->prof.mbound); h->prof.sbound = h->prof.mbound - 1; } if (h->prof.lbound <= h->prof.mbound) { __mp_error(ET_MAX, AT_MAX, NULL, 0, "large allocation boundary `%lu' " "overlaps medium allocation boundary `%lu'\n", h->prof.lbound, h->prof.mbound); h->prof.lbound = h->prof.mbound + 1; } /* Show the quick-reference option summary if it was requested. */ if (l != 0) showoptions(); /* Set up the filenames of the log, profiling and tracing files if they * were overridden. */ if (f != NULL) h->log = __mp_logfile(&h->alloc.heap.memory, f); if (p != NULL) h->prof.file = __mp_proffile(&h->alloc.heap.memory, p); if (t != NULL) h->trace.file = __mp_tracefile(&h->alloc.heap.memory, t);}/* Set mpatrol flags after the library has been initialised. */staticunsigned longsetflags(infohead *h, unsigned long f, int u){ unsigned long i; if (f == 0) return 0; for (i = 1; i != 0; i <<= 1) if (f & i) { f &= ~i; switch (i) { case OPT_CHECKALLOCS: if (u == 0) h->flags |= FLG_CHECKALLOCS; else h->flags &= ~FLG_CHECKALLOCS; break; case OPT_CHECKREALLOCS: if (u == 0) h->flags |= FLG_CHECKREALLOCS; else h->flags &= ~FLG_CHECKREALLOCS; break; case OPT_CHECKFREES: if (u == 0) h->flags |= FLG_CHECKFREES; else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -