/* assertEqualString() displays the values of the two strings. */ int test_assert_equal_string(const char *file, int line, const char *v1, const char *e1, const char *v2, const char *e2, void *extra) { ++assertions; if (v1 == NULL || v2 == NULL) { if (v1 == v2) { msg[0] = '\0'; return (1); } } else if (strcmp(v1, v2) == 0) { msg[0] = '\0'; return (1); } failures ++; if (!verbose && previous_failures(file, line)) return (0); fprintf(stderr, "%s:%d: Assertion failed: Strings not equal\n", file, line); fprintf(stderr, " %s = ", e1); strdump(v1); fprintf(stderr, " (length %d)\n", v1 == NULL ? 0 : strlen(v1)); fprintf(stderr, " %s = ", e2); strdump(v2); fprintf(stderr, " (length %d)\n", v2 == NULL ? 0 : strlen(v2)); report_failure(extra); return (0); }
//---------------------------------------------------------- LCLine* LCLine_new(char* I,char* P,char* Pi,char* KP) { LCLine* lcl=(LCLine*)malloc(sizeof(LCLine)); lcl->I = strdump(I); lcl->P = strdump(P); lcl->Pi = strdump(Pi); lcl->KP = strdump(KP); lcl->prev = NULL; lcl->next = NULL; return lcl; }//LCLine_new()
// Dump out a single object / or all objects reachable from this one. static void innerDumpObj ( FILE *f // file to dump o , int level // indent level , Obj* obj // root object , bool recurse) // whether to recurse into other objects. { int indent = 2 * level + (level == 0 ? 1 : 3); int tag, id, size; size = _objSize (obj); tag = _getObjTag (obj); id = _getObjId (obj); switch (id & _MaskObjAnchored) { case _ObjFixedThunk : fprintf (f, "%*cThunk @ %p (%d bytes)\n", indent, ' ', obj, size); fprintf (f, "%*c , tag = 0x%06x\n", indent, ' ', tag); fprintf (f, "%*c , func = %p\n", indent, ' ', ((Thunk*)obj)->func); fprintf (f, "%*c , arity = %d\n", indent, ' ', ((Thunk*)obj)->arity); fprintf (f, "%*c , args = %d\n", indent, ' ', ((Thunk*)obj)->args); for (uint32_t k = 0 ; k < ((Thunk*)obj)->args ; k++) { if (recurse) innerDumpObj (f, level + 1, ((Thunk*)obj)->a [k], recurse); else fprintf (f, "%*c , a [%3d] = %p\n", indent, ' ', k, ((Thunk*)obj)->a [k]); } fprintf (f, "%*c }\n", indent, ' ') ; break; case _ObjFixedData : fprintf (f, "%*cData @ %p (%d bytes) {\n", indent, ' ', obj, size); fprintf (f, "%*c , tag = 0x%06x\n", indent, ' ', tag); fprintf (f, "%*c , arity = %d\n", indent, ' ', ((Data*)obj)->arity); for (uint32_t k = 0 ; k < ((Data*)obj)->arity ; k++) { if (recurse) innerDumpObj (f, level + 1, ((Data*)obj)->a [k], recurse) ; else fprintf (f, "%*c , a [%3d] = %p\n", indent, ' ', k, ((Data*)obj)->a [k]) ; } fprintf (f, "%*c }\n", indent, ' ') ; break ; case _ObjFixedDataR : fprintf (f, "%*cDataR @ %p (%d bytes) {\n", indent, ' ', obj, size); fprintf (f, "%*c , tag = 0x%06x\n", indent, ' ', tag); fprintf (f, "%*c , size = %d\n", indent, ' ', ((DataR*)obj)->size); fprintf (f, "%*c , payload = ", indent, ' '); hexdump (f, ((DataR*)obj)->payload, ((DataR*)obj)->size - offsetof (DataR, payload)); fprintf (f, "%*c -> ", indent, ' ') ; strdump (f, ((DataR*)obj)->payload, ((DataR*)obj)->size - offsetof (DataR, payload)); fprintf (f, "%*c }\n", indent, ' ') ; break ; case _ObjFixedDataM : fprintf (f, "%*cDataM @ %p (%d bytes) {\n", indent, ' ', obj, size); fprintf (f, "%*c , tag = 0x%06x\n", indent, ' ', tag); fprintf (f, "%*c , size = %d\n", indent, ' ', ((DataM*)obj)->size); fprintf (f, "%*c , ptrCount = %d\n", indent, ' ', ((DataM*)obj)->ptrCount); fprintf (f, "%*c , payload = ", indent, ' '); hexdump (f, ((DataM*)obj)->payload, ((DataM*)obj)->size - offsetof (DataM, payload)); fprintf (f, "%*c -> ", indent, ' '); strdump (f, ((DataM*)obj)->payload, ((DataM*)obj)->size - offsetof (DataM, payload)); fprintf (f, "%*c }\n", indent, ' '); break; case _ObjFixedSuspIndir : fprintf (f, "%*cSuspIndir @ %p (%d bytes) {\n", indent, ' ', obj, size); fprintf (f, "%*c , tag = 0x%06x\n", indent, ' ', tag); innerDumpObj (f, level + 1, ((SuspIndir*)obj)->obj, recurse); fprintf (f, "%*c arity = %d\n", indent, ' ', ((SuspIndir*)obj)->arity); for (uint32_t k = 0; k < ((SuspIndir*)obj)->arity; k++) innerDumpObj (f, level + 1, ((SuspIndir*)obj)->a [k], recurse); fprintf (f, "%*c }\n", indent, ' ') ; break ; default : fprintf (f, "%*cUnknown @ %p (%d bytes) {\n", indent, ' ', obj, size); fprintf (f, "%*c , tag = 0x%06x\n", indent, ' ', tag); fprintf (f, "%*c , id : 0x%x : ", indent, ' ', id); hexdump (f, (unsigned char *) obj, size); fprintf (f, "%*c }\n", indent, ' '); } }