mirror of
https://github.com/RTimothyEdwards/magic.git
synced 2026-09-07 03:21:20 +02:00
Added a ARG_UNUSED macro in utils/magic.h, which produces a simple cast to void to silence the warnings. The reasons this is used as opposed to an attribute is that most compilers should support this. Besides this, the macro can be easily searched for in the future to potentially remove (where possible) the unused parameters.
566 lines
11 KiB
C
566 lines
11 KiB
C
/*
|
|
* mzDebug.c --
|
|
*
|
|
* Routines for debugging.
|
|
*
|
|
* *********************************************************************
|
|
* * Copyright (C) 1988, 1990 Michael H. Arnold and the Regents of the *
|
|
* * University of California. *
|
|
* * Permission to use, copy, modify, and distribute this *
|
|
* * software and its documentation for any purpose and without *
|
|
* * fee is hereby granted, provided that the above copyright *
|
|
* * notice appear in all copies. The University of California *
|
|
* * makes no representations about the suitability of this *
|
|
* * software for any purpose. It is provided "as is" without *
|
|
* * express or implied warranty. Export of this software outside *
|
|
* * of the United States of America may require an export license. *
|
|
* *********************************************************************
|
|
*/
|
|
|
|
#ifndef lint
|
|
static char rcsid[] __attribute__ ((unused)) = "$$";
|
|
#endif /* not lint */
|
|
|
|
#include <stdio.h>
|
|
#include <stdint.h>
|
|
|
|
#include "utils/magic.h"
|
|
#include "utils/signals.h"
|
|
#include "textio/textio.h"
|
|
#include "utils/hash.h"
|
|
#include "utils/geometry.h"
|
|
#include "tiles/tile.h"
|
|
#include "database/database.h"
|
|
#include "utils/malloc.h"
|
|
#include "utils/list.h"
|
|
#include "utils/heap.h"
|
|
#include "mzrouter/mzrouter.h"
|
|
#include "mzrouter/mzInternal.h"
|
|
|
|
/* extra variables for use with dbx */
|
|
RoutePath *mzDPath;
|
|
Tile *mzTile;
|
|
int mz;
|
|
|
|
/* Forward declarations */
|
|
extern void mzPrintRL();
|
|
extern void mzPrintRT();
|
|
extern void mzPrintRC();
|
|
extern void mzPrintRP();
|
|
extern void mzPrintPathHead();
|
|
|
|
|
|
/*
|
|
* ----------------------------------------------------------------------------
|
|
*
|
|
* MZPrintRCListNames --
|
|
*
|
|
* Print names of route contacts linked together by external "list"
|
|
*
|
|
* Results:
|
|
* None.
|
|
*
|
|
* Side effects:
|
|
* None
|
|
*
|
|
* ----------------------------------------------------------------------------
|
|
*/
|
|
|
|
void
|
|
MZPrintRCListNames(l)
|
|
List *l;
|
|
{
|
|
RouteContact *rC;
|
|
|
|
TxPrintf("\t");
|
|
|
|
for(;l!=NULL; l=LIST_TAIL(l))
|
|
{
|
|
rC = (RouteContact *) LIST_FIRST(l);
|
|
TxPrintf("%s ",DBTypeLongNameTbl[rC->rc_routeType.rt_tileType]);
|
|
}
|
|
|
|
TxPrintf("\n");
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* ----------------------------------------------------------------------------
|
|
*
|
|
* MZPrintRLListNames --
|
|
*
|
|
* Print names of route Layers linked together by external "list"
|
|
*
|
|
* Results:
|
|
* None.
|
|
*
|
|
* Side effects:
|
|
* None
|
|
*
|
|
* ----------------------------------------------------------------------------
|
|
*/
|
|
|
|
void
|
|
MZPrintRLListNames(l)
|
|
List *l;
|
|
{
|
|
RouteLayer *rL;
|
|
|
|
TxPrintf("\t");
|
|
|
|
for(;l!=NULL; l=LIST_TAIL(l))
|
|
{
|
|
rL = (RouteLayer *) LIST_FIRST(l);
|
|
TxPrintf("%s ",DBTypeLongNameTbl[rL->rl_routeType.rt_tileType]);
|
|
}
|
|
|
|
TxPrintf("\n");
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* ----------------------------------------------------------------------------
|
|
*
|
|
* MZPrintRLs --
|
|
*
|
|
* Print list of RouteLayer strucs.
|
|
*
|
|
* Results:
|
|
* None.
|
|
*
|
|
* Side effects:
|
|
* None
|
|
*
|
|
* ----------------------------------------------------------------------------
|
|
*/
|
|
|
|
void
|
|
MZPrintRLs(rL)
|
|
RouteLayer *rL;
|
|
{
|
|
while(rL!=NULL)
|
|
{
|
|
mzPrintRL(rL);
|
|
rL = rL->rl_next;
|
|
|
|
if(rL!=NULL) TxMore("");
|
|
}
|
|
return;
|
|
}
|
|
|
|
|
|
/*
|
|
* ----------------------------------------------------------------------------
|
|
*
|
|
* mzPrintRL --
|
|
*
|
|
* Print single RouteLayer struc.
|
|
*
|
|
* Results:
|
|
* None.
|
|
*
|
|
* Side effects:
|
|
* None
|
|
*
|
|
* ----------------------------------------------------------------------------
|
|
*/
|
|
|
|
void
|
|
mzPrintRL(rL)
|
|
RouteLayer *rL;
|
|
{
|
|
List *cL;
|
|
|
|
TxPrintf("ROUTE LAYER:\n");
|
|
mzPrintRT(&(rL->rl_routeType));
|
|
TxPrintf("\tplaneNum = %d (%s)\n",rL->rl_planeNum,
|
|
DBPlaneLongNameTbl[rL->rl_planeNum]);
|
|
|
|
TxPrintf("\tcontactL = ");
|
|
for (cL=rL->rl_contactL; cL!=NULL; cL=LIST_TAIL(cL))
|
|
{
|
|
TxPrintf("%s",
|
|
DBTypeLongNameTbl[
|
|
((RouteContact*) LIST_FIRST(cL))->
|
|
rc_routeType.rt_tileType]);
|
|
|
|
if(((RouteContact*) LIST_FIRST(cL))->rc_rLayer1 == rL)
|
|
TxPrintf("(to %s) ", DBTypeLongNameTbl[
|
|
((RouteContact*) LIST_FIRST(cL))->
|
|
rc_rLayer2->rl_routeType.rt_tileType]);
|
|
else
|
|
TxPrintf("(to %s) ", DBTypeLongNameTbl[
|
|
((RouteContact*) LIST_FIRST(cL))->
|
|
rc_rLayer1->rl_routeType.rt_tileType]);
|
|
}
|
|
TxPrintf("\n");
|
|
|
|
TxPrintf("\thCost = %d\n",
|
|
rL->rl_hCost);
|
|
TxPrintf("\tvCost = %d\n",
|
|
rL->rl_vCost);
|
|
TxPrintf("\tjogCost = %d\n",
|
|
rL->rl_jogCost);
|
|
TxPrintf("\thintCost = %d\n",rL->rl_hintCost);
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
/*
|
|
* ----------------------------------------------------------------------------
|
|
*
|
|
* mzPrintRouteType --
|
|
*
|
|
* Print routeType struc.
|
|
*
|
|
* Results:
|
|
* None.
|
|
*
|
|
* Side effects:
|
|
* None
|
|
*
|
|
* ----------------------------------------------------------------------------
|
|
*/
|
|
|
|
void
|
|
mzPrintRT(rT)
|
|
RouteType *rT;
|
|
{
|
|
int i;
|
|
|
|
TxPrintf("\tROUTETYPE:\n");
|
|
TxPrintf("\t\ttileType = %s\n", DBTypeLongNameTbl[rT->rt_tileType]);
|
|
TxPrintf("\t\tactive = %s\n", (rT->rt_active ? "TRUE" : "FALSE"));
|
|
TxPrintf("\t\twidth = %d\n",rT->rt_width);
|
|
|
|
TxPrintf("\t\tspacing = ");
|
|
for (i=0;i<TT_MAXTYPES;i++)
|
|
if(rT->rt_spacing[i]>=0)
|
|
TxPrintf("%s(%d) ",DBTypeLongNameTbl[i],rT->rt_spacing[i]);
|
|
if(rT->rt_spacing[TT_SUBCELL]>=0)
|
|
TxPrintf("%s(%d) ","SUBCELL",rT->rt_spacing[TT_SUBCELL]);
|
|
TxPrintf("\n");
|
|
|
|
TxPrintf("\t\teffWidth = %d\n",rT->rt_effWidth);
|
|
|
|
for (i=0;i<TT_MAXTYPES;i++)
|
|
if(rT->rt_bloatBot[i]>=0)
|
|
TxPrintf("%s(%d) ",DBTypeLongNameTbl[i],rT->rt_bloatBot[i]);
|
|
if(rT->rt_spacing[TT_SUBCELL]>=0)
|
|
TxPrintf("%s(%d) ","SUBCELL",rT->rt_bloatBot[TT_SUBCELL]);
|
|
TxPrintf("\n");
|
|
|
|
for (i=0;i<TT_MAXTYPES;i++)
|
|
if(rT->rt_bloatTop[i]>=0)
|
|
TxPrintf("%s(%d) ",DBTypeLongNameTbl[i],rT->rt_bloatTop[i]);
|
|
if(rT->rt_spacing[TT_SUBCELL]>=0)
|
|
TxPrintf("%s(%d) ","SUBCELL",rT->rt_bloatTop[TT_SUBCELL]);
|
|
TxPrintf("\n");
|
|
|
|
TxPrintf("\t\tnext = %s\n",
|
|
(rT->rt_next ? DBTypeLongNameTbl[rT->rt_next->rt_tileType] : "(nil)"));
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
/*
|
|
* ----------------------------------------------------------------------------
|
|
*
|
|
* MZPrintRCs --
|
|
*
|
|
* Print list of RouteLayer strucs.
|
|
*
|
|
* Results:
|
|
* None.
|
|
*
|
|
* Side effects:
|
|
* None
|
|
*
|
|
* ----------------------------------------------------------------------------
|
|
*/
|
|
|
|
void
|
|
MZPrintRCs(rC)
|
|
RouteContact *rC;
|
|
{
|
|
while(rC!=NULL)
|
|
{
|
|
mzPrintRC(rC);
|
|
rC = rC->rc_next;
|
|
if(rC!=NULL) TxMore("");
|
|
}
|
|
return;
|
|
}
|
|
|
|
|
|
/*
|
|
* ----------------------------------------------------------------------------
|
|
*
|
|
* mzPrintRC --
|
|
*
|
|
* Print single RouteContact struc.
|
|
*
|
|
* Results:
|
|
* None.
|
|
*
|
|
* Side effects:
|
|
* None
|
|
*
|
|
* ----------------------------------------------------------------------------
|
|
*/
|
|
|
|
void
|
|
mzPrintRC(rC)
|
|
RouteContact *rC;
|
|
{
|
|
TxPrintf("ROUTE CONTACT:\n");
|
|
mzPrintRT(&(rC->rc_routeType));
|
|
|
|
TxPrintf("\trLayer1 = %s\n",
|
|
DBTypeLongNameTbl[rC->rc_rLayer1->rl_routeType.rt_tileType]);
|
|
TxPrintf("\trLayer2 = %s\n",
|
|
DBTypeLongNameTbl[rC->rc_rLayer2->rl_routeType.rt_tileType]);
|
|
|
|
TxPrintf("\tcost = %d\n",
|
|
rC->rc_cost);
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
* ----------------------------------------------------------------------------
|
|
*
|
|
* mzPrintRPs --
|
|
*
|
|
* Print list of RoutePath strucs.
|
|
*
|
|
* Results:
|
|
* None.
|
|
*
|
|
* Side effects:
|
|
* None
|
|
*
|
|
* ----------------------------------------------------------------------------
|
|
*/
|
|
|
|
void
|
|
mzPrintRPs(path)
|
|
RoutePath *path;
|
|
{
|
|
while(path!=NULL)
|
|
{
|
|
mzPrintRP(path);
|
|
path = path->rp_back;
|
|
}
|
|
return;
|
|
}
|
|
|
|
|
|
/*
|
|
* ----------------------------------------------------------------------------
|
|
*
|
|
* mzPrintRP --
|
|
*
|
|
* Print single RoutePath struc.
|
|
*
|
|
* Results:
|
|
* None.
|
|
*
|
|
* Side effects:
|
|
* None
|
|
*
|
|
* ----------------------------------------------------------------------------
|
|
*/
|
|
|
|
void
|
|
mzPrintRP(path)
|
|
RoutePath *path;
|
|
{
|
|
TxPrintf("ROUTE PATH:");
|
|
TxPrintf(" layer = %s",
|
|
DBTypeLongNameTbl[path->rp_rLayer->rl_routeType.rt_tileType]);
|
|
TxPrintf(" entry = (%d, %d)", path->rp_entry.p_x, path->rp_entry.p_y);
|
|
TxPrintf(" cost = %.0f",
|
|
(double)(path->rp_cost));
|
|
TxPrintf(" extCode = { ");
|
|
if (path->rp_extendCode & EC_RIGHT)
|
|
{
|
|
TxPrintf("right ");
|
|
}
|
|
if (path->rp_extendCode & EC_LEFT)
|
|
{
|
|
TxPrintf("left ");
|
|
}
|
|
if (path->rp_extendCode & EC_UP)
|
|
{
|
|
TxPrintf("up");
|
|
}
|
|
if (path->rp_extendCode & EC_DOWN)
|
|
{
|
|
TxPrintf("down ");
|
|
}
|
|
if (path->rp_extendCode & (EC_UDCONTACTS | EC_LRCONTACTS))
|
|
{
|
|
TxPrintf("contacts ");
|
|
}
|
|
|
|
TxPrintf("}\n");
|
|
|
|
return;
|
|
}
|
|
|
|
/* mzPrintPathHead -- */
|
|
void
|
|
mzPrintPathHead(path)
|
|
RoutePath *path;
|
|
{
|
|
|
|
if(path==NULL)
|
|
{
|
|
TxPrintf(" NULL Path.\n");
|
|
}
|
|
else
|
|
{
|
|
TxPrintf(" point=(%d,%d), layer=%s, orient = '%c'",
|
|
path->rp_entry.p_x,
|
|
path->rp_entry.p_y,
|
|
DBTypeLongNameTbl[path->rp_rLayer->rl_routeType.rt_tileType],
|
|
path->rp_orient);
|
|
TxPrintf(", togo=%.0f",
|
|
(double)(path->rp_togo));
|
|
TxPrintf(", cost=%.0f\n",
|
|
(double)(path->rp_cost));
|
|
|
|
TxPrintf(" extendCode = { ");
|
|
if (path->rp_extendCode & EC_RIGHT)
|
|
{
|
|
TxPrintf("right ");
|
|
}
|
|
if (path->rp_extendCode & EC_LEFT)
|
|
{
|
|
TxPrintf("left ");
|
|
}
|
|
if (path->rp_extendCode & EC_UP)
|
|
{
|
|
TxPrintf("up ");
|
|
}
|
|
if (path->rp_extendCode & EC_DOWN)
|
|
{
|
|
TxPrintf("down ");
|
|
}
|
|
if (path->rp_extendCode & (EC_LRCONTACTS | EC_UDCONTACTS))
|
|
{
|
|
TxPrintf("contacts ");
|
|
}
|
|
|
|
TxPrintf("}\n");
|
|
}
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* ----------------------------------------------------------------------------
|
|
*
|
|
* mzDumpTags --
|
|
*
|
|
* Dump tags on data tiles (for debugging).
|
|
*
|
|
* Results:
|
|
* None.
|
|
*
|
|
* Side effects:
|
|
* info written to file or via TxPrintf()
|
|
*
|
|
* ----------------------------------------------------------------------------
|
|
*/
|
|
|
|
void
|
|
mzDumpTags(area)
|
|
Rect *area;
|
|
{
|
|
int mzDumpTagsFunc();
|
|
SearchContext scx;
|
|
|
|
/* mzke sure mzRouteUse is initialed */
|
|
if(mzRouteUse == NULL)
|
|
{
|
|
TxPrintf("Can not dump tags, until mzRouteUse is initialed.\n");
|
|
TxPrintf("(Do an iroute first.)\n");
|
|
return;
|
|
}
|
|
|
|
/* look at all data tiles under box. */
|
|
scx.scx_area = *area;
|
|
scx.scx_trans = GeoIdentityTransform;
|
|
scx.scx_use = mzRouteUse;
|
|
|
|
(void) DBTreeSrTiles(
|
|
&scx,
|
|
&DBAllTypeBits,
|
|
0, /* look inside all subcells */
|
|
mzDumpTagsFunc,
|
|
(ClientData) NULL);
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
/*
|
|
* ----------------------------------------------------------------------------
|
|
*
|
|
* mzDumpTagsFunc --
|
|
*
|
|
* Filter function called above, dumps tag info for all tiles in search area.
|
|
*
|
|
* Results:
|
|
* Returns 0 always.
|
|
*
|
|
* Side effects:
|
|
* Dumps info associated with tile.
|
|
*
|
|
* ----------------------------------------------------------------------------
|
|
*/
|
|
|
|
int
|
|
mzDumpTagsFunc(tile, cxp)
|
|
Tile *tile;
|
|
TreeContext *cxp;
|
|
{
|
|
ARG_UNUSED(cxp);
|
|
Rect r;
|
|
|
|
/* if tile has no client data attached, skip it */
|
|
if (tile->ti_client == (ClientData)CLIENTDEFAULT)
|
|
return 0;
|
|
|
|
/* Get boundary of tile */
|
|
TITORECT(tile, &r);
|
|
|
|
/* print tile bounds */
|
|
TxPrintf("tile %lx (x: %d to %d, y: %d to %d)\n",
|
|
(intmax_t) (pointertype) tile, r.r_xbot, r.r_xtop, r.r_ybot, r.r_ytop);
|
|
|
|
/* dump rects attached to client field */
|
|
{
|
|
List *l;
|
|
for(l=(List *) (tile->ti_client); l!=NULL; l=LIST_TAIL(l))
|
|
{
|
|
Rect *rTerm = (Rect *) LIST_FIRST(l);
|
|
|
|
TxPrintf("\tattached dest area (x: %d to %d, y: %d to %d)\n",
|
|
rTerm->r_xbot,
|
|
rTerm->r_xtop,
|
|
rTerm->r_ybot,
|
|
rTerm->r_ytop);
|
|
}
|
|
}
|
|
|
|
/* continue search */
|
|
return 0;
|
|
}
|
|
|