Browse Source

--- Merging r18180 into '.':
U packages/symbolic/src/symbolic.pas
--- Merging r18188 into '.':
U rtl/win/sysutils.pp
--- Merging r18197 into '.':
U packages/symbolic/fpmake.pp
A packages/symbolic/examples/easyevalexample.pp
U packages/symbolic/examples/Makefile.fpc
U packages/symbolic/examples/Makefile
--- Merging r18200 into '.':
U rtl/objpas/rtlconst.inc
--- Merging r18204 into '.':
U packages/symbolic/src/exprstrs.inc
G packages/symbolic/src/symbolic.pas
U packages/symbolic/examples/easyevalexample.pp
--- Merging r18207 into '.':
U packages/opengl/src/glx.pp
U packages/opengl/examples/glxtest.pp
--- Merging r18208 into '.':
U packages/opengl/src/glext.pp
--- Merging r18216 into '.':
U ide/globdir.inc
--- Merging r18219 into '.':
U utils/fpdoc/makeskel.lpi
U utils/fpdoc/makeskel.pp
--- Merging r18222 into '.':
U packages/fcl-process/src/dummy/process.inc
--- Merging r18225 into '.':
U rtl/unix/keyboard.pp

# revisions: 18180,18188,18197,18200,18204,18207,18208,18216,18219,18222,18225
------------------------------------------------------------------------
r18180 | marco | 2011-08-12 20:03:07 +0200 (Fri, 12 Aug 2011) | 2 lines
Changed paths:
M /trunk/packages/symbolic/src/symbolic.pas

* QuickEvaluate, an helper procedure to quickly evaluate formulas.

------------------------------------------------------------------------
------------------------------------------------------------------------
r18188 | marco | 2011-08-13 11:16:46 +0200 (Sat, 13 Aug 2011) | 2 lines
Changed paths:
M /trunk/rtl/win/sysutils.pp

* load listseparator from locale. Patch by Bart B. Mantis 19976

------------------------------------------------------------------------
------------------------------------------------------------------------
r18197 | marco | 2011-08-13 20:59:46 +0200 (Sat, 13 Aug 2011) | 2 lines
Changed paths:
M /trunk/packages/symbolic/examples/Makefile
M /trunk/packages/symbolic/examples/Makefile.fpc
A /trunk/packages/symbolic/examples/easyevalexample.pp
M /trunk/packages/symbolic/fpmake.pp

* new example to demonstrate new QuickEvaluate routine.

------------------------------------------------------------------------
------------------------------------------------------------------------
r18200 | michael | 2011-08-13 23:19:45 +0200 (Sat, 13 Aug 2011) | 1 line
Changed paths:
M /trunk/rtl/objpas/rtlconst.inc

* Added invalid stream operation string constant
------------------------------------------------------------------------
------------------------------------------------------------------------
r18204 | marco | 2011-08-14 15:53:13 +0200 (Sun, 14 Aug 2011) | 2 lines
Changed paths:
M /trunk/packages/symbolic/examples/easyevalexample.pp
M /trunk/packages/symbolic/src/exprstrs.inc
M /trunk/packages/symbolic/src/symbolic.pas

* Example for QuickEvaluate, and some fixes to errorhandling of QuickEvaluate

------------------------------------------------------------------------
------------------------------------------------------------------------
r18207 | florian | 2011-08-14 20:35:22 +0200 (Sun, 14 Aug 2011) | 2 lines
Changed paths:
M /trunk/packages/opengl/examples/glxtest.pp
M /trunk/packages/opengl/src/glx.pp

+ patch by Michalis Kamburelis to add GLX 1.4 support and new GLX extensions, resolves #19953

------------------------------------------------------------------------
------------------------------------------------------------------------
r18208 | florian | 2011-08-14 20:40:46 +0200 (Sun, 14 Aug 2011) | 2 lines
Changed paths:
M /trunk/packages/opengl/src/glext.pp

* patch by Michalis Kamburelis for 2 small issues in glext unit, to fix Load_GL_version_3_3 and Load_GL_version_4_0, resolves #19955

------------------------------------------------------------------------
------------------------------------------------------------------------
r18216 | pierre | 2011-08-16 10:29:02 +0200 (Tue, 16 Aug 2011) | 1 line
Changed paths:
M /trunk/ide/globdir.inc

+ NOVESA switch for go32v2 IDE added
------------------------------------------------------------------------
------------------------------------------------------------------------
r18219 | sekelsenmat | 2011-08-16 15:27:35 +0200 (Tue, 16 Aug 2011) | 1 line
Changed paths:
M /trunk/utils/fpdoc/makeskel.lpi
M /trunk/utils/fpdoc/makeskel.pp

makeskel: Adds more output info in case of error and fixes compilation through Lazarus (by adding +)
------------------------------------------------------------------------
------------------------------------------------------------------------
r18222 | pierre | 2011-08-16 17:14:46 +0200 (Tue, 16 Aug 2011) | 1 line
Changed paths:
M /trunk/packages/fcl-process/src/dummy/process.inc

* Warn only for go32v2 even for 2.7.1 version
------------------------------------------------------------------------
------------------------------------------------------------------------
r18225 | florian | 2011-08-16 20:58:50 +0200 (Tue, 16 Aug 2011) | 2 lines
Changed paths:
M /trunk/rtl/unix/keyboard.pp

* patch by Nikolay Nikolov to support Alt-Tab and Ctrl-Tab on the linux console, resolves #19247

------------------------------------------------------------------------

git-svn-id: branches/fixes_2_6@18839 -

marco 14 years ago
parent
commit
893c1d9fa2

+ 1 - 0
.gitattributes

@@ -5892,6 +5892,7 @@ packages/symbolic/doc/optimization.txt svneol=native#text/plain
 packages/symbolic/doc/symbolic.txt svneol=native#text/plain
 packages/symbolic/examples/Makefile svneol=native#text/plain
 packages/symbolic/examples/Makefile.fpc svneol=native#text/plain
+packages/symbolic/examples/easyevalexample.pp svneol=native#text/plain
 packages/symbolic/examples/evaltest.pas svneol=native#text/plain
 packages/symbolic/examples/rpnthing.pas svneol=native#text/plain
 packages/symbolic/fpmake.pp svneol=native#text/plain

+ 11 - 2
ide/globdir.inc

@@ -16,7 +16,14 @@
 
 { --- Special OS settings --- }
 {$ifdef Go32V2}
-  {$define SUPPORTVESA}
+  { NOVESA conditional avoids use of
+    vesa unit, it also disables USE_GRAPH_SWITCH
+    conditional, in order to obtain a go32v2 excutable that
+    doesn't require full screen switching
+    at startup on Windows OS }
+  {$ifndef NOVESA}
+    {$define SUPPORTVESA}
+  {$endif ndef NOVESA}
   {$define SUPPORTREDIR}
   {$define WinClipSupported}
   {$define HasSignal}
@@ -25,7 +32,9 @@
   {$define FSCaseInsensitive}
   {$define HasSysMsgUnit}
   {$ifdef DEBUG}
-    {$define USE_GRAPH_SWITCH}
+    {$ifndef NOVESA}
+      {$define USE_GRAPH_SWITCH}
+    {$endif not NOVESA}
   {$endif DEBUG}
 {$endif}
 

+ 7 - 1
packages/fcl-process/src/dummy/process.inc

@@ -4,8 +4,14 @@
 
 {
   prevent compilation error for the versions mentioned below
-} 
+}
+{$if defined (go32v2) and defined(VER2_7_1)}
+  {$define WARN_ONLY}
+{$endif}
 {$if defined(VER2_4) or defined(VER2_5_1)}
+  {$define WARN_ONLY}
+{$endif}
+{$ifdef WARN_ONLY}
 {$warning Temporary workaround - unit does nothing}
 {$else}
 {$fatal Proper implementation of TProcess for version of this target needed}

+ 81 - 10
packages/opengl/examples/glxtest.pp

