Index: trunk/src_plugins/import_gcode/gcode_vm.c =================================================================== --- trunk/src_plugins/import_gcode/gcode_vm.c (revision 844) +++ trunk/src_plugins/import_gcode/gcode_vm.c (revision 845) @@ -41,6 +41,27 @@ #define DEG2RAD (G_PI/180.0) #define RAD2DEG (180.0/G_PI) +/* Implementation idea borrowed from an old gcc (GPL'd) */ +static double gcode_round(double x) +{ + double t; + +/* We should check for inf here, but inf is not in C89 */ + + if (x >= 0.0) { + t = ceil(x); + if (t - x > 0.5) + t -= 1.0; + return t; + } + + t = ceil(-x); + if ((t + x) > 0.5) + t -= 1.0; + return -t; +} + + #define LIST_APPEND(FIRST, LAST, ITEM) \ do { \ if (FIRST != NULL) { \ @@ -191,7 +212,7 @@ case T_FUP: a = pop(ctx); push(ctx, ceil(a)); break; case T_EXP: a = pop(ctx); push(ctx, exp(a)); break; case T_LN: a = pop(ctx); push(ctx, log(a)); break; - case T_ROUND: a = pop(ctx); push(ctx, round(a)); break; + case T_ROUND: a = pop(ctx); push(ctx, gcode_round(a)); break; case T_SQRT: a = pop(ctx); push(ctx, sqrt(a)); break; case T_MOD: a = pop(ctx); b = pop(ctx); push(ctx, fmod(a,b)); break; case T_OR: a = pop(ctx); b = pop(ctx); push(ctx, (a!=0) || (b!=0)); break;