/*---------------------------------------------------------------------*/ obj_t bgl_write_unknown( obj_t o, obj_t op ) { if( POINTERP( o ) ) { PRINTF2( op, 40, "#<???:%ld:%08lx>", TYPE( o ), (unsigned long)o ); } else { PRINTF1( op, 40, "#<???:%08lx>", (unsigned long)o ); } return op; }
static LispObj * LispStringTrim(LispBuiltin *builtin, int left, int right, int inplace) /* string-{,left-,right-}trim character-bag string */ { unsigned char *string; long start, end, length; LispObj *ochars, *ostring; ostring = ARGUMENT(1); ochars = ARGUMENT(0); if (!POINTERP(ochars) || !(XSTRINGP(ochars) || XCONSP(ochars))) { if (ARRAYP(ochars) && ochars->data.array.rank == 1) ochars = ochars->data.array.list; else LispDestroy("%s: %s is not a sequence", STRFUN(builtin), STROBJ(ochars)); } CHECK_STRING(ostring); string = (unsigned char*)THESTR(ostring); length = STRLEN(ostring); start = 0; end = length; if (XSTRINGP(ochars)) { unsigned char *chars = (unsigned char*)THESTR(ochars); long i, clength = STRLEN(ochars); if (left) { for (; start < end; start++) { for (i = 0; i < clength; i++) if (string[start] == chars[i]) break; if (i >= clength) break; } } if (right) { for (--end; end >= 0; end--) { for (i = 0; i < clength; i++) if (string[end] == chars[i]) break; if (i >= clength) break; } ++end; } } else { LispObj *ochar, *list; if (left) { for (; start < end; start++) { for (list = ochars; CONSP(list); list = CDR(list)) { ochar = CAR(list); if (SCHARP(ochar) && string[start] == SCHAR_VALUE(ochar)) break; } if (!CONSP(list)) break; } } if (right) { for (--end; end >= 0; end--) { for (list = ochars; CONSP(list); list = CDR(list)) { ochar = CAR(list); if (SCHARP(ochar) && string[end] == SCHAR_VALUE(ochar)) break; } if (!CONSP(list)) break; } ++end; } } if (start == 0 && end == length) return (ostring); length = end - start; if (inplace) { CHECK_STRING_WRITABLE(ostring); memmove(string, string + start, length); string[length] = '\0'; STRLEN(ostring) = length; } else { string = LispMalloc(length + 1); memcpy(string, THESTR(ostring) + start, length); string[length] = '\0'; ostring = LSTRING2((char*)string, length); } return (ostring); }