@@ -13,7 +13,25 @@ program glxTest;
 uses glx,unix,x,xlib,xutil,gl,glu;
 
 var
-  attr: Array[0..8] of integer = (GLX_RGBA,GLX_RED_SIZE,1,GLX_GREEN_SIZE,1,GLX_BLUE_SIZE,1,GLX_DOUBLEBUFFER,none);
+  { Attributes to choose context with glXChooseVisual }
+  Attr: Array[0..8] of integer = (
+    GLX_RGBA,
+    GLX_RED_SIZE, 1,
+    GLX_GREEN_SIZE, 1,
+    GLX_BLUE_SIZE, 1,
+    GLX_DOUBLEBUFFER,
+    none);
+
+  { Attributes to choose context with glXChooseFBConfig.
+    Similar to Attr, but not exactly compatible. }
+  AttrFB: Array[0..10] of integer = (
+    GLX_X_RENDERABLE, 1 { true },
+    GLX_RED_SIZE, 1,
+    GLX_GREEN_SIZE, 1,
+    GLX_BLUE_SIZE, 1,
+    GLX_DOUBLEBUFFER, 1 { true },
+    none);
+
   visinfo: PXVisualInfo;
   cm: TColormap;
   winAttr: TXSetWindowAttributes;
@@ -64,22 +82,52 @@ begin
   end;
 end;
 
+procedure Error(const S: string);
+begin
+  Writeln(ErrOutput, 'Error: ', S);
+  Halt(1);
+end;
+
 var
-  errorBase,eventBase: integer;
   window_title_property: TXTextProperty;
   title: String;
+  FBConfig: TGLXFBConfig;
+  FBConfigs: PGLXFBConfig;
+  FBConfigsCount: Integer;
+
+  { Used with glXCreateContextAttribsARB to select 3.0 forward-compatible context }
+  Context30Forward: array [0..6] of Integer =
+  ( GLX_CONTEXT_MAJOR_VERSION_ARB, 3,
+    GLX_CONTEXT_MINOR_VERSION_ARB, 0,
+    GLX_CONTEXT_FLAGS_ARB        , GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,
+    None
+  );
 begin
-  initGlx();
   dpy := XOpenDisplay(nil);
   if(dpy = nil) then
-  writeLn('Error: Could not connect to X server');
+    Error('Could not connect to X server');
+
+  if not GLX_version_1_0(dpy) then
+    Error('GLX extension not supported');
 
-  if not (glXQueryExtension(dpy,errorBase,eventBase)) then
-  writeLn('Error: GLX extension not supported');
+  if GLX_version_1_3(dpy) then
+  begin
+    { use approach recommended since glX 1.3 }
+    FBConfigs := glXChooseFBConfig(dpy, DefaultScreen(dpy), AttrFB, FBConfigsCount);
+    if FBConfigsCount = 0 then
+      Error('Could not find FB config');
+
+    { just choose the first FB config from the FBConfigs list.
+      More involved selection possible. }
+    FBConfig := FBConfigs^;
+    visinfo := glXGetVisualFromFBConfig(dpy, FBConfig);
+  end else
+  begin
+    visinfo := glXChooseVisual(dpy, DefaultScreen(dpy), Attr);
+  end;
 
-  visinfo := glXChooseVisual(dpy,DefaultScreen(dpy), Attr);
   if(visinfo = nil) then
-  writeLn('Error: Could not find visual');
+    Error('Could not find visual');
 
   //Create a new colormap
   cm := XCreateColormap(dpy,RootWindow(dpy,visinfo.screen),visinfo.visual,AllocNone);
@@ -96,9 +144,32 @@ begin
   XSetWMName(dpy,win,@window_title_property);
 
   //Create an OpenGL rendering context
-  glXCont := glXCreateContext(dpy,visinfo,none,true);
+  if GLX_version_1_3(dpy) then
+  begin
+    writeln('Using GLX 1.3 code path');
+    { Uncomment two lines below to use GLX_ARB_create_context extension
+      to request OpenGL 3.0 forward-compatible context. This is just
+      a simple example, be aware of some shortcomings:
+
+      - In case of failure, glXCreateContextAttribsARB not only returns nil,
+        it also raises X error that by default simply breaks your program.
+        In a real program, you probably want to catch it (use XSetErrorHandler
+        to assign custom error handler) and retry glXCreateContextAttribsARB
+        with less restrictive attributes.
+
+      - In case of success, you will just see a black screen.
+        That's because the Redraw and Resize procedures defined in this program
+        actually use deprecated OpenGL calls, that are *not* available in
+        a forward-compatible context (glGetError would show actual errors). }
+//  if GLX_ARB_create_context(dpy, DefaultScreen(dpy)) then
+//    glXCont := glXCreateContextAttribsARB(dpy, FBConfig, 0, true, Context30Forward) else
+      { use approach recommended since glX 1.3 }
+      glXCont := glXCreateNewContext(dpy, FBConfig, GLX_RGBA_TYPE, 0, true);
+  end else
+    glXCont := glXCreateContext(dpy, visinfo, none, true);
+
   if(glXCont = nil) then
-  writeLn('Error: Could not create an OpenGL rendering context');
+    Error('Could not create an OpenGL rendering context');
 
   //Make it current
   glXMakeCurrent(dpy,win,glXCont);

+ 37 - 20
packages/opengl/src/glext.pp

@@ -4215,7 +4215,7 @@ var
   glGetSamplerParameteriv: procedure(sampler: GLuint; pname: GLenum; params: PGLint); extdecl;
   glGetSamplerParameterIiv: procedure(sampler: GLuint; pname: GLenum; params: PGLint); extdecl;
   glGetSamplerParameterfv: procedure(sampler: GLuint; pname: GLenum; params: PGLfloat); extdecl;
-  glGetSamplerParameterIfv: procedure(sampler: GLuint; pname: GLenum; params: PGLfloat); extdecl;
+  glGetSamplerParameterIuiv: procedure(sampler: GLuint; pname: GLenum; params: PGLuint); extdecl;
 
 function Load_GL_ARB_sampler_objects(): Boolean;
 
@@ -4310,6 +4310,16 @@ var
   glUniformMatrix4x2dv: procedure(location: GLint; count: GLsizei; transpose: GLboolean; const value: PGLdouble); extdecl;
   glUniformMatrix4x3dv: procedure(location: GLint; count: GLsizei; transpose: GLboolean; const value: PGLdouble); extdecl;
   glGetUniformdv: procedure(_program: GLuint; location: GLint; params: PGLdouble); extdecl;
