bsp
global.h
00001 #ifndef _GLOBAL_H_
00002 #define _GLOBAL_H_
00003 
00004 #include "bsppch.h"
00005 
00006 
00007 typedef unsigned char uint8;
00008 typedef short int16;
00009 typedef unsigned short uint16;
00010 
00011 //these defines are needed early
00012 #define MAX_KEY         64              // kp
00013 #define MAX_VALUE       1024    // kp
00014 #define MAXTOKEN        MAX_VALUE
00015 #define MAXCOMTOKEN     1024
00016 
00017 #define MAX_MOUSE_EVENT_TYPES   10
00018 #define MAX_EXPORTERS                   16
00019 
00020 #include "bsphdr.h"
00021 #include "util.h"
00022 #include "tokenizer.h"
00023 #include "qtype.h"
00024 #include "settings.h"
00025 #include "wutil.h"
00026 #include "window.h"
00027 #include "wcontrol.h"
00028 #include "wdialog.h"
00029 #include "dialogs.h"
00030 #include "setbrush.h"
00031 #include "ent.h"
00032 #include "map.h"
00033 #include "eclass.h"
00034 #include "clipper.h"
00035 #include "group.h"
00036 #include "formats.h"
00037 #include "texture.h"
00038 #include "xyview.h"
00039 #include "editwin.h"
00040 #include "keypair.h"
00041 #include "about.h"
00042 #include "bspwin.h"
00043 #include "help.h"
00044 #include "console.h"
00045 #include "monster.h"
00046 #include "surface.h"
00047 #include "commands.h"
00048 #include "menu.h"
00049 #include "res\resource.h"
00050 
00051 #pragma warning(disable:4996)
00052 
00053 //BSP Window Messages
00054 #define WM_SHORTCUT_CHANGED             WM_USER+1       //(0, 0)
00055 
00056 //this is for win98 compat
00057 #define OPENFILENAMESTRUCTSIZE OPENFILENAME_SIZE_VERSION_400 //sizeof(OPENFILENAME);
00058 
00059 //util
00060 
00061 extern char *RemoveTrailingSlash(char *dir);            //remove trailing slash from a directory
00062 extern int VerifyPak(Path pakname);                     // Determines if .pak file is a valid one.
00063 extern void StripExtension (char *path);
00064 extern char *COM_Parse (char *data);
00065 extern unsigned char *file_get_contents(Path filename, int *outlen=0);
00066 extern DWORD expand_path(char *path, char *out, int outsize = MAX_PATH);
00067 extern bool file_exists(char *);
00068 extern bool Bsp_ShellExecute(HWND hwnd,char *op,Path file, char*param, char *start_dir, int show=SW_SHOW);
00069 extern bool SetFocusUnderMouse(HWND hwnd);
00070 extern void CenterWindow(HWND hwnd);
00071 extern char *FixFloatString(char *fstr);                // truncate trailing zeroes, 1.0000 -> 1.0
00072 extern void FixOverflow(float& number, float range);
00073 
00074 #define LB_3DCOLORS 1
00075 extern HBITMAP load_bitmap(Path filename, int flags);
00076 
00077 #define LoopProblem(x)
00078 #ifndef LoopProblem
00079 extern void LoopProblem(char *);                                // For finding infinite loops.
00080 #endif
00081 extern bool isPowerof2(int num);
00082 extern int nextPowerof2(int num);
00083 extern char *stristr(char *src, char *find);
00084 extern int compare_strings_int_parts(char *string1, char *string2);
00085 extern int snprintf(char *buffer, int count, const char *format, ...);
00086 //extern char *b_strncpy( char *strDest, const char *strSource, size_t count );
00087 extern void Msgbox(char *msg, ...);
00088 extern void Caption(char *msg, ...);
00089 extern bool GroupParse(Tokenizer *script);
00090 extern void LogFileReset(Path logfile);
00091 extern "C" void sysprintf(char *text, ...);
00092 extern void syserror(char *text, ...);
00093 __declspec(noreturn)
00094 extern void sysfatal(char *error, ...);
00095 extern void ExtractFileBase (char *path, char *dest, int includeExtension);
00096 extern int rint(float i);
00097 
00098 extern char com_token[MAXCOMTOKEN];
00099 
00100 typedef struct groupinfo_s
00101 {
00102     char name[64];
00103     COLORREF color;
00104     int visible;
00105 } groupinfo_t;
00106 
00107 typedef struct camerainfo_s
00108 {
00109     float x,y,z;
00110     int roll,pitch,yaw;
00111 } camerainfo_t;
00112 
00113 extern void Parse_NextLine(char **text);
00114 extern void Parse_RTrim(char **text);
00115 extern void Parse_LTrim(char **text);
00116 extern void Parse_Trim(char **text);
00117 extern void Parse_EatWS(char **text);
00118 extern int Parse_Quoted(char **text, char *out, int outlen);
00119 extern COLORREF Parse_Color(char *text);
00120 extern int Parse_BSPGroups(char *text);
00121 extern int Parse_BSPGroupInfo(char *text, groupinfo_t *gi);
00122 extern int Parse_BSPFavorites(char *text);
00123 extern int Parse_BSPNextFav(char **text, char *fav, int favlen);
00124 extern int Parse_BSPCameras(char *text);
00125 extern int Parse_BSPCamInfo(char *text, camerainfo_t *ci);
00126 extern int Parse_BSPMapType(char *text);
00127 
00128 //bsp
00129 extern void MapChanged();
00130 extern void BSPHelp(char *, char *);
00131 extern void BSPHelpAdd(char *);
00132 extern void BSPHelpAddV(char *, ...);
00133 extern void ConScrollEnd();
00134 extern void ConWrite(char *text);
00135 extern void ConWriteV(char *text, ...);
00136 extern void SetCaptionHeight();
00137 
00138 extern TBSPApp *frame;                                          // BSP windows.  Main frame
00139 extern TBSPWindow *client;                                      // MDI client.
00140 extern TTextureWindow *texWindow;                       // Texture browser
00141 extern TXYViewWindow **xyWindow;                        // 2D View
00142 extern TEditWindow *editWindow;                         // 3D View
00143 extern EntityView *kpWindow;                            // Entity Browser
00144 extern TGroupWindow *groupWindow;                       // Group Browser
00145 extern THelpWindow *helpWindow;                         // Help Window
00146 extern TMonsterWindow *monsterWindow;           // Monster browser
00147 extern TSurfaceWindow *surfaceWindow;           // Surface property window.
00148 extern BSPConsole *wconsole;                            // console window
00149 extern PaletteWindow *palettewindow;            // palette viewer
00150 
00151 extern map *copymap;
00152 extern int KillAllWindows;
00153 extern RECT EditClip;
00154 extern RECT RenderClip;
00155 extern SIZE EditSize;
00156 extern SIZE RenderSize;
00157 extern int CaptionHeight;
00158 extern HFONT g_hCaptionFont;
00159 
00160 extern int normalExit;
00161 extern bool savetoini;
00162 
00163 extern vec3_t *CP[2];                                                   // array to hold clipped pts...
00164 extern vec3_t SPoints[CPT];
00165 extern POINT FSPoints[CPT];
00166 extern vec3_t *tpts;
00167 namespace Bsp
00168 {
00169 extern int cur, lst;
00170 }
00171 //extern vec3_t **pt;
00172 extern SetBrush **besthits;
00173 extern int numhits;
00174 
00175 
00176 //bsp2
00177 extern TBSPSplashWindow *splash;                                // Splash screen
00178 extern bool BSP_Active;                                                 // If BSP is not in foreground, disable
00179 extern bool KillAccels;                                                 // disable KB accelerators
00180 //extern bool BSP_AutoLoad;
00181 extern int LUMP_NAME_LENGTH;                                    // Q1 texture name len = 16, Q2 = 32
00182 #define LUMP_NAME_LENGTH_MAX    48                              // for automatic memory allocation
00183 
00184 extern int PALSTEP;
00185 extern int timeRender;
00186 extern DWORD startTime;
00187 extern DWORD endTime;
00188 extern int cColorBits;
00189 extern int cDepthBits;
00190 extern int cTextureAlpha;
00191 extern int singleBuffer;
00192 extern WRebar *rebar;
00193 extern WToolbar **cbars;
00194 extern WStatus *status;
00195 extern void status_ShowOpenMapsMenu();          // map gadget
00196 extern KBSettings *kbset;
00197 extern WImageList imagelist;
00198 
00199 extern HINSTANCE hInstance;                                     // app hinstance
00200 extern HMENU hMenu;                                                     // main menu handle
00201 extern HACCEL acceltable;                                       // accelerator table
00202 #define ID_REBAR  102223
00203 
00204 //status bar parts
00205 #define STATUS_INFO   0
00206 #define STATUS_MODE   1
00207 #define STATUS_HEIGHT 2
00208 #define STATUS_GROUP  3
00209 #define STATUS_POS    4
00210 #define STATUS_DELTA  5
00211 #define STATUS_BOUND  6
00212 #define STATUS_MAP    7
00213 
00214 //texture
00215 extern void UpdateTextureTransFlags(face_t *f);
00216 extern int GetPaletteIndex(int pSize, unsigned char *pal, COLORREF color);
00217 extern int BlendPal(int index1, int index2); //TESTING - blends two palette entries to the nearest pal color
00218 extern TColorMap *texColorMap;
00219 extern bool suppress_gets;
00220 extern int GetTextureModeValue(char *md);
00221 
00222 
00223 //bspui
00224 extern void SplitBaseQuiet(char *path, char *basepath, char *name);
00225 extern void Show_Frame(const char* str, bool notStatusOnly);
00226 extern void SaveArrangement();
00227 extern bool     ProcessMapFile(char *);
00228 extern void     MergeMapFile(char *);
00229 extern void     SaveMapFile(char *,int);
00230 
00231 #define MAX_RECENT 16
00232 extern char recent_files[MAX_RECENT][MAX_PATH];
00233 extern void InitRecent();
00234 extern void SaveRecent();
00235 extern void AddRecent(char *filename);
00236 extern int BuildRecentMenu(HMENU menu);
00237 
00238 extern bool redraw_interrupted;                         // User hit Esc during long screen update.
00239 
00240 
00241 //bspui2
00242 extern int plugPortal;
00243 extern int leakPtType;
00244 extern vec3_t *aLeakPoints; // leak points...
00245 extern int numLeakPoints;
00246 extern leakPortal_t *aLeakPortals; // leak portals...
00247 extern int numLeakPortals;
00248 extern vec3_t LeakPortalOrigin;
00249 extern leakNode_t *aLeakNode;
00250 
00251 //map
00252 extern int snapToGrid(float);
00253 extern int CountWads(char *);
00254 
00255 extern char loadName[MAX_PATH];
00256 extern bool loadMessageGiven;                                   // True if user has been warned of a loading error once
00257 
00258 extern int ent_count;
00259 
00260 
00261 //setbrush
00262 /*#ifdef BSP_MEMMGR                                                             // If defined, gather a pool of brushes
00263         extern void InitBrushManager();                         //  at startup, otherwise allocation is dynamic
00264         extern void CloseBrushManager();
00265 #endif*/
00266 //extern SetBrush *AllocBrush();                                        // Allocates a brush from brush pool
00267 //extern void DestroyBrush(SetBrush *);                 // Deallocates a brush from brush pool
00268 extern void VectorAdd (vec3_t va, vec3_t vb, vec3_t out);
00269 extern void VectorSubtract (vec3_t va, vec3_t vb, vec3_t out);
00270 extern void VectorCopy (vec3_t in, vec3_t out);
00271 extern float DotProduct(vec3_t, vec3_t);
00272 extern bool VectorCompare (vec3_t v1, vec3_t v2);
00273 extern float VectorLength(vec3_t v);
00274 extern void VectorNormalize (vec3_t v);
00275 extern void VectorCalcNormal(vec3_t a,vec3_t b,vec3_t c, vec3_t out_normal);
00276 extern void VectorScale (vec3_t v, float sc, vec3_t out);
00277 extern void CrossProduct(vec3_t, vec3_t, vec3_t);
00278 extern void SplitBase(char *path, char *basepath, char *name);
00279 extern float TextureAxisFromPlane(plane_t *pln, float *xv, float *yv);
00280 extern void TextureAxisFromPlaneEx(plane_t *pln, vec3_t out[3]);
00281 extern winding_t *CopyWinding (winding_t *w);
00282 extern winding_t *NewWinding (int points);
00283 extern void carve(SetBrush **in);
00284 extern void GetAxes(int ViewType, int *ua, int *va, int *na);
00285 
00286 extern Entity *carve_in, *carve_out;
00287 extern vec3_t vec3_origin;
00288 extern map **map_i;
00289 extern bool clipDraw;
00290 //extern bool ignoreBounds;
00291 extern int maxmulticontrolpoints;
00292 extern int multicontrolpoints;
00293 extern float **mcontrolpoints;
00294 extern int numsb;
00295 //extern int callstocarve;
00296 extern float lightaxis[3];
00297 
00298 extern vec3_t   region_min, region_max;
00299 extern int              numcontrolpoints;
00300 extern float    *controlpoints[MAX_FACES*3];
00301 extern vec3_t   sb_translate;
00302 extern vec3_t   sb_mins, sb_maxs, sb_ctr;       //TODO: kill sb_mins/maxs
00303 extern int              BBoxCount;
00304 extern vec3_t   sel_x, sel_y, sel_z;
00305 //extern vec3_t sel_org;
00306 extern vec3_t   select_min, select_max;
00307 extern float    sb_floor_dir, sb_floor_dist;
00308 extern Entity *sb_newowner;
00309 extern bool select_deselect;
00310 //extern vec3_t last_vertex;
00311 
00312 //matrix3
00313 extern float angle(float x, float y);
00314 extern void tran3(float tx, float ty, float tz, float A[][4]);
00315 extern void scale3(float sx, float sy, float sz, float A[][4]);
00316 extern void rot3(int m, float th, float A[][4]);
00317 extern void mult3(float A[][4], float B[][4], float C[][4]);
00318 extern void rotate3(float phi, float *b, float *d, float A[4][4]);
00319 extern void transform(float *v, float A[4][4], float *w);
00320 extern void transform2(float x, float y, float z, float A[4][4], float *w);
00321 extern void findQRotate(float Q[4][4],float R[4][4],float *eye,float roll, float pitch, float yaw);
00322 extern void MConcat(float in1[3][3], float in2[3][3], float out[3][3]);
00323 extern void findQ(float Q[4][4],float R[4][4],float *eye,float roll, float pitch, float yaw);
00324 extern void findQ2(float Q[4][4],float *eye,float *lookAt);
00325 extern void findQ3(float Q[4][4],float *eye,float *lookAt);
00326 extern void invert(float A[4][4],float AInv[4][4],int *sing);
00327 //extern int ClipXY(int npts, TRect CR);
00328 extern int FastClipXY(int npts, LPRECT CR);
00329 //extern int FastClipRen(int npts, int rw, int rh);
00330 extern int Z_Clip(int npts, float zmin, float zmax);
00331 //extern int XY_Clip(int npts, vec3_t *TP, TRect CR);
00332 //extern int ClipZPoint(const float *pt, float zmin, float zmax);
00333 //extern int ClipXYPoint(const float *pt, TRect CR);
00334 
00335 
00336 //render
00337 extern void REN_DrawFlatSpanOutline (int y,int selected);
00338 extern void REN_DrawFlatSpanOutlineSin(int y,int selected);
00339 extern void REN_DrawSpanOutline (int y, int selected);
00340 extern void REN_DrawSpanOutlineSin(int y, int selected);
00341 extern void REN_DrawSpanOutlineNoZ (int y, int selected);
00342 extern void REN_DrawSpanOutlineNoZSin(int y, int selected);
00343 extern void REN_CheckDistanceRasterizeFace(winding_t *w);
00344 extern void REN_CheckClosestSpan (int y);
00345 extern void REN_DrawSpanWire(int y, int selected);
00346 extern void REN_DrawSpanWireHoriz(int y, int selected);
00347 extern void REN_LineDraw(int XStart, int YStart, int XEnd, int YEnd, int selected);
00348 extern void REN_LineDrawZ(float *p1, float *p2, int selected);
00349 extern void REN_DrawSpanWireSin(int y, int selected);
00350 extern void REN_DrawSpanWireHorizSin(int y, int selected);
00351 extern void REN_LineDrawSin(int XStart, int YStart, int XEnd, int YEnd, int selected);
00352 extern void REN_LineDrawZSin(float *p1, float *p2, int selected);
00353 extern void REN_DrawWinding(winding_t *inw, int selected);
00354 extern void REN_DrawLineWinding(winding_t *inw, int selected);
00355 extern void REN_RenderWinding(winding_t *inw, int selected);
00356 extern void REN_RasterizeLineWire (winding_t *w, int selected);
00357 extern void REN_CopyBuffers (float *inz, float *outz, unsigned char *inp, unsigned char *outp);
00358 extern void REN_DrawCameraPoint(float *pt,int selected);
00359 extern bool REN_FindCameraPoint(float *pt, float fudge, int *plot_x, int *plot_y);
00360 extern void REN_BeginCamera();
00361 extern void REN_ClearBuffers();
00362 
00363 extern bool REN_PointToScreen(float *pt, POINT *outpt);
00364 extern void REN_Draw3DGrid();
00365 extern void REN_DrawVec(float *pt, COLORREF color);
00366 extern void REN_DrawCameraHandle(float *pt, COLORREF color);
00367 extern void REN_DrawCameraHandleSin(float *pt, unsigned char r, unsigned char g, unsigned char b);
00368 extern void REN_DrawXYFace(face_t *);
00369 extern void REN_DrawCameraFace(face_t *, int);
00370 extern void REN_FindClosestFace(face_t *idpol);
00371 extern void REN_DrawModel(mdl_t *mdl, int selected, float Xrot, float Yrot, float Zrot,
00372                           int frame, int Xoffs, int Yoffs, float Zoffs);
00373 extern void REN_RenderModel(mdl_t *mdl, int selected, float Xrot, float Yrot, float Zrot,
00374                             int frame, int Xoffs, int Yoffs, float Zoffs, int skinNumber);
00375 extern void REN_DrawModelQ2(dmdl_t *mdl, int selected, float Xrot, float Yrot, float Zrot,
00376                             int frame, int Xoffs, int Yoffs, float Zoffs);
00377 extern void REN_RenderModelQ2(dmdl_t *mdl, dskindata_t *skinTex, int selected, float Xrot, float Yrot, float Zrot,
00378                               int frame, int Xoffs, int Yoffs, float Zoffs, int skinNumber);
00379 
00380 extern void XRotatePoint(float *in, float *out, float c, float s);
00381 extern void YRotatePoint(float *in,float *out,float c, float s);
00382 extern void ZRotatePoint(float *in, float *out, float c, float s);
00383 
00384 extern vec3_t r_origin, r_matrix[3];
00385 extern int t_coloroffset;
00386 extern int t_width, t_height;
00387 extern unsigned char *t_data;
00388 extern float t_widthadd, t_heightadd;
00389 extern int r_width, r_height;
00390 extern float *r_zbuffer;
00391 extern unsigned char *r_picbuffer;
00392 extern vec5_t rightside, leftside, rightstep,leftstep;
00393 extern face_t *r_face;
00394 extern bool r_drawflat;
00395 extern bool r_drawent;
00396 extern bool r_noz;
00397 extern bool r_drawwire;
00398 extern pixel32_t r_flatcolor;
00399 extern pixel32_t r_entitycolor;
00400 //extern int sy[256];
00401 extern plane_t frustum[5];
00402 
00403 namespace Render
00404 {
00405 extern int clickX, clickY;
00406 }
00407 extern SetBrush *REN_bestBrush;
00408 extern float REN_bestDistance;
00409 extern SetBrush *REN_testBrush;
00410 extern face_t *REN_bestFace;
00411 extern face_t *REN_testFace;
00412 extern SetBrush *REN_curBrush;
00413 
00414 //xyview
00415 
00416 extern bool glBspRotate;
00417 extern vec3_t xy_eye;                                           // XY eye center point.
00418 extern SetBrush *newbrush;
00419 extern int numEventTypes;
00420 extern int curEventType;
00421 
00422 //editwin
00423 
00424 extern void glSetFogRange(float fognear, float fogfar);
00425 extern void glSetBackgroundColor(COLORREF color);
00426 extern void glSetFogColor(COLORREF color);
00427 extern void glFogOn();
00428 extern void glFogOff();
00429 extern void glShadingOn();
00430 extern void glShadingOff();
00431 extern void glLightAmbient(COLORREF color);
00432 extern void glLightColor(COLORREF color);
00433 
00434 extern map *glMap;
00435 extern int glLastBoundIndex;
00436 extern bool glSkyboxNotEmpty;
00437 extern int brushCount;
00438 extern vec3_t matrix[3];
00439 
00440 extern char EventTypes3d[MAX_MOUSE_EVENT_TYPES] [32];   // Mouse customizations
00441 extern int numEventTypes3d;
00442 extern int curEventType3d;
00443 extern SIZE fovsz;
00444 extern bool mouse_is_navigating;
00445 
00446 //clipper
00447 extern bool splitSelect;
00448 
00449 
00450 //hits
00451 extern void RemoveHitBrush(SetBrush *b);
00452 extern int GetHitIndex(SetBrush *b);
00453 extern void ClearHits();
00454 extern void NextHitBrush();
00455 extern void HitRestore();
00456 extern void SelectHitBrush(int index);
00457 extern void SelectAllHit();
00458 extern void PreviousHitBrush();
00459 extern void AddHitBrush(SetBrush *b);
00460 
00461 extern int *hitSelected;                                                // Trace results for clicks in 2d view.
00462 
00463 
00464 //eclass
00465 extern EntityClassList *entity_classes_i;               // Entity browser.
00466 
00467 
00468 //ent
00469 extern bool wasBad;
00470 
00471 
00472 //bspresp
00473 extern char * GetVKeyName(int id);
00474 extern int GetVKey(char *vkey);
00475 
00476 
00477 //glutil
00478 extern void glShadingOn();
00479 extern void glShadingOff();
00480 extern void glAddTexture(int name,int width,int height,GLuint* pic,int bits=0,int wrap=GL_REPEAT);
00481 extern void glReloadBSPSettings();
00482 extern void glBeginAddToSkybox();
00483 extern void glEndAddToSkybox();
00484 extern void glRenderSkybox();
00485 extern void glUnloadSkybox();
00486 extern void glReloadSkybox();
00487 
00488 //lua
00489 //extern void LUA_Create();
00490 //extern void LUA_Destroy();
00491 //extern void LUA_Exec(char *lua_code);
00492 
00493 //angel
00494 //extern void AS_Create();
00495 //extern void AS_Exec(char *scriptcode);
00496 //extern void AS_Destroy();
00497 
00498 //squirrel!
00499 extern void SQ_Create();
00500 extern void SQ_Destroy();
00501 extern void SQ_Exec(char *scriptcode);
00502 
00503 //global const
00504 
00505 //max dimensions for auto rendering size
00506 const int AUTO_MAX_W = 1280;
00507 const int AUTO_MAX_H = 1024;
00508 
00509 #define BAD_SCALE 0.0001
00510 
00511 #define DEG2RAD(x) (((float)(x))*M_PI/180.0f)
00512 #define RAD2DEG(x) ((int)(180.0f*((float)(x))/M_PI))
00513 
00514 //debug: helps show how many times a function is called
00515 #define FNHIT() do { static int _TEMPVAR=0; Caption("%d",++_TEMPVAR); } while(0)
00516 
00517 #define MAKEPOINT(pt, dword) POINT pt = { (short)LOWORD(dword), (short)HIWORD(dword) }
00518 
00519 #define SWAPBYTES(x) (((x>>24) & 0xFF) | ((x & 0xFF)<<24) | ((x&0xFF00)<<8) | ((x>>8) & 0xFF00))
00520 
00521 //strncpy with automatic size param
00522 //debug: #define STRNCPY(dest,src) do { if(sizeof(dest)<16)sysfatal("bad STRNCPY Line:%i, "__FILE__,__LINE__); strncpy(dest,src,sizeof(dest)); } while(0)
00523 #define STRNCPY(dest,src) strncpy(dest,src,sizeof(dest))
00524 
00525 //automatically expand RECT for BitBlt
00526 #define BitBltRect(dst,rc,src,x,y,op) BitBlt(dst,rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top,src,x,y,op)
00527 
00528 //
00529 // ADD_TO_LIST_SORTED
00530 //
00531 //      adds an item to a linked list sorting on T->name. uses
00532 //  compare_strings_int_parts() function to sort numbered items correctly.
00533 //  list T needs to impl "char *name" member, and the supplied "T *next"
00534 //  member.
00535 //
00536 // params
00537 //      T                               type of list
00538 //      item                    name of item to add
00539 //      head                    head pointer of list
00540 //      next_member             name of "T->next" member
00541 #define ADD_TO_LIST_SORTED(T, item, head, next_member)  do {    \
00542         item->next_member = 0;  \
00543         T *ATLS_iter = head;    \
00544         if(!ATLS_iter) {        /* add first item to list */    \
00545                 head = item;    \
00546         } else {                /* add item to list with one or more items */   \
00547                 T **ATLS_previns = &head;       /* insert point, start at list head */  \
00548                 for(; ATLS_iter; ATLS_iter = ATLS_iter->next_member) {  \
00549                         if(compare_strings_int_parts(item->name, ATLS_iter->name) <= 0) {       \
00550                                 item->next_member = ATLS_iter;  /* next item is current iter item */    \
00551                                 (*ATLS_previns) = item;         /* previous item points to new item */  \
00552                                 break;  \
00553                         }       \
00554                         if(!ATLS_iter->next_member) {   /* before next... */    \
00555                                 ATLS_iter->next_member = item;  \
00556                                 break;  \
00557                         }       \
00558                         ATLS_previns = &ATLS_iter->next_member; /* remember insert point */     \
00559                 }       \
00560         }       \
00561 } while(0)
00562 
00563 
00564 #endif  //_GLOBAL_H_
 All Classes Functions