Skip to content

Commit de1d95d

Browse files
deglobalise UpdateSortedSurfIdList & SurfIdCompare
This also adds a test to ensure sorting works correctly on all platforms.
1 parent 3da37b6 commit de1d95d

File tree

3 files changed

+190
-24
lines changed

3 files changed

+190
-24
lines changed

Source/smokeview/readsmv.c

Lines changed: 39 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
// _GNU_SOURCE needs to be switched on to access qsort_r. qsort_r is included in
2+
// POSIX 2024 as standard but is also available via GNU extensions.
3+
#ifndef _WIN32
4+
#define _GNU_SOURCE
5+
#endif
6+
17
#include "options.h"
28
#include "glew.h"
39
#include <assert.h>
@@ -4425,38 +4431,47 @@ void SetSurfaceIndex(blockagedata *bc){
44254431

44264432
/* ------------------ SurfIdCompare ------------------------ */
44274433

4428-
int SurfIdCompare(const void *arg1, const void *arg2){
4429-
surfdata *surfi, *surfj;
4430-
int i, j;
4431-
4432-
i = *(int *)arg1;
4433-
j = *(int *)arg2;
4434+
#ifdef __linux__
4435+
int SurfIdCompare(const void *arg1, const void *arg2, void *surfinfo) {
4436+
#else // assumed to be osx or windows
4437+
int SurfIdCompare(void *surfinfo, const void *arg1, const void *arg2) {
4438+
#endif
4439+
int i = *(int *)arg1;
4440+
int j = *(int *)arg2;
44344441

4435-
surfi = global_scase.surfcoll.surfinfo+i;
4436-
surfj = global_scase.surfcoll.surfinfo+j;
4442+
surfdata *surfi = (surfdata *)surfinfo+i;
4443+
surfdata *surfj = (surfdata *)surfinfo+j;
44374444

44384445
return(strcmp(surfi->surfacelabel, surfj->surfacelabel));
44394446
}
44404447

44414448
/* ------------------ UpdateSortedSurfIdList ------------------------ */
44424449

4443-
void UpdateSortedSurfIdList(void){
4450+
void UpdateSortedSurfIdList(surf_collection *surfcoll){
44444451
int i;
44454452

4446-
FREEMEMORY(global_scase.surfcoll.sorted_surfidlist);
4447-
FREEMEMORY(global_scase.surfcoll.inv_sorted_surfidlist);
4448-
NewMemory((void **)&global_scase.surfcoll.sorted_surfidlist, global_scase.surfcoll.nsurfinfo*sizeof(int));
4449-
NewMemory((void **)&global_scase.surfcoll.inv_sorted_surfidlist, global_scase.surfcoll.nsurfinfo*sizeof(int));
4450-
4451-
4452-
global_scase.surfcoll.nsorted_surfidlist = global_scase.surfcoll.nsurfinfo;
4453-
for(i = 0; i<global_scase.surfcoll.nsorted_surfidlist; i++){
4454-
global_scase.surfcoll.sorted_surfidlist[i] = i;
4455-
}
4456-
4457-
qsort((int *)global_scase.surfcoll.sorted_surfidlist, (size_t)global_scase.surfcoll.nsurfinfo, sizeof(int), SurfIdCompare);
4458-
for(i = 0; i<global_scase.surfcoll.nsorted_surfidlist; i++){
4459-
global_scase.surfcoll.inv_sorted_surfidlist[global_scase.surfcoll.sorted_surfidlist[i]] = i;
4453+
FREEMEMORY(surfcoll->sorted_surfidlist);
4454+
FREEMEMORY(surfcoll->inv_sorted_surfidlist);
4455+
NewMemory((void **)&surfcoll->sorted_surfidlist, surfcoll->nsurfinfo*sizeof(int));
4456+
NewMemory((void **)&surfcoll->inv_sorted_surfidlist, surfcoll->nsurfinfo*sizeof(int));
4457+
4458+
4459+
surfcoll->nsorted_surfidlist = surfcoll->nsurfinfo;
4460+
for(i = 0; i<surfcoll->nsorted_surfidlist; i++){
4461+
surfcoll->sorted_surfidlist[i] = i;
4462+
}
4463+
// Sort surfaces by name in a separate list. Each platform has sort-with-context
4464+
// (qsort_s, qsort_r) with either a different name or the arguments in a
4465+
// different order. They are functionally the same.
4466+
#ifdef _WIN32
4467+
qsort_s(surfcoll->sorted_surfidlist, (size_t)surfcoll->nsurfinfo, sizeof(int), SurfIdCompare,(void *)surfcoll->surfinfo);
4468+
#elif __linux__
4469+
qsort_r(surfcoll->sorted_surfidlist, (size_t)surfcoll->nsurfinfo, sizeof(int), SurfIdCompare,(void *)surfcoll->surfinfo);
4470+
#else // assumed to be osx
4471+
qsort_r(surfcoll->sorted_surfidlist, (size_t)surfcoll->nsurfinfo, sizeof(int), (void *)surfcoll->surfinfo, SurfIdCompare);
4472+
#endif
4473+
for(i = 0; i<surfcoll->nsorted_surfidlist; i++){
4474+
surfcoll->inv_sorted_surfidlist[surfcoll->sorted_surfidlist[i]] = i;
44604475
}
44614476
}
44624477

@@ -4651,7 +4666,7 @@ void ParseDatabase(char *file){
46514666
}
46524667
global_scase.surfcoll.nsurfinfo += nsurfids_shown;
46534668
}
4654-
UpdateSortedSurfIdList();
4669+
UpdateSortedSurfIdList(&global_scase.surfcoll);
46554670
}
46564671

46574672
/* ------------------ ReadZVentData ------------------------ */

Tests/CMakeLists.txt

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,103 @@ if ((NOT MACOSX) AND UNIX)
272272
target_link_libraries(test_root_dir m)
273273
endif()
274274

275+
# sort_surfs
276+
add_executable(sort_surfs sort_surfs.c
277+
../Source/smokeview/menus.c
278+
../Source/smokeview/IOscript.c
279+
../Source/smokeview/IOshooter.c
280+
../Source/smokeview/colortimebar.c
281+
../Source/smokeview/camera.c
282+
../Source/smokeview/IOgeometry.c
283+
../Source/smokeview/IOwui.c
284+
../Source/smokeview/IOobjects.c
285+
../Source/smokeview/IOtour.c
286+
../Source/smokeview/getdatacolors.c
287+
../Source/smokeview/smokeview.c
288+
../Source/smokeview/output.c
289+
../Source/smokeview/renderimage.c
290+
../Source/smokeview/renderhtml.c
291+
../Source/smokeview/getdatabounds.c
292+
../Source/smokeview/readsmv.c
293+
../Source/smokeview/IOvolsmoke.c
294+
../Source/smokeview/IOsmoke.c
295+
../Source/smokeview/IOplot3d.c
296+
../Source/smokeview/IOplot2d.c
297+
../Source/smokeview/IOslice.c
298+
../Source/smokeview/IOhvac.c
299+
../Source/smokeview/IOboundary.c
300+
../Source/smokeview/IOpart.c
301+
../Source/smokeview/IOzone.c
302+
../Source/smokeview/IOiso.c
303+
../Source/smokeview/callbacks.c
304+
../Source/smokeview/drawGeometry.c
305+
../Source/smokeview/skybox.c
306+
../Source/smokeview/update.c
307+
../Source/smokeview/viewports.c
308+
../Source/smokeview/smv_geometry.c
309+
../Source/smokeview/showscene.c
310+
../Source/smokeview/infoheader.c
311+
../Source/smokeview/startup.c
312+
../Source/smokeview/shaders.c
313+
../Source/smokeview/unit.c
314+
../Source/smokeview/colortable.c
315+
../Source/smokeview/command_args.c
316+
../Source/smokeview/c_api.c
317+
)
318+
319+
target_sources(sort_surfs PRIVATE
320+
../Source/smokeview/glui_smoke.cpp
321+
../Source/smokeview/glui_clip.cpp
322+
../Source/smokeview/glui_stereo.cpp
323+
../Source/smokeview/glui_geometry.cpp
324+
../Source/smokeview/glui_motion.cpp
325+
../Source/smokeview/glui_bounds.cpp
326+
../Source/smokeview/glui_colorbar.cpp
327+
../Source/smokeview/glui_display.cpp
328+
../Source/smokeview/glui_tour.cpp
329+
../Source/smokeview/glui_trainer.cpp
330+
../Source/smokeview/glui_objects.cpp
331+
../Source/smokeview/glui_shooter.cpp
332+
)
333+
334+
target_include_directories(sort_surfs PRIVATE
335+
../Tests
336+
../Source/shared
337+
../Source/glew
338+
../Source/smokeview
339+
)
340+
target_link_libraries(sort_surfs PRIVATE libsmv)
341+
if (WIN32)
342+
target_include_directories(sort_surfs PRIVATE ../Source/glut_gl)
343+
else()
344+
target_include_directories(sort_surfs PRIVATE ../Source/glui_gl)
345+
endif ()
346+
target_link_libraries(sort_surfs PRIVATE glui_static)
347+
target_include_directories(sort_surfs PRIVATE ../Source/glui_v2_1_beta)
348+
if (MACOSX)
349+
add_definitions(-Dpp_NOQUARTZ)
350+
target_link_libraries(sort_surfs PRIVATE "-framework OpenGL" "-framework GLUT")
351+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")
352+
elseif (GLUT_FOUND)
353+
target_link_libraries(sort_surfs PRIVATE GLUT::GLUT)
354+
else()
355+
target_link_libraries(sort_surfs PRIVATE glut32_static)
356+
endif ()
357+
target_link_libraries(sort_surfs PRIVATE GLEW::GLEW)
358+
if (WIN32)
359+
target_include_directories(sort_surfs PRIVATE ../Source/pthreads)
360+
endif()
361+
if ((NOT MACOSX) AND UNIX)
362+
target_link_libraries(sort_surfs PRIVATE m)
363+
endif()
364+
target_link_libraries(sort_surfs PRIVATE JPEG::JPEG)
365+
target_link_libraries(sort_surfs PRIVATE PNG::PNG)
366+
target_link_libraries(sort_surfs PRIVATE ZLIB::ZLIB)
367+
target_link_libraries(sort_surfs PRIVATE OpenGL::GL OpenGL::GLU)
368+
369+
370+
371+
275372
# Arguments to this tests are <slice path> <number of frames in slice>
276373
# Simple slice is a finished slice file with 3 frames
277374
add_test(NAME "Simple Slice - Complete"
@@ -326,3 +423,6 @@ add_test(NAME "Mem Test"
326423

327424
add_test(NAME "Test Root Dir"
328425
COMMAND test_root_dir)
426+
427+
add_test(NAME "Sort Surfs"
428+
COMMAND sort_surfs)

Tests/sort_surfs.c

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#define INMAIN
2+
#define pp_GPU
3+
#define pp_RENDER360_DEBUG
4+
#define pp_memstatus
5+
#define pp_REFRESH
6+
#undef pp_OSX_HIGHRES
7+
#ifdef pp_OSX
8+
#ifndef pp_QUARTZ
9+
#define pp_REFRESH // refresh glui dialogs when they change size
10+
#ifndef pp_OSX_LOWRES
11+
#define pp_OSX_HIGHRES
12+
#endif
13+
#endif
14+
#endif
15+
16+
#include "options.h"
17+
18+
#include "dmalloc.h"
19+
20+
#include "readcad.h"
21+
#include "smokeviewvars.h"
22+
#include <assert.h>
23+
24+
void UpdateSortedSurfIdList(surf_collection *surfcoll);
25+
void InitSurface(surfdata *surf);
26+
27+
int show_help;
28+
int hash_option;
29+
int show_version;
30+
char append_string[1024];
31+
#define N_SURFS 3
32+
int main(int argc, char **argv) {
33+
initMALLOC();
34+
char *surf_names[N_SURFS] = {"abc", "hij", "def"};
35+
surf_collection surfcoll = {0};
36+
surfcoll.nsurfinfo = N_SURFS;
37+
NewMemory((void **)&surfcoll.surfinfo, N_SURFS * sizeof(surfdata));
38+
for(int i = 0; i < N_SURFS; i++) {
39+
surfdata *sd = surfcoll.surfinfo + i;
40+
InitSurface(sd);
41+
sd->surfacelabel = surf_names[i];
42+
}
43+
UpdateSortedSurfIdList(&surfcoll);
44+
assert(strcmp(surfcoll.surfinfo[surfcoll.sorted_surfidlist[0]].surfacelabel,
45+
"abc") == 0);
46+
assert(strcmp(surfcoll.surfinfo[surfcoll.sorted_surfidlist[1]].surfacelabel,
47+
"def") == 0);
48+
assert(strcmp(surfcoll.surfinfo[surfcoll.sorted_surfidlist[2]].surfacelabel,
49+
"hij") == 0);
50+
return 0;
51+
}

0 commit comments

Comments
 (0)