+  
+  { All of the following ProgramUniform* functions are supported if and only
+    if EXT_direct_state_access is supported.
+    (See http://www.opengl.org/registry/specs/ARB/gpu_shader_fp64.txt)
+
+    Load_GL_ARB_gpu_shader_fp64 will try to load them, but their presence/absence
+    will have no effect on the result of Load_GL_ARB_gpu_shader_fp64 and
+    Load_GL_VERSION_4_0 functions. (Because they are not mandatory parts of
+    the extension or OpenGL 4.0 core spec.) }   
+  
   glProgramUniform1dEXT: procedure(_program: GLuint; location: GLint; x: GLdouble); extdecl;
   glProgramUniform2dEXT: procedure(_program: GLuint; location: GLint; x: GLdouble; y: GLdouble); extdecl;
   glProgramUniform3dEXT: procedure(_program: GLuint; location: GLint; x: GLdouble; y: GLdouble; z: GLdouble); extdecl;
@@ -10093,8 +10103,8 @@ begin
     if not Assigned(glGetSamplerParameterIiv) then Exit;
     glGetSamplerParameterfv := wglGetProcAddress('glGetSamplerParameterfv');
     if not Assigned(glGetSamplerParameterfv) then Exit;
-    glGetSamplerParameterIfv := wglGetProcAddress('glGetSamplerParameterIfv');
-    if not Assigned(glGetSamplerParameterIfv) then Exit;
+    glGetSamplerParameterIuiv := wglGetProcAddress('glGetSamplerParameterIuiv');
+    if not Assigned(glGetSamplerParameterIuiv) then Exit;
     Result := True;
   end;
 end;
@@ -10269,40 +10279,47 @@ begin
     if not Assigned(glUniformMatrix4x3dv) then Exit;
     glGetUniformdv := wglGetProcAddress('glGetUniformdv');
     if not Assigned(glGetUniformdv) then Exit;
+    
+    { Ignore presence/absence of functions below.
+      See their special definition in 
+      http://www.opengl.org/registry/specs/ARB/gpu_shader_fp64.txt:
+      "All of the following ProgramUniform* functions are supported if and only
+      if EXT_direct_state_access is supported." }
+    
     glProgramUniform1dEXT := wglGetProcAddress('glProgramUniform1dEXT');
-    if not Assigned(glProgramUniform1dEXT) then Exit;
+//    if not Assigned(glProgramUniform1dEXT) then Exit;
     glProgramUniform2dEXT := wglGetProcAddress('glProgramUniform2dEXT');
-    if not Assigned(glProgramUniform2dEXT) then Exit;
+//    if not Assigned(glProgramUniform2dEXT) then Exit;
     glProgramUniform3dEXT := wglGetProcAddress('glProgramUniform3dEXT');
-    if not Assigned(glProgramUniform3dEXT) then Exit;
+//    if not Assigned(glProgramUniform3dEXT) then Exit;
     glProgramUniform4dEXT := wglGetProcAddress('glProgramUniform4dEXT');
-    if not Assigned(glProgramUniform4dEXT) then Exit;
+//    if not Assigned(glProgramUniform4dEXT) then Exit;
     glProgramUniform1dvEXT := wglGetProcAddress('glProgramUniform1dvEXT');
-    if not Assigned(glProgramUniform1dvEXT) then Exit;
+//    if not Assigned(glProgramUniform1dvEXT) then Exit;
     glProgramUniform2dvEXT := wglGetProcAddress('glProgramUniform2dvEXT');
-    if not Assigned(glProgramUniform2dvEXT) then Exit;
+//    if not Assigned(glProgramUniform2dvEXT) then Exit;
     glProgramUniform3dvEXT := wglGetProcAddress('glProgramUniform3dvEXT');
-    if not Assigned(glProgramUniform3dvEXT) then Exit;
+//    if not Assigned(glProgramUniform3dvEXT) then Exit;
     glProgramUniform4dvEXT := wglGetProcAddress('glProgramUniform4dvEXT');
-    if not Assigned(glProgramUniform4dvEXT) then Exit;
+//    if not Assigned(glProgramUniform4dvEXT) then Exit;
     glProgramUniformMatrix2dvEXT := wglGetProcAddress('glProgramUniformMatrix2dvEXT');
-    if not Assigned(glProgramUniformMatrix2dvEXT) then Exit;
+//    if not Assigned(glProgramUniformMatrix2dvEXT) then Exit;
     glProgramUniformMatrix3dvEXT := wglGetProcAddress('glProgramUniformMatrix3dvEXT');
-    if not Assigned(glProgramUniformMatrix3dvEXT) then Exit;
+//    if not Assigned(glProgramUniformMatrix3dvEXT) then Exit;
     glProgramUniformMatrix4dvEXT := wglGetProcAddress('glProgramUniformMatrix4dvEXT');
-    if not Assigned(glProgramUniformMatrix4dvEXT) then Exit;
+//    if not Assigned(glProgramUniformMatrix4dvEXT) then Exit;
     glProgramUniformMatrix2x3dvEXT := wglGetProcAddress('glProgramUniformMatrix2x3dvEXT');
-    if not Assigned(glProgramUniformMatrix2x3dvEXT) then Exit;
+//    if not Assigned(glProgramUniformMatrix2x3dvEXT) then Exit;
     glProgramUniformMatrix2x4dvEXT := wglGetProcAddress('glProgramUniformMatrix2x4dvEXT');
-    if not Assigned(glProgramUniformMatrix2x4dvEXT) then Exit;
+//    if not Assigned(glProgramUniformMatrix2x4dvEXT) then Exit;
     glProgramUniformMatrix3x2dvEXT := wglGetProcAddress('glProgramUniformMatrix3x2dvEXT');
-    if not Assigned(glProgramUniformMatrix3x2dvEXT) then Exit;
+//    if not Assigned(glProgramUniformMatrix3x2dvEXT) then Exit;
     glProgramUniformMatrix3x4dvEXT := wglGetProcAddress('glProgramUniformMatrix3x4dvEXT');
-    if not Assigned(glProgramUniformMatrix3x4dvEXT) then Exit;
+//    if not Assigned(glProgramUniformMatrix3x4dvEXT) then Exit;
     glProgramUniformMatrix4x2dvEXT := wglGetProcAddress('glProgramUniformMatrix4x2dvEXT');
-    if not Assigned(glProgramUniformMatrix4x2dvEXT) then Exit;
+//    if not Assigned(glProgramUniformMatrix4x2dvEXT) then Exit;
     glProgramUniformMatrix4x3dvEXT := wglGetProcAddress('glProgramUniformMatrix4x3dvEXT');
-    if not Assigned(glProgramUniformMatrix4x3dvEXT) then Exit;
+//    if not Assigned(glProgramUniformMatrix4x3dvEXT) then Exit;
     Result := True;
   end;
 end;

+ 438 - 16
packages/opengl/src/glx.pp

@@ -84,16 +84,6 @@ const
   GLX_ACCUM_BLUE_SIZE                   = 16;
   GLX_ACCUM_ALPHA_SIZE                  = 17;
 
-  // GLX_EXT_visual_info extension
-  GLX_X_VISUAL_TYPE_EXT                 = $22;
-  GLX_TRANSPARENT_TYPE_EXT              = $23;
-  GLX_TRANSPARENT_INDEX_VALUE_EXT       = $24;
-  GLX_TRANSPARENT_RED_VALUE_EXT         = $25;
-  GLX_TRANSPARENT_GREEN_VALUE_EXT       = $26;
-  GLX_TRANSPARENT_BLUE_VALUE_EXT        = $27;
-  GLX_TRANSPARENT_ALPHA_VALUE_EXT       = $28;
-
-
   // Error codes returned by glXGetConfig:
   GLX_BAD_SCREEN                        = 1;
   GLX_BAD_ATTRIBUTE                     = 2;
@@ -108,7 +98,105 @@ const
   GLX_VERSION                           = 2;
   GLX_EXTENSIONS                        = 3;
 
-  // GLX_visual_info extension
+  // GLX 1.3 and later:
+  GLX_CONFIG_CAVEAT               = $20;
+  GLX_DONT_CARE                   = $FFFFFFFF;
+  GLX_X_VISUAL_TYPE               = $22;
+  GLX_TRANSPARENT_TYPE            = $23;
+  GLX_TRANSPARENT_INDEX_VALUE     = $24;
+  GLX_TRANSPARENT_RED_VALUE       = $25;
+  GLX_TRANSPARENT_GREEN_VALUE     = $26;
+  GLX_TRANSPARENT_BLUE_VALUE      = $27;
+  GLX_TRANSPARENT_ALPHA_VALUE     = $28;
+  GLX_WINDOW_BIT                  = $00000001;
+  GLX_PIXMAP_BIT                  = $00000002;
+  GLX_PBUFFER_BIT                 = $00000004;
+  GLX_AUX_BUFFERS_BIT             = $00000010;
+  GLX_FRONT_LEFT_BUFFER_BIT       = $00000001;
+  GLX_FRONT_RIGHT_BUFFER_BIT      = $00000002;
+  GLX_BACK_LEFT_BUFFER_BIT        = $00000004;
+  GLX_BACK_RIGHT_BUFFER_BIT       = $00000008;
+  GLX_DEPTH_BUFFER_BIT            = $00000020;
+  GLX_STENCIL_BUFFER_BIT          = $00000040;
+  GLX_ACCUM_BUFFER_BIT            = $00000080;
+  GLX_NONE                        = $8000;
+  GLX_SLOW_CONFIG                 = $8001;
+  GLX_TRUE_COLOR                  = $8002;
+  GLX_DIRECT_COLOR                = $8003;
+  GLX_PSEUDO_COLOR                = $8004;
+  GLX_STATIC_COLOR                = $8005;
+  GLX_GRAY_SCALE                  = $8006;
+  GLX_STATIC_GRAY                 = $8007;
+  GLX_TRANSPARENT_RGB             = $8008;
+  GLX_TRANSPARENT_INDEX           = $8009;
+  GLX_VISUAL_ID                   = $800B;
+  GLX_SCREEN                      = $800C;
+  GLX_NON_CONFORMANT_CONFIG       = $800D;
+  GLX_DRAWABLE_TYPE               = $8010;
+  GLX_RENDER_TYPE                 = $8011;
+  GLX_X_RENDERABLE                = $8012;
+  GLX_FBCONFIG_ID                 = $8013;
+  GLX_RGBA_TYPE                   = $8014;
+  GLX_COLOR_INDEX_TYPE            = $8015;
+  GLX_MAX_PBUFFER_WIDTH           = $8016;
+  GLX_MAX_PBUFFER_HEIGHT          = $8017;
+  GLX_MAX_PBUFFER_PIXELS          = $8018;
+  GLX_PRESERVED_CONTENTS          = $801B;
+  GLX_LARGEST_PBUFFER             = $801C;
+  GLX_WIDTH                       = $801D;
+  GLX_HEIGHT                      = $801E;
+  GLX_EVENT_MASK                  = $801F;
+  GLX_DAMAGED                     = $8020;
+  GLX_SAVED                       = $8021;
+  GLX_WINDOW                      = $8022;
+  GLX_PBUFFER                     = $8023;
+  GLX_PBUFFER_HEIGHT              = $8040;
+  GLX_PBUFFER_WIDTH               = $8041;
+  GLX_RGBA_BIT                    = $00000001;
+  GLX_COLOR_INDEX_BIT             = $00000002;
+  GLX_PBUFFER_CLOBBER_MASK        = $08000000;
+
+  // GLX 1.4 and later:
+  GLX_SAMPLE_BUFFERS              = $186a0; // 100000
+  GLX_SAMPLES                     = $186a1; // 100001
+
+  // Extensions:
+
+  // GLX_ARB_multisample
+  GLX_SAMPLE_BUFFERS_ARB             = 100000;
+  GLX_SAMPLES_ARB                    = 100001;
+
+  // GLX_ARB_create_context (http://www.opengl.org/registry/specs/ARB/glx_create_context.txt)
+  GLX_CONTEXT_DEBUG_BIT_ARB          = $00000001;
+  GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB = $00000002;
+  GLX_CONTEXT_MAJOR_VERSION_ARB      = $2091;
+  GLX_CONTEXT_MINOR_VERSION_ARB      = $2092;
+  GLX_CONTEXT_FLAGS_ARB              = $2094;
+
+  // GLX_ARB_create_context_profile
+  GLX_CONTEXT_CORE_PROFILE_BIT_ARB   = $00000001;
+  GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB = $00000002;
+  GLX_CONTEXT_PROFILE_MASK_ARB       = $9126;
+
+  // GLX_ARB_create_context_robustness
+  GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB  = $00000004;
+  GLX_LOSE_CONTEXT_ON_RESET_ARB      = $8252;
+  GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB = $8256;
+  GLX_NO_RESET_NOTIFICATION_ARB      = $8261;
+
+  // GLX_SGIS_multisample
+  GLX_SAMPLE_BUFFERS_SGIS            = 100000;
+  GLX_SAMPLES_SGIS                   = 100001;
+
+  // GLX_EXT_visual_info
+  GLX_X_VISUAL_TYPE_EXT                 = $22;
+  GLX_TRANSPARENT_TYPE_EXT              = $23;
+  GLX_TRANSPARENT_INDEX_VALUE_EXT       = $24;
+  GLX_TRANSPARENT_RED_VALUE_EXT         = $25;
+  GLX_TRANSPARENT_GREEN_VALUE_EXT       = $26;
+  GLX_TRANSPARENT_BLUE_VALUE_EXT        = $27;
+  GLX_TRANSPARENT_ALPHA_VALUE_EXT       = $28;
+
   GLX_TRUE_COLOR_EXT                    = $8002;
   GLX_DIRECT_COLOR_EXT                  = $8003;
   GLX_PSEUDO_COLOR_EXT                  = $8004;
@@ -129,7 +217,7 @@ type
   GLXPixmap = TXID;
   GLXDrawable = TXID;
   GLXContextID = TXID;
-  
+
   TXPixmap = XPixmap;
   TXFont = XFont;
   TXColormap = XColormap;
@@ -137,7 +225,16 @@ type
   TGLXContext = GLXContext;
   TGLXPixmap = GLXPixmap;
   TGLXDrawable = GLXDrawable;
+  // GLX 1.3 and later
+  TGLXFBConfigRec = record { internal, use only a pointer to this } end;
+  TGLXFBConfig = ^TGLXFBConfigRec;
+  { PGLXFBConfig is a pointer to TGLXFBConfig (which is also a pointer).
+    glX uses this to represent an array of FB configs. }
+  PGLXFBConfig = ^TGLXFBConfig;
+  TGLXFBConfigID = TXID;
   TGLXContextID = GLXContextID;
+  TGLXWindow = TXID;
+  TGLXPbuffer = TXID;
 
 var
   glXChooseVisual: function(dpy: PDisplay; screen: Integer; attribList: PInteger): PXVisualInfo; cdecl;
@@ -163,24 +260,320 @@ var
   glXQueryServerString: function(dpy: PDisplay; screen, name: Integer): PChar; cdecl;
   glXGetClientString: function(dpy: PDisplay; name: Integer): PChar; cdecl;
 
-  // Mesa GLX Extensions
+  // GLX 1.2 and later
+  glXGetCurrentDisplay: function: PDisplay; cdecl;
+
+  // GLX 1.3 and later
+  glXChooseFBConfig: function(dpy: PDisplay; screen: Integer; attribList: PInteger; var nitems: Integer): PGLXFBConfig; cdecl;
+  glXGetFBConfigAttrib: function(dpy: PDisplay; config: TGLXFBConfig; attribute: Integer; var value: Integer): Integer; cdecl;
+  glXGetFBConfigs: function(dpy: PDisplay; screen: Integer; var nelements: Integer): PGLXFBConfig; cdecl;
+  glXGetVisualFromFBConfig: function(dpy: PDisplay; config: TGLXFBConfig): PXVisualInfo; cdecl;
+  glXCreateWindow: function(dpy: PDisplay; config: TGLXFBConfig; win: X.TWindow; attribList: PInteger): TGLXWindow; cdecl;
+  glXDestroyWindow: procedure (dpy: PDisplay; window: TGLXWindow); cdecl;
+  glXCreatePixmap: function(dpy: PDisplay; config: TGLXFBConfig; pixmap: TXPixmap; attribList: PInteger): TGLXPixmap; cdecl;
+  glXDestroyPixmap: procedure (dpy: PDisplay; pixmap: TGLXPixmap); cdecl;
+  glXCreatePbuffer: function(dpy: PDisplay; config: TGLXFBConfig; attribList: PInteger): TGLXPbuffer; cdecl;
+  glXDestroyPbuffer: procedure (dpy: PDisplay; pbuf: TGLXPbuffer); cdecl;
+  glXQueryDrawable: procedure (dpy: PDisplay; draw: TGLXDrawable; attribute: Integer; value: PLongWord); cdecl;
+  glXCreateNewContext: function(dpy: PDisplay; config: TGLXFBConfig; renderType: Integer; shareList: TGLXContext; direct: boolean): TGLXContext; cdecl;
+  glXMakeContextCurrent: function(dpy: PDisplay; draw: TGLXDrawable; read: GLXDrawable; ctx: TGLXContext): boolean; cdecl;
+  glXGetCurrentReadDrawable: function: TGLXDrawable; cdecl;
+  glXQueryContext: function(dpy: PDisplay; ctx: TGLXContext; attribute: Integer; var value: Integer): Integer; cdecl;
+  glXSelectEvent: procedure (dpy: PDisplay; drawable: TGLXDrawable; mask: LongWord); cdecl;
+  glXGetSelectedEvent: procedure (dpy: PDisplay; drawable: TGLXDrawable; mask: PLongWord); cdecl;
+
+  // GLX 1.4 and later
+  glXGetProcAddress: function(procname: PChar): Pointer; cdecl;
+
+  // Extensions:
+
+  // GLX_ARB_get_proc_address
+  glXGetProcAddressARB: function(procname: PChar): Pointer; cdecl;
+
+  // GLX_ARB_create_context
+  glXCreateContextAttribsARB: function (dpy: PDisplay; config: TGLXFBConfig; share_context: TGLXContext; direct: boolean; attrib_list: PInteger): TGLXContext; cdecl;
+
+  // GLX_MESA_pixmap_colormap
   glXCreateGLXPixmapMESA: function(dpy: PDisplay; visual: PXVisualInfo; pixmap: XPixmap; cmap: XColormap): GLXPixmap; cdecl;
+
+  // Unknown Mesa GLX extension (undocumented in current GLX C headers?)
   glXReleaseBufferMESA: function(dpy: PDisplay; d: GLXDrawable): Boolean; cdecl;
   glXCopySubBufferMESA: procedure(dpy: PDisplay; drawbale: GLXDrawable; x, y, width, height: Integer); cdecl;
+
+  // GLX_SGI_video_sync
   glXGetVideoSyncSGI: function(var counter: LongWord): Integer; cdecl;
   glXWaitVideoSyncSGI: function(divisor, remainder: Integer; var count: LongWord): Integer; cdecl;
 
-
 // =======================================================
 //
 // =======================================================
 
+{
+  Safe checking of glX version and extension presence.
+
+  For each glX version, these functions check that
+  - glXQueryExtension indicates that glX extension is present at all on this display.
+  - glXQueryVersion indicates that (at least) this version is supported.
+  - all the entry points defined for this glX version were
+    successfully loaded from the library.
+    For now, all glX versions are fully backward-compatible,
+    so e.g. if GLX_version_1_3 is true, you know that also GLX_version_1_2
+    and GLX_version_1_1 etc. are true,
+    and all entry points up to glX 1.3 are assigned.
+
+  For each extension, these functions check that
+  - it is declared within glXQueryExtensionsString (which in turn means
+    that glXQueryExtensionsString must be available, which requires glX 1.1)
+  - all it's entry points were successfully loaded from library
+
+  As such, these functions are the safest way to check if given
+  extension/glX version is available.
+
+  Note that the availability of glX version and extension may depend
+  on the X display and (in case of extension) even screen number.
+}
+
+function GLX_version_1_0(Display: PDisplay): boolean;
+function GLX_version_1_1(Display: PDisplay): boolean;
+function GLX_version_1_2(Display: PDisplay): boolean;
+function GLX_version_1_3(Display: PDisplay): boolean;
+function GLX_version_1_4(Display: PDisplay): boolean;
+
+function GLX_ARB_get_proc_address(Display: PDisplay; Screen: Integer): boolean;
+function GLX_ARB_create_context(Display: PDisplay; Screen: Integer): boolean;
+function GLX_ARB_create_context_profile(Display: PDisplay; Screen: Integer): boolean;
+function GLX_ARB_create_context_robustness(Display: PDisplay; Screen: Integer): boolean;
+function GLX_ARB_multisample(Display: PDisplay; Screen: Integer): boolean;
+function GLX_EXT_visual_info(Display: PDisplay; Screen: Integer): boolean;
+function GLX_MESA_pixmap_colormap(Display: PDisplay; Screen: Integer): boolean;
+function GLX_SGI_video_sync(Display: PDisplay; Screen: Integer): boolean;
+function GLX_SGIS_multisample(Display: PDisplay; Screen: Integer): boolean;
+
 implementation
 
-uses GL, dynlibs;
+uses GL, dynlibs, GLExt { for glext_ExtensionSupported utility };
 
 {$LINKLIB m}
 
+function GLX_version_1_0(Display: PDisplay): boolean;
+var
+  IgnoredErrorb, IgnoredEvent, Major, Minor: Integer;
+begin
+  Result :=
+    { check is glX present at all for this display }
+    Assigned(glXQueryExtension) and
+    glXQueryExtension(Display, IgnoredErrorb, IgnoredEvent) and
+    { check glXQueryVersion, although there is no glX with version < 1 }
+    Assigned(glXQueryVersion) and
+    glXQueryVersion(Display, Major, Minor) and
+    (Major >= 1) and
+    { check entry points assigned }
+    Assigned(glXChooseVisual) and
+    Assigned(glXCreateContext) and
+    Assigned(glXDestroyContext) and
+    Assigned(glXMakeCurrent) and
+    Assigned(glXCopyContext) and
+    Assigned(glXSwapBuffers) and
+    Assigned(glXCreateGLXPixmap) and
+    Assigned(glXDestroyGLXPixmap) and
+    { Assigned(glXQueryExtension) and } { (already checked) }
+    { Assigned(glXQueryVersion) and } { (already checked) }
+    Assigned(glXIsDirect) and
+    Assigned(glXGetConfig) and
+    Assigned(glXGetCurrentContext) and
+    Assigned(glXGetCurrentDrawable) and
+    Assigned(glXWaitGL) and
+    Assigned(glXWaitX) and
+    Assigned(glXUseXFont)
+end;
+
+function GLX_version_1_1(Display: PDisplay): boolean;
+var
+  Major, Minor: Integer;
+begin
+  Result :=
+    { check previous version Ok }
+    GLX_version_1_0(Display) and
+    { check glXQueryVersion }
+    glXQueryVersion(Display, Major, Minor) and
+    ( (Major > 1) or ((Major = 1) and (Minor >= 1)) ) and
+    { check entry points assigned }
+    Assigned(glXQueryExtensionsString) and
+    Assigned(glXQueryServerString) and
+    Assigned(glXGetClientString);
+end;
+
+function GLX_version_1_2(Display: PDisplay): boolean;
+var
+  Major, Minor: Integer;
+begin
+  Result :=
+    { check previous version Ok }
+    GLX_version_1_1(Display) and
+    { check glXQueryVersion }
+    glXQueryVersion(Display, Major, Minor) and
+    ( (Major > 1) or ((Major = 1) and (Minor >= 2)) ) and
+    { check entry points assigned }
+    Assigned(glXGetCurrentDisplay);
+end;
+
+function GLX_version_1_3(Display: PDisplay): boolean;
+var
+  Major, Minor: Integer;
+begin
+  Result :=
+    { check previous version Ok }
+    GLX_version_1_2(Display) and
+    { check glXQueryVersion }
+    glXQueryVersion(Display, Major, Minor) and
+    ( (Major > 1) or ((Major = 1) and (Minor >= 3)) ) and
+    { check entry points assigned }
+    Assigned(glXChooseFBConfig) and
+    Assigned(glXGetFBConfigAttrib) and
+    Assigned(glXGetFBConfigs) and
+    Assigned(glXGetVisualFromFBConfig) and
+    Assigned(glXCreateWindow) and
+    Assigned(glXDestroyWindow) and
+    Assigned(glXCreatePixmap) and
+    Assigned(glXDestroyPixmap) and
+    Assigned(glXCreatePbuffer) and
+    Assigned(glXDestroyPbuffer) and
+    Assigned(glXQueryDrawable) and
+    Assigned(glXCreateNewContext) and
+    Assigned(glXMakeContextCurrent) and
+    Assigned(glXGetCurrentReadDrawable) and
+    Assigned(glXQueryContext) and
+    Assigned(glXSelectEvent) and
+    Assigned(glXGetSelectedEvent);
+end;
+
+function GLX_version_1_4(Display: PDisplay): boolean;
+var
+  Major, Minor: Integer;
+begin
+  Result :=
+    { check previous version Ok }
+    GLX_version_1_3(Display) and
+    { check glXQueryVersion }
+    glXQueryVersion(Display, Major, Minor) and
+    ( (Major > 1) or ((Major = 1) and (Minor >= 4)) ) and
+    { check entry points assigned }
+    Assigned(glXGetProcAddress);
+end;
+
+function GLX_ARB_get_proc_address(Display: PDisplay; Screen: Integer): boolean;
+var
+  GlxExtensions: PChar;
+begin
+  Result := GLX_version_1_1(Display);
+  if Result then
+  begin
+    GlxExtensions := glXQueryExtensionsString(Display, Screen);
+    Result := glext_ExtensionSupported('GLX_ARB_get_proc_address', GlxExtensions) and
+      Assigned(glXGetProcAddressARB);
+  end;
+end;
+
+function GLX_ARB_create_context(Display: PDisplay; Screen: Integer): boolean;
+var
+  GlxExtensions: PChar;
+begin
+  Result := GLX_version_1_1(Display);
+  if Result then
+  begin
+    GlxExtensions := glXQueryExtensionsString(Display, Screen);
+    Result := glext_ExtensionSupported('GLX_ARB_create_context', GlxExtensions) and
+      Assigned(glXCreateContextAttribsARB);
+  end;
+end;
+
+function GLX_ARB_create_context_profile(Display: PDisplay; Screen: Integer): boolean;
+var
+  GlxExtensions: PChar;
+begin
+  Result := GLX_version_1_1(Display);
+  if Result then
+  begin
+    GlxExtensions := glXQueryExtensionsString(Display, Screen);
+    Result := glext_ExtensionSupported('GLX_ARB_create_context_profile', GlxExtensions);
+  end;
+end;
+
+function GLX_ARB_create_context_robustness(Display: PDisplay; Screen: Integer): boolean;
+var
+  GlxExtensions: PChar;
+begin
+  Result := GLX_version_1_1(Display);
+  if Result then
+  begin
+    GlxExtensions := glXQueryExtensionsString(Display, Screen);
+    Result := glext_ExtensionSupported('GLX_ARB_create_context_robustness', GlxExtensions);
+  end;
+end;
+
+function GLX_ARB_multisample(Display: PDisplay; Screen: Integer): boolean;
+var
+  GlxExtensions: PChar;
+begin
+  Result := GLX_version_1_1(Display);
+  if Result then
+  begin
+    GlxExtensions := glXQueryExtensionsString(Display, Screen);
+    Result := glext_ExtensionSupported('GLX_ARB_multisample', GlxExtensions);
+  end;
+end;
+
+function GLX_EXT_visual_info(Display: PDisplay; Screen: Integer): boolean;
+var
+  GlxExtensions: PChar;
+begin
+  Result := GLX_version_1_1(Display);
+  if Result then
+  begin
+    GlxExtensions := glXQueryExtensionsString(Display, Screen);
+    Result := glext_ExtensionSupported('GLX_EXT_visual_info', GlxExtensions);
+  end;
+end;
+
+function GLX_MESA_pixmap_colormap(Display: PDisplay; Screen: Integer): boolean;
+var
+  GlxExtensions: PChar;
+begin
+  Result := GLX_version_1_1(Display);
+  if Result then
+  begin
+    GlxExtensions := glXQueryExtensionsString(Display, Screen);
+    Result := glext_ExtensionSupported('GLX_MESA_pixmap_colormap', GlxExtensions) and
+      Assigned(glXCreateGLXPixmapMESA);
+  end;
+end;
+
+function GLX_SGI_video_sync(Display: PDisplay; Screen: Integer): boolean;
+var
+  GlxExtensions: PChar;
+begin
+  Result := GLX_version_1_1(Display);
+  if Result then
+  begin
+    GlxExtensions := glXQueryExtensionsString(Display, Screen);
+    Result := glext_ExtensionSupported('GLX_SGI_video_sync', GlxExtensions) and
+      Assigned(glXGetVideoSyncSGI) and
+      Assigned(glXWaitVideoSyncSGI);
+  end;
+end;
+
+function GLX_SGIS_multisample(Display: PDisplay; Screen: Integer): boolean;
+var
+  GlxExtensions: PChar;
+begin
+  Result := GLX_version_1_1(Display);
+  if Result then
+  begin
+    GlxExtensions := glXQueryExtensionsString(Display, Screen);
+    Result := glext_ExtensionSupported('GLX_SGIS_multisample', GlxExtensions);
+  end;
+end;
+
 function GetProc(handle: PtrInt; name: PChar): Pointer;
 begin
   Result := GetProcAddress(handle, name);
@@ -224,10 +617,39 @@ begin
   glXQueryExtensionsString := GetProc(OurLibGL, 'glXQueryExtensionsString');
   glXQueryServerString := GetProc(OurLibGL, 'glXQueryServerString');
   glXGetClientString := GetProc(OurLibGL, 'glXGetClientString');
-  // Mesa GLX Extensions
+  // GLX 1.2 and later
+  glXGetCurrentDisplay := GetProc(OurLibGL, 'glXGetCurrentDisplay');
+  // GLX 1.3 and later
+  glXChooseFBConfig := GetProc(OurLibGL, 'glXChooseFBConfig');
+  glXGetFBConfigAttrib := GetProc(OurLibGL, 'glXGetFBConfigAttrib');
+  glXGetFBConfigs := GetProc(OurLibGL, 'glXGetFBConfigs');
+  glXGetVisualFromFBConfig := GetProc(OurLibGL, 'glXGetVisualFromFBConfig');
+  glXCreateWindow := GetProc(OurLibGL, 'glXCreateWindow');
+  glXDestroyWindow := GetProc(OurLibGL, 'glXDestroyWindow');
+  glXCreatePixmap := GetProc(OurLibGL, 'glXCreatePixmap');
+  glXDestroyPixmap := GetProc(OurLibGL, 'glXDestroyPixmap');
+  glXCreatePbuffer := GetProc(OurLibGL, 'glXCreatePbuffer');
+  glXDestroyPbuffer := GetProc(OurLibGL, 'glXDestroyPbuffer');
+  glXQueryDrawable := GetProc(OurLibGL, 'glXQueryDrawable');
+  glXCreateNewContext := GetProc(OurLibGL, 'glXCreateNewContext');
+  glXMakeContextCurrent := GetProc(OurLibGL, 'glXMakeContextCurrent');
+  glXGetCurrentReadDrawable := GetProc(OurLibGL, 'glXGetCurrentReadDrawable');
+  glXQueryContext := GetProc(OurLibGL, 'glXQueryContext');
+  glXSelectEvent := GetProc(OurLibGL, 'glXSelectEvent');
+  glXGetSelectedEvent := GetProc(OurLibGL, 'glXGetSelectedEvent');
+  // GLX 1.4 and later
+  glXGetProcAddress := GetProc(OurLibGL, 'glXGetProcAddress');
+  // Extensions
+  // GLX_ARB_get_proc_address
+  glXGetProcAddressARB := GetProc(OurLibGL, 'glXGetProcAddressARB');
+  // GLX_ARB_create_context
+  glXCreateContextAttribsARB := GetProc(OurLibGL, 'glXCreateContextAttribsARB');
+  // GLX_MESA_pixmap_colormap
   glXCreateGLXPixmapMESA := GetProc(OurLibGL, 'glXCreateGLXPixmapMESA');
+  // Unknown Mesa GLX extension
   glXReleaseBufferMESA := GetProc(OurLibGL, 'glXReleaseBufferMESA');
   glXCopySubBufferMESA := GetProc(OurLibGL, 'glXCopySubBufferMESA');
+  // GLX_SGI_video_sync
   glXGetVideoSyncSGI := GetProc(OurLibGL, 'glXGetVideoSyncSGI');
   glXWaitVideoSyncSGI := GetProc(OurLibGL, 'glXWaitVideoSyncSGI');
 

+ 64 - 64
packages/symbolic/examples/Makefile

@@ -1,5 +1,5 @@
 #
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2011/08/03]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2011/08/13]
 #
 default: all
 MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-solaris x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded avr-embedded armeb-linux armeb-embedded mipsel-linux
@@ -289,193 +289,193 @@ FPCFPMAKE=$(FPC)
 endif
 endif
 ifeq ($(FULL_TARGET),i386-linux)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),i386-go32v2)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),i386-win32)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),i386-os2)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),i386-freebsd)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),i386-beos)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),i386-haiku)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),i386-solaris)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),i386-qnx)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),i386-netware)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),i386-openbsd)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),i386-wdosx)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),i386-darwin)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),i386-emx)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),i386-watcom)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),i386-netwlibc)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),i386-wince)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),i386-embedded)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),i386-symbian)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),i386-nativent)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),i386-iphonesim)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),m68k-linux)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),m68k-amiga)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),m68k-atari)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),m68k-openbsd)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),m68k-palmos)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),m68k-embedded)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),powerpc-linux)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),powerpc-amiga)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),powerpc-macos)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),powerpc-morphos)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),powerpc-embedded)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),powerpc-wii)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),sparc-linux)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),sparc-solaris)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),sparc-embedded)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),x86_64-linux)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),x86_64-solaris)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),x86_64-darwin)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),x86_64-embedded)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),arm-linux)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),arm-palmos)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),arm-darwin)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),arm-wince)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),arm-gba)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),arm-nds)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),arm-embedded)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),arm-symbian)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),powerpc64-darwin)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),avr-embedded)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),armeb-linux)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),armeb-embedded)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 ifeq ($(FULL_TARGET),mipsel-linux)
-override TARGET_PROGRAMS+=evaltest rpnthing
+override TARGET_PROGRAMS+=evaltest rpnthing easyevalexample
 endif
 override INSTALL_FPCPACKAGE=y
 ifdef REQUIRE_UNITSDIR

+ 1 - 1
packages/symbolic/examples/Makefile.fpc

@@ -3,7 +3,7 @@
 #
 
 [target]
-programs=evaltest rpnthing
+programs=evaltest rpnthing easyevalexample
 
 [require]
 packages=symbolic

+ 51 - 0
packages/symbolic/examples/easyevalexample.pp

@@ -0,0 +1,51 @@
+Program EasyEvalExample;
+{
+    Copyright (c) 2011 by Marco van de Voort([email protected])
+    member of the Free Pascal development team
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright. (LGPL-with-static-linking-exception)
+
+    Rock bottom example of new evaluator helper function.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+}
+
+{$mode delphi}
+Uses Symbolic,Classes,sysutils;
+
+var s : AnsiString;
+    a : extended;
+    b : integer;
+    
+begin
+  // quickevaluate('expression',[],[]); evaluates a constant expression to an
+  //  extended result
+
+  s:='(5+5+10)*2';
+  writeln(s,'=',QuickEvaluate(s,[],[]):10:1);
+
+
+  // ... but still allows variables:
+
+  a:=2.0;
+  b:=3;
+  s:='(5+A+10)*B';
+  // variable names are case sensitive!
+  writeln(s,'=',QuickEvaluate(s,['A','B'],[a,b]):10:1,' with A=',a:0:1,' and B=',b);
+
+ // now let's do that again, but add a symbol (C) that we don't define:
+
+ try
+   a:=2.0;
+   b:=3;
+   s:='(5+A+10)*B+C';
+   // variable names are case sensitive!
+   writeln(s,'=',QuickEvaluate(s,['A','B'],[a,b]):10:1,' with A=',a:0:1,' and B=',b);
+ except
+   on E:Exception do
+     Writeln('An exception occured: ',e.message);
+   end;
+end.

+ 1 - 0
packages/symbolic/fpmake.pp

@@ -40,6 +40,7 @@ begin
     P.ExamplePath.Add('examples');
     P.Targets.AddExampleProgram('evaltest.pas');
     P.Targets.AddExampleProgram('rpnthing.pas');
+    P.Targets.AddExampleProgram('easyevalexample.pas');
     P.Sources.AddDoc('doc/optimization.txt');
     P.Sources.AddDoc('doc/symbolic.txt');
 

+ 2 - 0
packages/symbolic/src/exprstrs.inc

@@ -15,6 +15,8 @@
  **********************************************************************}
 
 resourcestring
+   SEvalUnknownParameterType='QuickEvaluate: unknown variable type for parameter "%s".';
+   SEvalUndefinedVar	    ='QuickEvaluate: No value for parameter "%s".';
    SEvalIE                  ='TEvaluator: Internal Error: ';
    SEvalStackDepthExceeded  ='TEvaluator: Stack depth Evaluate exceeded';
    SEvalBadNumberOfVars     ='TEvaluator: Invalid number of variables';

+ 63 - 0
packages/symbolic/src/symbolic.pas

@@ -244,6 +244,8 @@ const InfixOperatorName   : array[addo..powo] of char= ('+','-','*','/','^');
 
 {$I exprstrs.inc}
 
+function QuickEvaluate(formula:ansistring;variablenames : array of ansistring;variablevalues:array of const):Double;
+
 implementation
 
 
@@ -484,6 +486,67 @@ end;
 {$I teval.inc}
 {$I rearrang.inc}
 
+
+function QuickEvaluate(formula:ansistring;variablenames : array of ansistring;variablevalues:array of const):Double;
+
+VAR Expr    : TExpression;
+    SymVars,VarName : TStringList;
+    I,j       : Longint;
+    Eval    : TEvaluator;
+    Vars    : Array[0..1] OF ArbFloat;
+    x : double;
+begin
+ Expr:=TExpression.Create(formula);
+ try
+   SymVars:=Expr.SymbolicValueNames;
+   try
+     VarName:=TStringList.Create;
+       try
+         Eval:=TEvaluator.Create(Varname,Expr);
+         try 
+           if high(variablenames)>0 then
+             begin
+               for i:=low(variablenames) to high(variablenames) do
+                 begin
+                   j:=symvars.indexof(variablenames[i]);
+                   if j<>-1 then
+                     begin
+                       case variablevalues[i].vtype of
+                         vtinteger : x:=variablevalues[i].vinteger;
+                         vtextended: x:=variablevalues[i].vextended^;		
+                       else
+                         raise exception.CreateFmt(SEvalUnknownParameterType,[variablenames[i]]);
+                         end;
+                       Eval.SetConstant(variablenames[i],x);
+                       symvars.objects[j]:=tobject(1);
+                       writeln(variablenames[i],'!');
+                     end;
+                 end;
+                 
+             end; 
+           i:=0;
+           while (i<symvars.count) and (symvars.objects[i]=tobject(1)) do inc(i);
+           if i<symvars.count then
+             begin
+               writeln(i, ' ',symvars.count);
+               raise Exception.CreateFmt(SEvalUndefinedVar,[symvars[i]]);
+             end;
+           result:=Eval.Evaluate([]);
+         finally 
+           varname:=nil;
+           eval.free;
+           end; 
+       finally
+         VarName.free;
+         end
+   finally
+     SymVars.free;
+     end;
+ finally
+   expr.free;
+   end;
+end;
+
 end.
 {
   $Log$

+ 1 - 0
rtl/objpas/rtlconst.inc

@@ -259,6 +259,7 @@ ResourceString
   SSocketRead                   = 'Read';
   SSocketWrite                  = 'Write';
   SSortedListError              = 'Operation not allowed on sorted list';
+  SStreamInvalidSeek            = 'Invalid stream operation %s.Seek';   
   SStreamNoReading              = 'Reading from %s is not supported';
   SStreamNoWriting              = 'Writing to %s is not supported';
   SStreamSetSize                = 'Error setting stream size';

+ 24 - 5
rtl/unix/keyboard.pp

@@ -742,7 +742,7 @@ type  key_sequence=packed record
         st:string[7];
       end;
 
-const key_sequences:array[0..276] of key_sequence=(
+const key_sequences:array[0..277] of key_sequence=(
        (char:0;scan:kbAltA;st:#27'A'),
        (char:0;scan:kbAltA;st:#27'a'),
        (char:0;scan:kbAltB;st:#27'B'),
@@ -982,6 +982,7 @@ const key_sequences:array[0..276] of key_sequence=(
        (char:0;scan:kbAltF11;st:#27'[23;3~'),    {xterm on FreeBSD}
        (char:0;scan:kbAltF12;st:#27'[24;3~'),    {xterm on FreeBSD}
 
+       (char:0;scan:kbShiftTab;st:#27#9),        {linux - 'Meta_Tab'}
        (char:0;scan:kbShiftTab;st:#27'[Z'),
        (char:0;scan:kbShiftUp;st:#27'[1;2A'),    {xterm}
        (char:0;scan:kbShiftDown;st:#27'[1;2B'),  {xterm}
@@ -1432,6 +1433,7 @@ begin {main}
         { Handle Ctrl-<x>, but not AltGr-<x> }
         if ((SState and kbCtrl)<>0) and ((SState and kbAlt) = 0)  then
           case MyScan of
+            kbShiftTab: MyScan := kbCtrlTab;
             kbHome..kbDel : { cArrow }
               MyScan:=CtrlArrow[MyScan];
             kbF1..KbF10 : { cF1-cF10 }
@@ -1442,6 +1444,7 @@ begin {main}
         { Handle Alt-<x>, but not AltGr }
         else if ((SState and kbAlt)<>0) and ((SState and kbCtrl) = 0) then
           case MyScan of
+            kbShiftTab: MyScan := kbAltTab;
             kbHome..kbDel : { AltArrow }
               MyScan:=AltArrow[MyScan];
             kbF1..KbF10 : { aF1-aF10 }
@@ -1520,11 +1523,27 @@ begin {main}
     if not again then
       begin
         MyScan:=EvalScan(ord(MyChar));
-        if ((SState and kbAlt)<>0) and ((SState and kbCtrl) = 0) then
+        if ((SState and kbCtrl)<>0) and ((SState and kbAlt) = 0) then
           begin
-            if MyScan in [$02..$0D] then
-              inc(MyScan,$76);
-            MyChar:=chr(0);
+            if MyChar=#9 then
+              begin
+                MyChar:=#0;
+                MyScan:=kbCtrlTab;
+              end;
+          end
+        else if ((SState and kbAlt)<>0) and ((SState and kbCtrl) = 0) then
+          begin
+            if MyChar=#9 then
+              begin
+                MyChar:=#0;
+                MyScan:=kbAltTab;
+              end
+            else
+              begin
+                if MyScan in [$02..$0D] then
+                  inc(MyScan,$76);
+                MyChar:=chr(0);
+              end;
           end
         else if (SState and kbShift)<>0 then
           if MyChar=#9 then

+ 1 - 0
rtl/win/sysutils.pp

@@ -811,6 +811,7 @@ begin
       ThousandSeparator:=GetLocaleChar(LID, LOCALE_STHOUSAND, ',');
       DecimalSeparator:=GetLocaleChar(LID, LOCALE_SDECIMAL, '.');
       CurrencyDecimals:=StrToIntDef(GetLocaleStr(LID, LOCALE_ICURRDIGITS, '0'), 0);
+      ListSeparator := GetLocaleChar(LID, LOCALE_SLIST, ',');
     end;
 end;
 

+ 17 - 22
utils/fpdoc/makeskel.lpi

@@ -1,23 +1,25 @@
 <?xml version="1.0"?>
 <CONFIG>
   <ProjectOptions>
-    <PathDelim Value="/"/>
-    <Version Value="6"/>
+    <Version Value="9"/>
     <General>
       <Flags>
         <MainUnitHasUsesSectionForAllUnits Value="False"/>
         <MainUnitHasCreateFormStatements Value="False"/>
         <MainUnitHasTitleStatement Value="False"/>
+        <LRSInOutputDirectory Value="False"/>
       </Flags>
+      <SessionStorage Value="InProjectDir"/>
       <MainUnit Value="0"/>
-      <TargetFileExt Value=""/>
-      <ActiveEditorIndexAtStart Value="1"/>
     </General>
     <VersionInfo>
-      <ProjectVersion Value=""/>
       <Language Value=""/>
       <CharSet Value=""/>
+      <StringTable ProductVersion=""/>
     </VersionInfo>
+    <BuildModes Count="1">
+      <Item1 Name="default" Default="True"/>
+    </BuildModes>
     <PublishOptions>
       <Version Value="2"/>
       <IgnoreBinaries Value="False"/>
@@ -27,6 +29,7 @@
     <RunParams>
       <local>
         <FormatVersion Value="1"/>
+        <CommandLineParams Value="--package=fpvectorial --input=/home/felipe/Programas/fpctrunk/packages/fpvectorial/src/fpvectorial.pas"/>
         <LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
       </local>
     </RunParams>
@@ -35,33 +38,25 @@
         <Filename Value="makeskel.pp"/>
         <IsPartOfProject Value="True"/>
         <UnitName Value="MakeSkel"/>
-        <CursorPos X="8" Y="22"/>
-        <TopLine Value="1"/>
-        <EditorIndex Value="0"/>
-        <UsageCount Value="20"/>
-        <Loaded Value="True"/>
       </Unit0>
       <Unit1>
         <Filename Value="dglobals.pp"/>
         <IsPartOfProject Value="True"/>
         <UnitName Value="dGlobals"/>
-        <CursorPos X="40" Y="311"/>
-        <TopLine Value="300"/>
-        <EditorIndex Value="1"/>
-        <UsageCount Value="20"/>
-        <Loaded Value="True"/>
       </Unit1>
     </Units>
-    <JumpHistory Count="1" HistoryIndex="0">
-      <Position1>
-        <Filename Value="makeskel.pp"/>
-        <Caret Line="22" Column="8" TopLine="1"/>
-      </Position1>
-    </JumpHistory>
   </ProjectOptions>
   <CompilerOptions>
-    <Version Value="8"/>
+    <Version Value="10"/>
+    <Parsing>
+      <SyntaxOptions>
+        <UseAnsiStrings Value="False"/>
+      </SyntaxOptions>
+    </Parsing>
     <Other>
+      <CompilerMessages>
+        <UseMsgFile Value="True"/>
+      </CompilerMessages>
       <CompilerPath Value="$(CompPath)"/>
     </Other>
   </CompilerOptions>

+ 8 - 0
utils/fpdoc/makeskel.pp

@@ -15,8 +15,12 @@
 }
 
 
+{%RunCommand $MakeExe($(EdFile)) --package=fpvectorial --input=/home/felipe/Programas/fpctrunk/packages/fpvectorial/src/fpvectorial.pas}
 program MakeSkel;
 
+{$mode objfpc}
+{$h+}
+
 uses
   SysUtils, Classes, Gettext,
   dGlobals, PasTree, PParser,PScanner;
@@ -379,6 +383,7 @@ Var
   Engine: TSkelEngine;
 
 begin
+  Result:='';
   Assign(f, AOutputName);
   Rewrite(f);
   Try
@@ -399,7 +404,10 @@ begin
             Engine.DocumentFile(F,InputFiles[I],OSTarget,CPUTarget);
           except
             on E:Exception do
+            begin
+              WriteLn('Error while documenting: '+E.message);
               Result:='Error while documenting: '+E.message;
+            end;
           end;
         Finally
           Engine.Free;