From e0caf654e6c56de827cf6ae98565873909cc2409 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sat, 12 Jan 2008 22:58:56 -0800 Subject: [PATCH 001/216] OpenGL 2.1 support --- core/alien/syntax/syntax.factor | 9 + extra/opengl/gl/gl.factor | 858 +++++++++++++++++++------ extra/opengl/gl/unix/unix.factor | 5 + extra/opengl/gl/windows/windows.factor | 18 + extra/opengl/opengl.factor | 101 ++- 5 files changed, 809 insertions(+), 182 deletions(-) create mode 100644 extra/opengl/gl/unix/unix.factor create mode 100644 extra/opengl/gl/windows/windows.factor diff --git a/core/alien/syntax/syntax.factor b/core/alien/syntax/syntax.factor index 99275d02bf..bc3bc911ef 100755 --- a/core/alien/syntax/syntax.factor +++ b/core/alien/syntax/syntax.factor @@ -23,6 +23,15 @@ IN: alien.syntax PRIVATE> +: indirect-quot ( function-ptr-quot return types abi -- quot ) + [ alien-indirect ] 3curry compose ; + +: define-indirect ( abi return function-ptr-quot function-name parameters -- ) + >r pick r> parse-arglist + rot create-in dup reset-generic + >r >r swapd roll indirect-quot r> r> + -rot define-declared ; + : DLL" skip-blank parse-string dlopen parsed ; parsing : ALIEN: scan string>number parsed ; parsing diff --git a/extra/opengl/gl/gl.factor b/extra/opengl/gl/gl.factor index 40ead55ddd..c7ce176aca 100644 --- a/extra/opengl/gl/gl.factor +++ b/extra/opengl/gl/gl.factor @@ -3,7 +3,10 @@ ! This file is based on the gl.h that comes with xorg-x11 6.8.2 -USING: alien alien.syntax kernel sequences words ; +USING: alien alien.syntax kernel sequences system words ; +USE-IF: windows? opengl.gl.windows +USE-IF: unix? opengl.gl.unix + IN: opengl.gl TYPEDEF: uint GLenum @@ -1118,195 +1121,690 @@ FUNCTION: void glPushName ( GLuint name ) ; FUNCTION: void glPopName ( ) ; +! OpenGL extension functions + + + + + ! OpenGL 1.2 -: GL_PACK_SKIP_IMAGES HEX: 806B ; inline -: GL_PACK_IMAGE_HEIGHT HEX: 806C ; inline -: GL_UNPACK_SKIP_IMAGES HEX: 806D ; inline -: GL_UNPACK_IMAGE_HEIGHT HEX: 806E ; inline -: GL_TEXTURE_3D HEX: 806F ; inline -: GL_PROXY_TEXTURE_3D HEX: 8070 ; inline -: GL_TEXTURE_DEPTH HEX: 8071 ; inline -: GL_TEXTURE_WRAP_R HEX: 8072 ; inline -: GL_MAX_3D_TEXTURE_SIZE HEX: 8073 ; inline -: GL_BGR HEX: 80E0 ; inline -: GL_BGRA HEX: 80E1 ; inline -: GL_UNSIGNED_BYTE_3_3_2 HEX: 8032 ; inline -: GL_UNSIGNED_BYTE_2_3_3_REV HEX: 8362 ; inline -: GL_UNSIGNED_SHORT_5_6_5 HEX: 8363 ; inline -: GL_UNSIGNED_SHORT_5_6_5_REV HEX: 8364 ; inline -: GL_UNSIGNED_SHORT_4_4_4_4 HEX: 8033 ; inline -: GL_UNSIGNED_SHORT_4_4_4_4_REV HEX: 8365 ; inline -: GL_UNSIGNED_SHORT_5_5_5_1 HEX: 8034 ; inline -: GL_UNSIGNED_SHORT_1_5_5_5_REV HEX: 8366 ; inline -: GL_UNSIGNED_INT_8_8_8_8 HEX: 8035 ; inline -: GL_UNSIGNED_INT_8_8_8_8_REV HEX: 8367 ; inline -: GL_UNSIGNED_INT_10_10_10_2 HEX: 8036 ; inline -: GL_UNSIGNED_INT_2_10_10_10_REV HEX: 8368 ; inline -: GL_RESCALE_NORMAL HEX: 803A ; inline -: GL_LIGHT_MODEL_COLOR_CONTROL HEX: 81F8 ; inline -: GL_SINGLE_COLOR HEX: 81F9 ; inline -: GL_SEPARATE_SPECULAR_COLOR HEX: 81FA ; inline -: GL_CLAMP_TO_EDGE HEX: 812F ; inline -: GL_TEXTURE_MIN_LOD HEX: 813A ; inline -: GL_TEXTURE_MAX_LOD HEX: 813B ; inline -: GL_TEXTURE_BASE_LEVEL HEX: 813C ; inline -: GL_TEXTURE_MAX_LEVEL HEX: 813D ; inline -: GL_MAX_ELEMENTS_VERTICES HEX: 80E8 ; inline -: GL_MAX_ELEMENTS_INDICES HEX: 80E9 ; inline -: GL_ALIASED_POINT_SIZE_RANGE HEX: 846D ; inline -: GL_ALIASED_LINE_WIDTH_RANGE HEX: 846E ; inline +: GL_SMOOTH_POINT_SIZE_RANGE HEX: 0B12 ; inline +: GL_SMOOTH_POINT_SIZE_GRANULARITY HEX: 0B13 ; inline +: GL_SMOOTH_LINE_WIDTH_RANGE HEX: 0B22 ; inline +: GL_SMOOTH_LINE_WIDTH_GRANULARITY HEX: 0B23 ; inline +: GL_UNSIGNED_BYTE_3_3_2 HEX: 8032 ; inline +: GL_UNSIGNED_SHORT_4_4_4_4 HEX: 8033 ; inline +: GL_UNSIGNED_SHORT_5_5_5_1 HEX: 8034 ; inline +: GL_UNSIGNED_INT_8_8_8_8 HEX: 8035 ; inline +: GL_UNSIGNED_INT_10_10_10_2 HEX: 8036 ; inline +: GL_RESCALE_NORMAL HEX: 803A ; inline +: GL_TEXTURE_BINDING_3D HEX: 806A ; inline +: GL_PACK_SKIP_IMAGES HEX: 806B ; inline +: GL_PACK_IMAGE_HEIGHT HEX: 806C ; inline +: GL_UNPACK_SKIP_IMAGES HEX: 806D ; inline +: GL_UNPACK_IMAGE_HEIGHT HEX: 806E ; inline +: GL_TEXTURE_3D HEX: 806F ; inline +: GL_PROXY_TEXTURE_3D HEX: 8070 ; inline +: GL_TEXTURE_DEPTH HEX: 8071 ; inline +: GL_TEXTURE_WRAP_R HEX: 8072 ; inline +: GL_MAX_3D_TEXTURE_SIZE HEX: 8073 ; inline +: GL_BGR HEX: 80E0 ; inline +: GL_BGRA HEX: 80E1 ; inline +: GL_MAX_ELEMENTS_VERTICES HEX: 80E8 ; inline +: GL_MAX_ELEMENTS_INDICES HEX: 80E9 ; inline +: GL_CLAMP_TO_EDGE HEX: 812F ; inline +: GL_TEXTURE_MIN_LOD HEX: 813A ; inline +: GL_TEXTURE_MAX_LOD HEX: 813B ; inline +: GL_TEXTURE_BASE_LEVEL HEX: 813C ; inline +: GL_TEXTURE_MAX_LEVEL HEX: 813D ; inline +: GL_LIGHT_MODEL_COLOR_CONTROL HEX: 81F8 ; inline +: GL_SINGLE_COLOR HEX: 81F9 ; inline +: GL_SEPARATE_SPECULAR_COLOR HEX: 81FA ; inline +: GL_UNSIGNED_BYTE_2_3_3_REV HEX: 8362 ; inline +: GL_UNSIGNED_SHORT_5_6_5 HEX: 8363 ; inline +: GL_UNSIGNED_SHORT_5_6_5_REV HEX: 8364 ; inline +: GL_UNSIGNED_SHORT_4_4_4_4_REV HEX: 8365 ; inline +: GL_UNSIGNED_SHORT_1_5_5_5_REV HEX: 8366 ; inline +: GL_UNSIGNED_INT_8_8_8_8_REV HEX: 8367 ; inline +: GL_UNSIGNED_INT_2_10_10_10_REV HEX: 8368 ; inline +: GL_ALIASED_POINT_SIZE_RANGE HEX: 846D ; inline +: GL_ALIASED_LINE_WIDTH_RANGE HEX: 846E ; inline -! Not present on Windows -! FUNCTION: void glDrawRangeElements ( GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, GLvoid* indices ) ; +GL-FUNCTION: void glCopyTexSubImage3D ( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height ) ; +GL-FUNCTION: void glDrawRangeElements ( GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, GLvoid* indices ) ; +GL-FUNCTION: void glTexImage3D ( GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, GLvoid* pixels ) ; +GL-FUNCTION: void glTexSubImage3D ( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLvoid* pixels ) ; -! FUNCTION: void glTexImage3D ( GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, GLvoid* pixels ) ; - -! FUNCTION: void glTexSubImage3D ( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLvoid* pixels ) ; - -! FUNCTION: void glCopyTexSubImage3D ( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height ) ; - -! TODO: the rest. looks fiddly ! OpenGL 1.3 -: GL_ACTIVE_TEXTURE HEX: 84E0 ; inline -: GL_CLIENT_ACTIVE_TEXTURE HEX: 84E1 ; inline -: GL_MAX_TEXTURE_UNITS HEX: 84E2 ; inline -: GL_TEXTURE0 HEX: 84C0 ; inline -: GL_TEXTURE1 HEX: 84C1 ; inline -: GL_TEXTURE2 HEX: 84C2 ; inline -: GL_TEXTURE3 HEX: 84C3 ; inline -: GL_TEXTURE4 HEX: 84C4 ; inline -: GL_TEXTURE5 HEX: 84C5 ; inline -: GL_TEXTURE6 HEX: 84C6 ; inline -: GL_TEXTURE7 HEX: 84C7 ; inline -: GL_TEXTURE8 HEX: 84C8 ; inline -: GL_TEXTURE9 HEX: 84C9 ; inline -: GL_TEXTURE10 HEX: 84CA ; inline -: GL_TEXTURE11 HEX: 84CB ; inline -: GL_TEXTURE12 HEX: 84CC ; inline -: GL_TEXTURE13 HEX: 84CD ; inline -: GL_TEXTURE14 HEX: 84CE ; inline -: GL_TEXTURE15 HEX: 84CF ; inline -: GL_TEXTURE16 HEX: 84D0 ; inline -: GL_TEXTURE17 HEX: 84D1 ; inline -: GL_TEXTURE18 HEX: 84D2 ; inline -: GL_TEXTURE19 HEX: 84D3 ; inline -: GL_TEXTURE20 HEX: 84D4 ; inline -: GL_TEXTURE21 HEX: 84D5 ; inline -: GL_TEXTURE22 HEX: 84D6 ; inline -: GL_TEXTURE23 HEX: 84D7 ; inline -: GL_TEXTURE24 HEX: 84D8 ; inline -: GL_TEXTURE25 HEX: 84D9 ; inline -: GL_TEXTURE26 HEX: 84DA ; inline -: GL_TEXTURE27 HEX: 84DB ; inline -: GL_TEXTURE28 HEX: 84DC ; inline -: GL_TEXTURE29 HEX: 84DD ; inline -: GL_TEXTURE30 HEX: 84DE ; inline -: GL_TEXTURE31 HEX: 84DF ; inline -: GL_NORMAL_MAP HEX: 8511 ; inline -: GL_REFLECTION_MAP HEX: 8512 ; inline -: GL_TEXTURE_CUBE_MAP HEX: 8513 ; inline -: GL_TEXTURE_BINDING_CUBE_MAP HEX: 8514 ; inline -: GL_TEXTURE_CUBE_MAP_POSITIVE_X HEX: 8515 ; inline -: GL_TEXTURE_CUBE_MAP_NEGATIVE_X HEX: 8516 ; inline -: GL_TEXTURE_CUBE_MAP_POSITIVE_Y HEX: 8517 ; inline -: GL_TEXTURE_CUBE_MAP_NEGATIVE_Y HEX: 8518 ; inline -: GL_TEXTURE_CUBE_MAP_POSITIVE_Z HEX: 8519 ; inline -: GL_TEXTURE_CUBE_MAP_NEGATIVE_Z HEX: 851A ; inline -: GL_PROXY_TEXTURE_CUBE_MAP HEX: 851B ; inline -: GL_MAX_CUBE_MAP_TEXTURE_SIZE HEX: 851C ; inline -: GL_COMBINE HEX: 8570 ; inline -: GL_COMBINE_RGB HEX: 8571 ; inline -: GL_COMBINE_ALPHA HEX: 8572 ; inline -: GL_RGB_SCALE HEX: 8573 ; inline -: GL_ADD_SIGNED HEX: 8574 ; inline -: GL_INTERPOLATE HEX: 8575 ; inline -: GL_CONSTANT HEX: 8576 ; inline -: GL_PRIMARY_COLOR HEX: 8577 ; inline -: GL_PREVIOUS HEX: 8578 ; inline -: GL_SOURCE0_RGB HEX: 8580 ; inline -: GL_SOURCE1_RGB HEX: 8581 ; inline -: GL_SOURCE2_RGB HEX: 8582 ; inline -: GL_SOURCE0_ALPHA HEX: 8588 ; inline -: GL_SOURCE1_ALPHA HEX: 8589 ; inline -: GL_SOURCE2_ALPHA HEX: 858A ; inline -: GL_OPERAND0_RGB HEX: 8590 ; inline -: GL_OPERAND1_RGB HEX: 8591 ; inline -: GL_OPERAND2_RGB HEX: 8592 ; inline -: GL_OPERAND0_ALPHA HEX: 8598 ; inline -: GL_OPERAND1_ALPHA HEX: 8599 ; inline -: GL_OPERAND2_ALPHA HEX: 859A ; inline -: GL_SUBTRACT HEX: 84E7 ; inline -: GL_TRANSPOSE_MODELVIEW_MATRIX HEX: 84E3 ; inline -: GL_TRANSPOSE_PROJECTION_MATRIX HEX: 84E4 ; inline -: GL_TRANSPOSE_TEXTURE_MATRIX HEX: 84E5 ; inline -: GL_TRANSPOSE_COLOR_MATRIX HEX: 84E6 ; inline -: GL_COMPRESSED_ALPHA HEX: 84E9 ; inline -: GL_COMPRESSED_LUMINANCE HEX: 84EA ; inline -: GL_COMPRESSED_LUMINANCE_ALPHA HEX: 84EB ; inline -: GL_COMPRESSED_INTENSITY HEX: 84EC ; inline -: GL_COMPRESSED_RGB HEX: 84ED ; inline -: GL_COMPRESSED_RGBA HEX: 84EE ; inline -: GL_TEXTURE_COMPRESSION_HINT HEX: 84EF ; inline -: GL_TEXTURE_COMPRESSED_IMAGE_SIZE HEX: 86A0 ; inline -: GL_TEXTURE_COMPRESSED HEX: 86A1 ; inline + +: GL_MULTISAMPLE HEX: 809D ; inline +: GL_SAMPLE_ALPHA_TO_COVERAGE HEX: 809E ; inline +: GL_SAMPLE_ALPHA_TO_ONE HEX: 809F ; inline +: GL_SAMPLE_COVERAGE HEX: 80A0 ; inline +: GL_SAMPLE_BUFFERS HEX: 80A8 ; inline +: GL_SAMPLES HEX: 80A9 ; inline +: GL_SAMPLE_COVERAGE_VALUE HEX: 80AA ; inline +: GL_SAMPLE_COVERAGE_INVERT HEX: 80AB ; inline +: GL_CLAMP_TO_BORDER HEX: 812D ; inline +: GL_TEXTURE0 HEX: 84C0 ; inline +: GL_TEXTURE1 HEX: 84C1 ; inline +: GL_TEXTURE2 HEX: 84C2 ; inline +: GL_TEXTURE3 HEX: 84C3 ; inline +: GL_TEXTURE4 HEX: 84C4 ; inline +: GL_TEXTURE5 HEX: 84C5 ; inline +: GL_TEXTURE6 HEX: 84C6 ; inline +: GL_TEXTURE7 HEX: 84C7 ; inline +: GL_TEXTURE8 HEX: 84C8 ; inline +: GL_TEXTURE9 HEX: 84C9 ; inline +: GL_TEXTURE10 HEX: 84CA ; inline +: GL_TEXTURE11 HEX: 84CB ; inline +: GL_TEXTURE12 HEX: 84CC ; inline +: GL_TEXTURE13 HEX: 84CD ; inline +: GL_TEXTURE14 HEX: 84CE ; inline +: GL_TEXTURE15 HEX: 84CF ; inline +: GL_TEXTURE16 HEX: 84D0 ; inline +: GL_TEXTURE17 HEX: 84D1 ; inline +: GL_TEXTURE18 HEX: 84D2 ; inline +: GL_TEXTURE19 HEX: 84D3 ; inline +: GL_TEXTURE20 HEX: 84D4 ; inline +: GL_TEXTURE21 HEX: 84D5 ; inline +: GL_TEXTURE22 HEX: 84D6 ; inline +: GL_TEXTURE23 HEX: 84D7 ; inline +: GL_TEXTURE24 HEX: 84D8 ; inline +: GL_TEXTURE25 HEX: 84D9 ; inline +: GL_TEXTURE26 HEX: 84DA ; inline +: GL_TEXTURE27 HEX: 84DB ; inline +: GL_TEXTURE28 HEX: 84DC ; inline +: GL_TEXTURE29 HEX: 84DD ; inline +: GL_TEXTURE30 HEX: 84DE ; inline +: GL_TEXTURE31 HEX: 84DF ; inline +: GL_ACTIVE_TEXTURE HEX: 84E0 ; inline +: GL_CLIENT_ACTIVE_TEXTURE HEX: 84E1 ; inline +: GL_MAX_TEXTURE_UNITS HEX: 84E2 ; inline +: GL_TRANSPOSE_MODELVIEW_MATRIX HEX: 84E3 ; inline +: GL_TRANSPOSE_PROJECTION_MATRIX HEX: 84E4 ; inline +: GL_TRANSPOSE_TEXTURE_MATRIX HEX: 84E5 ; inline +: GL_TRANSPOSE_COLOR_MATRIX HEX: 84E6 ; inline +: GL_SUBTRACT HEX: 84E7 ; inline +: GL_COMPRESSED_ALPHA HEX: 84E9 ; inline +: GL_COMPRESSED_LUMINANCE HEX: 84EA ; inline +: GL_COMPRESSED_LUMINANCE_ALPHA HEX: 84EB ; inline +: GL_COMPRESSED_INTENSITY HEX: 84EC ; inline +: GL_COMPRESSED_RGB HEX: 84ED ; inline +: GL_COMPRESSED_RGBA HEX: 84EE ; inline +: GL_TEXTURE_COMPRESSION_HINT HEX: 84EF ; inline +: GL_NORMAL_MAP HEX: 8511 ; inline +: GL_REFLECTION_MAP HEX: 8512 ; inline +: GL_TEXTURE_CUBE_MAP HEX: 8513 ; inline +: GL_TEXTURE_BINDING_CUBE_MAP HEX: 8514 ; inline +: GL_TEXTURE_CUBE_MAP_POSITIVE_X HEX: 8515 ; inline +: GL_TEXTURE_CUBE_MAP_NEGATIVE_X HEX: 8516 ; inline +: GL_TEXTURE_CUBE_MAP_POSITIVE_Y HEX: 8517 ; inline +: GL_TEXTURE_CUBE_MAP_NEGATIVE_Y HEX: 8518 ; inline +: GL_TEXTURE_CUBE_MAP_POSITIVE_Z HEX: 8519 ; inline +: GL_TEXTURE_CUBE_MAP_NEGATIVE_Z HEX: 851A ; inline +: GL_PROXY_TEXTURE_CUBE_MAP HEX: 851B ; inline +: GL_MAX_CUBE_MAP_TEXTURE_SIZE HEX: 851C ; inline +: GL_COMBINE HEX: 8570 ; inline +: GL_COMBINE_RGB HEX: 8571 ; inline +: GL_COMBINE_ALPHA HEX: 8572 ; inline +: GL_RGB_SCALE HEX: 8573 ; inline +: GL_ADD_SIGNED HEX: 8574 ; inline +: GL_INTERPOLATE HEX: 8575 ; inline +: GL_CONSTANT HEX: 8576 ; inline +: GL_PRIMARY_COLOR HEX: 8577 ; inline +: GL_PREVIOUS HEX: 8578 ; inline +: GL_SOURCE0_RGB HEX: 8580 ; inline +: GL_SOURCE1_RGB HEX: 8581 ; inline +: GL_SOURCE2_RGB HEX: 8582 ; inline +: GL_SOURCE0_ALPHA HEX: 8588 ; inline +: GL_SOURCE1_ALPHA HEX: 8589 ; inline +: GL_SOURCE2_ALPHA HEX: 858A ; inline +: GL_OPERAND0_RGB HEX: 8590 ; inline +: GL_OPERAND1_RGB HEX: 8591 ; inline +: GL_OPERAND2_RGB HEX: 8592 ; inline +: GL_OPERAND0_ALPHA HEX: 8598 ; inline +: GL_OPERAND1_ALPHA HEX: 8599 ; inline +: GL_OPERAND2_ALPHA HEX: 859A ; inline +: GL_TEXTURE_COMPRESSED_IMAGE_SIZE HEX: 86A0 ; inline +: GL_TEXTURE_COMPRESSED HEX: 86A1 ; inline : GL_NUM_COMPRESSED_TEXTURE_FORMATS HEX: 86A2 ; inline -: GL_COMPRESSED_TEXTURE_FORMATS HEX: 86A3 ; inline -: GL_DOT3_RGB HEX: 86AE ; inline -: GL_DOT3_RGBA HEX: 86AF ; inline -: GL_CLAMP_TO_BORDER HEX: 812D ; inline -: GL_MULTISAMPLE HEX: 809D ; inline -: GL_SAMPLE_ALPHA_TO_COVERAGE HEX: 809E ; inline -: GL_SAMPLE_ALPHA_TO_ONE HEX: 809F ; inline -: GL_SAMPLE_COVERAGE HEX: 80A0 ; inline -: GL_SAMPLE_BUFFERS HEX: 80A8 ; inline -: GL_SAMPLES HEX: 80A9 ; inline -: GL_SAMPLE_COVERAGE_VALUE HEX: 80AA ; inline -: GL_SAMPLE_COVERAGE_INVERT HEX: 80AB ; inline -: GL_MULTISAMPLE_BIT HEX: 20000000 ; inline +: GL_COMPRESSED_TEXTURE_FORMATS HEX: 86A3 ; inline +: GL_DOT3_RGB HEX: 86AE ; inline +: GL_DOT3_RGBA HEX: 86AF ; inline +: GL_MULTISAMPLE_BIT HEX: 20000000 ; inline + +GL-FUNCTION: void glActiveTexture ( GLenum texture ) ; +GL-FUNCTION: void glClientActiveTexture ( GLenum texture ) ; +GL-FUNCTION: void glCompressedTexImage1D ( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, GLvoid* data ) ; +GL-FUNCTION: void glCompressedTexImage2D ( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, GLvoid* data ) ; +GL-FUNCTION: void glCompressedTexImage3D ( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, GLvoid* data ) ; +GL-FUNCTION: void glCompressedTexSubImage1D ( GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, GLvoid* data ) ; +GL-FUNCTION: void glCompressedTexSubImage2D ( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, GLvoid* data ) ; +GL-FUNCTION: void glCompressedTexSubImage3D ( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, GLvoid* data ) ; +GL-FUNCTION: void glGetCompressedTexImage ( GLenum target, GLint lod, GLvoid* img ) ; +GL-FUNCTION: void glLoadTransposeMatrixd ( GLdouble m[16] ) ; +GL-FUNCTION: void glLoadTransposeMatrixf ( GLfloat m[16] ) ; +GL-FUNCTION: void glMultTransposeMatrixd ( GLdouble m[16] ) ; +GL-FUNCTION: void glMultTransposeMatrixf ( GLfloat m[16] ) ; +GL-FUNCTION: void glMultiTexCoord1d ( GLenum target, GLdouble s ) ; +GL-FUNCTION: void glMultiTexCoord1dv ( GLenum target, GLdouble* v ) ; +GL-FUNCTION: void glMultiTexCoord1f ( GLenum target, GLfloat s ) ; +GL-FUNCTION: void glMultiTexCoord1fv ( GLenum target, GLfloat* v ) ; +GL-FUNCTION: void glMultiTexCoord1i ( GLenum target, GLint s ) ; +GL-FUNCTION: void glMultiTexCoord1iv ( GLenum target, GLint* v ) ; +GL-FUNCTION: void glMultiTexCoord1s ( GLenum target, GLshort s ) ; +GL-FUNCTION: void glMultiTexCoord1sv ( GLenum target, GLshort* v ) ; +GL-FUNCTION: void glMultiTexCoord2d ( GLenum target, GLdouble s, GLdouble t ) ; +GL-FUNCTION: void glMultiTexCoord2dv ( GLenum target, GLdouble* v ) ; +GL-FUNCTION: void glMultiTexCoord2f ( GLenum target, GLfloat s, GLfloat t ) ; +GL-FUNCTION: void glMultiTexCoord2fv ( GLenum target, GLfloat* v ) ; +GL-FUNCTION: void glMultiTexCoord2i ( GLenum target, GLint s, GLint t ) ; +GL-FUNCTION: void glMultiTexCoord2iv ( GLenum target, GLint* v ) ; +GL-FUNCTION: void glMultiTexCoord2s ( GLenum target, GLshort s, GLshort t ) ; +GL-FUNCTION: void glMultiTexCoord2sv ( GLenum target, GLshort* v ) ; +GL-FUNCTION: void glMultiTexCoord3d ( GLenum target, GLdouble s, GLdouble t, GLdouble r ) ; +GL-FUNCTION: void glMultiTexCoord3dv ( GLenum target, GLdouble* v ) ; +GL-FUNCTION: void glMultiTexCoord3f ( GLenum target, GLfloat s, GLfloat t, GLfloat r ) ; +GL-FUNCTION: void glMultiTexCoord3fv ( GLenum target, GLfloat* v ) ; +GL-FUNCTION: void glMultiTexCoord3i ( GLenum target, GLint s, GLint t, GLint r ) ; +GL-FUNCTION: void glMultiTexCoord3iv ( GLenum target, GLint* v ) ; +GL-FUNCTION: void glMultiTexCoord3s ( GLenum target, GLshort s, GLshort t, GLshort r ) ; +GL-FUNCTION: void glMultiTexCoord3sv ( GLenum target, GLshort* v ) ; +GL-FUNCTION: void glMultiTexCoord4d ( GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q ) ; +GL-FUNCTION: void glMultiTexCoord4dv ( GLenum target, GLdouble* v ) ; +GL-FUNCTION: void glMultiTexCoord4f ( GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q ) ; +GL-FUNCTION: void glMultiTexCoord4fv ( GLenum target, GLfloat* v ) ; +GL-FUNCTION: void glMultiTexCoord4i ( GLenum target, GLint s, GLint t, GLint r, GLint q ) ; +GL-FUNCTION: void glMultiTexCoord4iv ( GLenum target, GLint* v ) ; +GL-FUNCTION: void glMultiTexCoord4s ( GLenum target, GLshort s, GLshort t, GLshort r, GLshort q ) ; +GL-FUNCTION: void glMultiTexCoord4sv ( GLenum target, GLshort* v ) ; +GL-FUNCTION: void glSampleCoverage ( GLclampf value, GLboolean invert ) ; ! OpenGL 1.4 -: GL_POINT_SIZE_MIN HEX: 8126 ; inline -: GL_POINT_SIZE_MAX HEX: 8127 ; inline -: GL_POINT_FADE_THRESHOLD_SIZE HEX: 8128 ; inline -: GL_POINT_DISTANCE_ATTENUATION HEX: 8129 ; inline -: GL_FOG_COORDINATE_SOURCE HEX: 8450 ; inline -: GL_FOG_COORDINATE HEX: 8451 ; inline -: GL_FRAGMENT_DEPTH HEX: 8452 ; inline -: GL_CURRENT_FOG_COORDINATE HEX: 8453 ; inline -: GL_FOG_COORDINATE_ARRAY_TYPE HEX: 8454 ; inline -: GL_FOG_COORDINATE_ARRAY_STRIDE HEX: 8455 ; inline -: GL_FOG_COORDINATE_ARRAY_POINTER HEX: 8456 ; inline -: GL_FOG_COORDINATE_ARRAY HEX: 8457 ; inline -: GL_COLOR_SUM HEX: 8458 ; inline -: GL_CURRENT_SECONDARY_COLOR HEX: 8459 ; inline -: GL_SECONDARY_COLOR_ARRAY_SIZE HEX: 845A ; inline -: GL_SECONDARY_COLOR_ARRAY_TYPE HEX: 845B ; inline -: GL_SECONDARY_COLOR_ARRAY_STRIDE HEX: 845C ; inline -: GL_SECONDARY_COLOR_ARRAY_POINTER HEX: 845D ; inline -: GL_SECONDARY_COLOR_ARRAY HEX: 845E ; inline -: GL_INCR_WRAP HEX: 8507 ; inline -: GL_DECR_WRAP HEX: 8508 ; inline -: GL_MAX_TEXTURE_LOD_BIAS HEX: 84FD ; inline -: GL_TEXTURE_FILTER_CONTROL HEX: 8500 ; inline -: GL_TEXTURE_LOD_BIAS HEX: 8501 ; inline -: GL_GENERATE_MIPMAP HEX: 8191 ; inline -: GL_GENERATE_MIPMAP_HINT HEX: 8192 ; inline -: GL_BLEND_DST_RGB HEX: 80C8 ; inline -: GL_BLEND_SRC_RGB HEX: 80C9 ; inline -: GL_BLEND_DST_ALPHA HEX: 80CA ; inline -: GL_BLEND_SRC_ALPHA HEX: 80CB ; inline -: GL_MIRRORED_REPEAT HEX: 8370 ; inline -: GL_DEPTH_COMPONENT16 HEX: 81A5 ; inline -: GL_DEPTH_COMPONENT24 HEX: 81A6 ; inline -: GL_DEPTH_COMPONENT32 HEX: 81A7 ; inline -: GL_TEXTURE_DEPTH_SIZE HEX: 884A ; inline -: GL_DEPTH_TEXTURE_MODE HEX: 884B ; inline -: GL_TEXTURE_COMPARE_MODE HEX: 884C ; inline -: GL_TEXTURE_COMPARE_FUNC HEX: 884D ; inline -: GL_COMPARE_R_TO_TEXTURE HEX: 884E ; inline + +: GL_BLEND_DST_RGB HEX: 80C8 ; inline +: GL_BLEND_SRC_RGB HEX: 80C9 ; inline +: GL_BLEND_DST_ALPHA HEX: 80CA ; inline +: GL_BLEND_SRC_ALPHA HEX: 80CB ; inline +: GL_POINT_SIZE_MIN HEX: 8126 ; inline +: GL_POINT_SIZE_MAX HEX: 8127 ; inline +: GL_POINT_FADE_THRESHOLD_SIZE HEX: 8128 ; inline +: GL_POINT_DISTANCE_ATTENUATION HEX: 8129 ; inline +: GL_GENERATE_MIPMAP HEX: 8191 ; inline +: GL_GENERATE_MIPMAP_HINT HEX: 8192 ; inline +: GL_DEPTH_COMPONENT16 HEX: 81A5 ; inline +: GL_DEPTH_COMPONENT24 HEX: 81A6 ; inline +: GL_DEPTH_COMPONENT32 HEX: 81A7 ; inline +: GL_MIRRORED_REPEAT HEX: 8370 ; inline +: GL_FOG_COORDINATE_SOURCE HEX: 8450 ; inline +: GL_FOG_COORDINATE HEX: 8451 ; inline +: GL_FRAGMENT_DEPTH HEX: 8452 ; inline +: GL_CURRENT_FOG_COORDINATE HEX: 8453 ; inline +: GL_FOG_COORDINATE_ARRAY_TYPE HEX: 8454 ; inline +: GL_FOG_COORDINATE_ARRAY_STRIDE HEX: 8455 ; inline +: GL_FOG_COORDINATE_ARRAY_POINTER HEX: 8456 ; inline +: GL_FOG_COORDINATE_ARRAY HEX: 8457 ; inline +: GL_COLOR_SUM HEX: 8458 ; inline +: GL_CURRENT_SECONDARY_COLOR HEX: 8459 ; inline +: GL_SECONDARY_COLOR_ARRAY_SIZE HEX: 845A ; inline +: GL_SECONDARY_COLOR_ARRAY_TYPE HEX: 845B ; inline +: GL_SECONDARY_COLOR_ARRAY_STRIDE HEX: 845C ; inline +: GL_SECONDARY_COLOR_ARRAY_POINTER HEX: 845D ; inline +: GL_SECONDARY_COLOR_ARRAY HEX: 845E ; inline +: GL_MAX_TEXTURE_LOD_BIAS HEX: 84FD ; inline +: GL_TEXTURE_FILTER_CONTROL HEX: 8500 ; inline +: GL_TEXTURE_LOD_BIAS HEX: 8501 ; inline +: GL_INCR_WRAP HEX: 8507 ; inline +: GL_DECR_WRAP HEX: 8508 ; inline +: GL_TEXTURE_DEPTH_SIZE HEX: 884A ; inline +: GL_DEPTH_TEXTURE_MODE HEX: 884B ; inline +: GL_TEXTURE_COMPARE_MODE HEX: 884C ; inline +: GL_TEXTURE_COMPARE_FUNC HEX: 884D ; inline +: GL_COMPARE_R_TO_TEXTURE HEX: 884E ; inline + +GL-FUNCTION: void glBlendColor ( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ) ; +GL-FUNCTION: void glBlendEquation ( GLenum mode ) ; +GL-FUNCTION: void glBlendFuncSeparate ( GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha ) ; +GL-FUNCTION: void glFogCoordPointer ( GLenum type, GLsizei stride, GLvoid* pointer ) ; +GL-FUNCTION: void glFogCoordd ( GLdouble coord ) ; +GL-FUNCTION: void glFogCoorddv ( GLdouble* coord ) ; +GL-FUNCTION: void glFogCoordf ( GLfloat coord ) ; +GL-FUNCTION: void glFogCoordfv ( GLfloat* coord ) ; +GL-FUNCTION: void glMultiDrawArrays ( GLenum mode, GLint* first, GLsizei* count, GLsizei primcount ) ; +GL-FUNCTION: void glMultiDrawElements ( GLenum mode, GLsizei* count, GLenum type, GLvoid** indices, GLsizei primcount ) ; +GL-FUNCTION: void glPointParameterf ( GLenum pname, GLfloat param ) ; +GL-FUNCTION: void glPointParameterfv ( GLenum pname, GLfloat* params ) ; +GL-FUNCTION: void glSecondaryColor3b ( GLbyte red, GLbyte green, GLbyte blue ) ; +GL-FUNCTION: void glSecondaryColor3bv ( GLbyte* v ) ; +GL-FUNCTION: void glSecondaryColor3d ( GLdouble red, GLdouble green, GLdouble blue ) ; +GL-FUNCTION: void glSecondaryColor3dv ( GLdouble* v ) ; +GL-FUNCTION: void glSecondaryColor3f ( GLfloat red, GLfloat green, GLfloat blue ) ; +GL-FUNCTION: void glSecondaryColor3fv ( GLfloat* v ) ; +GL-FUNCTION: void glSecondaryColor3i ( GLint red, GLint green, GLint blue ) ; +GL-FUNCTION: void glSecondaryColor3iv ( GLint* v ) ; +GL-FUNCTION: void glSecondaryColor3s ( GLshort red, GLshort green, GLshort blue ) ; +GL-FUNCTION: void glSecondaryColor3sv ( GLshort* v ) ; +GL-FUNCTION: void glSecondaryColor3ub ( GLubyte red, GLubyte green, GLubyte blue ) ; +GL-FUNCTION: void glSecondaryColor3ubv ( GLubyte* v ) ; +GL-FUNCTION: void glSecondaryColor3ui ( GLuint red, GLuint green, GLuint blue ) ; +GL-FUNCTION: void glSecondaryColor3uiv ( GLuint* v ) ; +GL-FUNCTION: void glSecondaryColor3us ( GLushort red, GLushort green, GLushort blue ) ; +GL-FUNCTION: void glSecondaryColor3usv ( GLushort* v ) ; +GL-FUNCTION: void glSecondaryColorPointer ( GLint size, GLenum type, GLsizei stride, GLvoid* pointer ) ; +GL-FUNCTION: void glWindowPos2d ( GLdouble x, GLdouble y ) ; +GL-FUNCTION: void glWindowPos2dv ( GLdouble* p ) ; +GL-FUNCTION: void glWindowPos2f ( GLfloat x, GLfloat y ) ; +GL-FUNCTION: void glWindowPos2fv ( GLfloat* p ) ; +GL-FUNCTION: void glWindowPos2i ( GLint x, GLint y ) ; +GL-FUNCTION: void glWindowPos2iv ( GLint* p ) ; +GL-FUNCTION: void glWindowPos2s ( GLshort x, GLshort y ) ; +GL-FUNCTION: void glWindowPos2sv ( GLshort* p ) ; +GL-FUNCTION: void glWindowPos3d ( GLdouble x, GLdouble y, GLdouble z ) ; +GL-FUNCTION: void glWindowPos3dv ( GLdouble* p ) ; +GL-FUNCTION: void glWindowPos3f ( GLfloat x, GLfloat y, GLfloat z ) ; +GL-FUNCTION: void glWindowPos3fv ( GLfloat* p ) ; +GL-FUNCTION: void glWindowPos3i ( GLint x, GLint y, GLint z ) ; +GL-FUNCTION: void glWindowPos3iv ( GLint* p ) ; +GL-FUNCTION: void glWindowPos3s ( GLshort x, GLshort y, GLshort z ) ; +GL-FUNCTION: void glWindowPos3sv ( GLshort* p ) ; + + +! OpenGL 1.5 + +: GL_BUFFER_SIZE HEX: 8764 ; inline +: GL_BUFFER_USAGE HEX: 8765 ; inline +: GL_QUERY_COUNTER_BITS HEX: 8864 ; inline +: GL_CURRENT_QUERY HEX: 8865 ; inline +: GL_QUERY_RESULT HEX: 8866 ; inline +: GL_QUERY_RESULT_AVAILABLE HEX: 8867 ; inline +: GL_ARRAY_BUFFER HEX: 8892 ; inline +: GL_ELEMENT_ARRAY_BUFFER HEX: 8893 ; inline +: GL_ARRAY_BUFFER_BINDING HEX: 8894 ; inline +: GL_ELEMENT_ARRAY_BUFFER_BINDING HEX: 8895 ; inline +: GL_VERTEX_ARRAY_BUFFER_BINDING HEX: 8896 ; inline +: GL_NORMAL_ARRAY_BUFFER_BINDING HEX: 8897 ; inline +: GL_COLOR_ARRAY_BUFFER_BINDING HEX: 8898 ; inline +: GL_INDEX_ARRAY_BUFFER_BINDING HEX: 8899 ; inline +: GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING HEX: 889A ; inline +: GL_EDGE_FLAG_ARRAY_BUFFER_BINDING HEX: 889B ; inline +: GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING HEX: 889C ; inline +: GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING HEX: 889D ; inline +: GL_WEIGHT_ARRAY_BUFFER_BINDING HEX: 889E ; inline +: GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING HEX: 889F ; inline +: GL_READ_ONLY HEX: 88B8 ; inline +: GL_WRITE_ONLY HEX: 88B9 ; inline +: GL_READ_WRITE HEX: 88BA ; inline +: GL_BUFFER_ACCESS HEX: 88BB ; inline +: GL_BUFFER_MAPPED HEX: 88BC ; inline +: GL_BUFFER_MAP_POINTER HEX: 88BD ; inline +: GL_STREAM_DRAW HEX: 88E0 ; inline +: GL_STREAM_READ HEX: 88E1 ; inline +: GL_STREAM_COPY HEX: 88E2 ; inline +: GL_STATIC_DRAW HEX: 88E4 ; inline +: GL_STATIC_READ HEX: 88E5 ; inline +: GL_STATIC_COPY HEX: 88E6 ; inline +: GL_DYNAMIC_DRAW HEX: 88E8 ; inline +: GL_DYNAMIC_READ HEX: 88E9 ; inline +: GL_DYNAMIC_COPY HEX: 88EA ; inline +: GL_SAMPLES_PASSED HEX: 8914 ; inline +: GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE ; inline +: GL_FOG_COORD GL_FOG_COORDINATE ; inline +: GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY ; inline +: GL_SRC0_RGB GL_SOURCE0_RGB ; inline +: GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER ; inline +: GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE ; inline +: GL_SRC1_ALPHA GL_SOURCE1_ALPHA ; inline +: GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE ; inline +: GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE ; inline +: GL_SRC0_ALPHA GL_SOURCE0_ALPHA ; inline +: GL_SRC1_RGB GL_SOURCE1_RGB ; inline +: GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING ; inline +: GL_SRC2_ALPHA GL_SOURCE2_ALPHA ; inline +: GL_SRC2_RGB GL_SOURCE2_RGB ; inline + +TYPEDEF: long ptrdiff_t + +TYPEDEF: ptrdiff_t GLsizeiptr +TYPEDEF: ptrdiff_t GLintptr + +GL-FUNCTION: void glBeginQuery ( GLenum target, GLuint id ) ; +GL-FUNCTION: void glBindBuffer ( GLenum target, GLuint buffer ) ; +GL-FUNCTION: void glBufferData ( GLenum target, GLsizeiptr size, GLvoid* data, GLenum usage ) ; +GL-FUNCTION: void glBufferSubData ( GLenum target, GLintptr offset, GLsizeiptr size, GLvoid* data ) ; +GL-FUNCTION: void glDeleteBuffers ( GLsizei n, GLuint* buffers ) ; +GL-FUNCTION: void glDeleteQueries ( GLsizei n, GLuint* ids ) ; +GL-FUNCTION: void glEndQuery ( GLenum target ) ; +GL-FUNCTION: void glGenBuffers ( GLsizei n, GLuint* buffers ) ; +GL-FUNCTION: void glGenQueries ( GLsizei n, GLuint* ids ) ; +GL-FUNCTION: void glGetBufferParameteriv ( GLenum target, GLenum pname, GLint* params ) ; +GL-FUNCTION: void glGetBufferPointerv ( GLenum target, GLenum pname, GLvoid** params ) ; +GL-FUNCTION: void glGetBufferSubData ( GLenum target, GLintptr offset, GLsizeiptr size, GLvoid* data ) ; +GL-FUNCTION: void glGetQueryObjectiv ( GLuint id, GLenum pname, GLint* params ) ; +GL-FUNCTION: void glGetQueryObjectuiv ( GLuint id, GLenum pname, GLuint* params ) ; +GL-FUNCTION: void glGetQueryiv ( GLenum target, GLenum pname, GLint* params ) ; +GL-FUNCTION: GLboolean glIsBuffer ( GLuint buffer ) ; +GL-FUNCTION: GLboolean glIsQuery ( GLuint id ) ; +GL-FUNCTION: GLvoid* glMapBuffer ( GLenum target, GLenum access ) ; +GL-FUNCTION: GLboolean glUnmapBuffer ( GLenum target ) ; + + +! OpenGL 2.0 + + +: GL_VERTEX_ATTRIB_ARRAY_ENABLED HEX: 8622 ; inline +: GL_VERTEX_ATTRIB_ARRAY_SIZE HEX: 8623 ; inline +: GL_VERTEX_ATTRIB_ARRAY_STRIDE HEX: 8624 ; inline +: GL_VERTEX_ATTRIB_ARRAY_TYPE HEX: 8625 ; inline +: GL_CURRENT_VERTEX_ATTRIB HEX: 8626 ; inline +: GL_VERTEX_PROGRAM_POINT_SIZE HEX: 8642 ; inline +: GL_VERTEX_PROGRAM_TWO_SIDE HEX: 8643 ; inline +: GL_VERTEX_ATTRIB_ARRAY_POINTER HEX: 8645 ; inline +: GL_STENCIL_BACK_FUNC HEX: 8800 ; inline +: GL_STENCIL_BACK_FAIL HEX: 8801 ; inline +: GL_STENCIL_BACK_PASS_DEPTH_FAIL HEX: 8802 ; inline +: GL_STENCIL_BACK_PASS_DEPTH_PASS HEX: 8803 ; inline +: GL_MAX_DRAW_BUFFERS HEX: 8824 ; inline +: GL_DRAW_BUFFER0 HEX: 8825 ; inline +: GL_DRAW_BUFFER1 HEX: 8826 ; inline +: GL_DRAW_BUFFER2 HEX: 8827 ; inline +: GL_DRAW_BUFFER3 HEX: 8828 ; inline +: GL_DRAW_BUFFER4 HEX: 8829 ; inline +: GL_DRAW_BUFFER5 HEX: 882A ; inline +: GL_DRAW_BUFFER6 HEX: 882B ; inline +: GL_DRAW_BUFFER7 HEX: 882C ; inline +: GL_DRAW_BUFFER8 HEX: 882D ; inline +: GL_DRAW_BUFFER9 HEX: 882E ; inline +: GL_DRAW_BUFFER10 HEX: 882F ; inline +: GL_DRAW_BUFFER11 HEX: 8830 ; inline +: GL_DRAW_BUFFER12 HEX: 8831 ; inline +: GL_DRAW_BUFFER13 HEX: 8832 ; inline +: GL_DRAW_BUFFER14 HEX: 8833 ; inline +: GL_DRAW_BUFFER15 HEX: 8834 ; inline +: GL_BLEND_EQUATION_ALPHA HEX: 883D ; inline +: GL_POINT_SPRITE HEX: 8861 ; inline +: GL_COORD_REPLACE HEX: 8862 ; inline +: GL_MAX_VERTEX_ATTRIBS HEX: 8869 ; inline +: GL_VERTEX_ATTRIB_ARRAY_NORMALIZED HEX: 886A ; inline +: GL_MAX_TEXTURE_COORDS HEX: 8871 ; inline +: GL_MAX_TEXTURE_IMAGE_UNITS HEX: 8872 ; inline +: GL_FRAGMENT_SHADER HEX: 8B30 ; inline +: GL_VERTEX_SHADER HEX: 8B31 ; inline +: GL_MAX_FRAGMENT_UNIFORM_COMPONENTS HEX: 8B49 ; inline +: GL_MAX_VERTEX_UNIFORM_COMPONENTS HEX: 8B4A ; inline +: GL_MAX_VARYING_FLOATS HEX: 8B4B ; inline +: GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS HEX: 8B4C ; inline +: GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS HEX: 8B4D ; inline +: GL_SHADER_TYPE HEX: 8B4F ; inline +: GL_FLOAT_VEC2 HEX: 8B50 ; inline +: GL_FLOAT_VEC3 HEX: 8B51 ; inline +: GL_FLOAT_VEC4 HEX: 8B52 ; inline +: GL_INT_VEC2 HEX: 8B53 ; inline +: GL_INT_VEC3 HEX: 8B54 ; inline +: GL_INT_VEC4 HEX: 8B55 ; inline +: GL_BOOL HEX: 8B56 ; inline +: GL_BOOL_VEC2 HEX: 8B57 ; inline +: GL_BOOL_VEC3 HEX: 8B58 ; inline +: GL_BOOL_VEC4 HEX: 8B59 ; inline +: GL_FLOAT_MAT2 HEX: 8B5A ; inline +: GL_FLOAT_MAT3 HEX: 8B5B ; inline +: GL_FLOAT_MAT4 HEX: 8B5C ; inline +: GL_SAMPLER_1D HEX: 8B5D ; inline +: GL_SAMPLER_2D HEX: 8B5E ; inline +: GL_SAMPLER_3D HEX: 8B5F ; inline +: GL_SAMPLER_CUBE HEX: 8B60 ; inline +: GL_SAMPLER_1D_SHADOW HEX: 8B61 ; inline +: GL_SAMPLER_2D_SHADOW HEX: 8B62 ; inline +: GL_DELETE_STATUS HEX: 8B80 ; inline +: GL_COMPILE_STATUS HEX: 8B81 ; inline +: GL_LINK_STATUS HEX: 8B82 ; inline +: GL_VALIDATE_STATUS HEX: 8B83 ; inline +: GL_INFO_LOG_LENGTH HEX: 8B84 ; inline +: GL_ATTACHED_SHADERS HEX: 8B85 ; inline +: GL_ACTIVE_UNIFORMS HEX: 8B86 ; inline +: GL_ACTIVE_UNIFORM_MAX_LENGTH HEX: 8B87 ; inline +: GL_SHADER_SOURCE_LENGTH HEX: 8B88 ; inline +: GL_ACTIVE_ATTRIBUTES HEX: 8B89 ; inline +: GL_ACTIVE_ATTRIBUTE_MAX_LENGTH HEX: 8B8A ; inline +: GL_FRAGMENT_SHADER_DERIVATIVE_HINT HEX: 8B8B ; inline +: GL_SHADING_LANGUAGE_VERSION HEX: 8B8C ; inline +: GL_CURRENT_PROGRAM HEX: 8B8D ; inline +: GL_POINT_SPRITE_COORD_ORIGIN HEX: 8CA0 ; inline +: GL_LOWER_LEFT HEX: 8CA1 ; inline +: GL_UPPER_LEFT HEX: 8CA2 ; inline +: GL_STENCIL_BACK_REF HEX: 8CA3 ; inline +: GL_STENCIL_BACK_VALUE_MASK HEX: 8CA4 ; inline +: GL_STENCIL_BACK_WRITEMASK HEX: 8CA5 ; inline +: GL_BLEND_EQUATION HEX: 8009 ; inline +: GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION ; inline + +TYPEDEF: char GLchar + +GL-FUNCTION: void glAttachShader ( GLuint program, GLuint shader ) ; +GL-FUNCTION: void glBindAttribLocation ( GLuint program, GLuint index, GLchar* name ) ; +GL-FUNCTION: void glBlendEquationSeparate ( GLenum modeRGB, GLenum modeAlpha ) ; +GL-FUNCTION: void glCompileShader ( GLuint shader ) ; +GL-FUNCTION: GLuint glCreateProgram ( ) ; +GL-FUNCTION: GLuint glCreateShader ( GLenum type ) ; +GL-FUNCTION: void glDeleteProgram ( GLuint program ) ; +GL-FUNCTION: void glDeleteShader ( GLuint shader ) ; +GL-FUNCTION: void glDetachShader ( GLuint program, GLuint shader ) ; +GL-FUNCTION: void glDisableVertexAttribArray ( GLuint index ) ; +GL-FUNCTION: void glDrawBuffers ( GLsizei n, GLenum* bufs ) ; +GL-FUNCTION: void glEnableVertexAttribArray ( GLuint index ) ; +GL-FUNCTION: void glGetActiveAttrib ( GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name ) ; +GL-FUNCTION: void glGetActiveUniform ( GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name ) ; +GL-FUNCTION: void glGetAttachedShaders ( GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders ) ; +GL-FUNCTION: GLint glGetAttribLocation ( GLuint program, GLchar* name ) ; +GL-FUNCTION: void glGetProgramInfoLog ( GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog ) ; +GL-FUNCTION: void glGetProgramiv ( GLuint program, GLenum pname, GLint* param ) ; +GL-FUNCTION: void glGetShaderInfoLog ( GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog ) ; +GL-FUNCTION: void glGetShaderSource ( GLint obj, GLsizei maxLength, GLsizei* length, GLchar* source ) ; +GL-FUNCTION: void glGetShaderiv ( GLuint shader, GLenum pname, GLint* param ) ; +GL-FUNCTION: GLint glGetUniformLocation ( GLint programObj, GLchar* name ) ; +GL-FUNCTION: void glGetUniformfv ( GLuint program, GLint location, GLfloat* params ) ; +GL-FUNCTION: void glGetUniformiv ( GLuint program, GLint location, GLint* params ) ; +GL-FUNCTION: void glGetVertexAttribPointerv ( GLuint index, GLenum pname, GLvoid** pointer ) ; +GL-FUNCTION: void glGetVertexAttribdv ( GLuint index, GLenum pname, GLdouble* params ) ; +GL-FUNCTION: void glGetVertexAttribfv ( GLuint index, GLenum pname, GLfloat* params ) ; +GL-FUNCTION: void glGetVertexAttribiv ( GLuint index, GLenum pname, GLint* params ) ; +GL-FUNCTION: GLboolean glIsProgram ( GLuint program ) ; +GL-FUNCTION: GLboolean glIsShader ( GLuint shader ) ; +GL-FUNCTION: void glLinkProgram ( GLuint program ) ; +GL-FUNCTION: void glShaderSource ( GLuint shader, GLsizei count, GLchar** strings, GLint* lengths ) ; +GL-FUNCTION: void glStencilFuncSeparate ( GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask ) ; +GL-FUNCTION: void glStencilMaskSeparate ( GLenum face, GLuint mask ) ; +GL-FUNCTION: void glStencilOpSeparate ( GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass ) ; +GL-FUNCTION: void glUniform1f ( GLint location, GLfloat v0 ) ; +GL-FUNCTION: void glUniform1fv ( GLint location, GLsizei count, GLfloat* value ) ; +GL-FUNCTION: void glUniform1i ( GLint location, GLint v0 ) ; +GL-FUNCTION: void glUniform1iv ( GLint location, GLsizei count, GLint* value ) ; +GL-FUNCTION: void glUniform2f ( GLint location, GLfloat v0, GLfloat v1 ) ; +GL-FUNCTION: void glUniform2fv ( GLint location, GLsizei count, GLfloat* value ) ; +GL-FUNCTION: void glUniform2i ( GLint location, GLint v0, GLint v1 ) ; +GL-FUNCTION: void glUniform2iv ( GLint location, GLsizei count, GLint* value ) ; +GL-FUNCTION: void glUniform3f ( GLint location, GLfloat v0, GLfloat v1, GLfloat v2 ) ; +GL-FUNCTION: void glUniform3fv ( GLint location, GLsizei count, GLfloat* value ) ; +GL-FUNCTION: void glUniform3i ( GLint location, GLint v0, GLint v1, GLint v2 ) ; +GL-FUNCTION: void glUniform3iv ( GLint location, GLsizei count, GLint* value ) ; +GL-FUNCTION: void glUniform4f ( GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3 ) ; +GL-FUNCTION: void glUniform4fv ( GLint location, GLsizei count, GLfloat* value ) ; +GL-FUNCTION: void glUniform4i ( GLint location, GLint v0, GLint v1, GLint v2, GLint v3 ) ; +GL-FUNCTION: void glUniform4iv ( GLint location, GLsizei count, GLint* value ) ; +GL-FUNCTION: void glUniformMatrix2fv ( GLint location, GLsizei count, GLboolean transpose, GLfloat* value ) ; +GL-FUNCTION: void glUniformMatrix3fv ( GLint location, GLsizei count, GLboolean transpose, GLfloat* value ) ; +GL-FUNCTION: void glUniformMatrix4fv ( GLint location, GLsizei count, GLboolean transpose, GLfloat* value ) ; +GL-FUNCTION: void glUseProgram ( GLuint program ) ; +GL-FUNCTION: void glValidateProgram ( GLuint program ) ; +GL-FUNCTION: void glVertexAttrib1d ( GLuint index, GLdouble x ) ; +GL-FUNCTION: void glVertexAttrib1dv ( GLuint index, GLdouble* v ) ; +GL-FUNCTION: void glVertexAttrib1f ( GLuint index, GLfloat x ) ; +GL-FUNCTION: void glVertexAttrib1fv ( GLuint index, GLfloat* v ) ; +GL-FUNCTION: void glVertexAttrib1s ( GLuint index, GLshort x ) ; +GL-FUNCTION: void glVertexAttrib1sv ( GLuint index, GLshort* v ) ; +GL-FUNCTION: void glVertexAttrib2d ( GLuint index, GLdouble x, GLdouble y ) ; +GL-FUNCTION: void glVertexAttrib2dv ( GLuint index, GLdouble* v ) ; +GL-FUNCTION: void glVertexAttrib2f ( GLuint index, GLfloat x, GLfloat y ) ; +GL-FUNCTION: void glVertexAttrib2fv ( GLuint index, GLfloat* v ) ; +GL-FUNCTION: void glVertexAttrib2s ( GLuint index, GLshort x, GLshort y ) ; +GL-FUNCTION: void glVertexAttrib2sv ( GLuint index, GLshort* v ) ; +GL-FUNCTION: void glVertexAttrib3d ( GLuint index, GLdouble x, GLdouble y, GLdouble z ) ; +GL-FUNCTION: void glVertexAttrib3dv ( GLuint index, GLdouble* v ) ; +GL-FUNCTION: void glVertexAttrib3f ( GLuint index, GLfloat x, GLfloat y, GLfloat z ) ; +GL-FUNCTION: void glVertexAttrib3fv ( GLuint index, GLfloat* v ) ; +GL-FUNCTION: void glVertexAttrib3s ( GLuint index, GLshort x, GLshort y, GLshort z ) ; +GL-FUNCTION: void glVertexAttrib3sv ( GLuint index, GLshort* v ) ; +GL-FUNCTION: void glVertexAttrib4Nbv ( GLuint index, GLbyte* v ) ; +GL-FUNCTION: void glVertexAttrib4Niv ( GLuint index, GLint* v ) ; +GL-FUNCTION: void glVertexAttrib4Nsv ( GLuint index, GLshort* v ) ; +GL-FUNCTION: void glVertexAttrib4Nub ( GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w ) ; +GL-FUNCTION: void glVertexAttrib4Nubv ( GLuint index, GLubyte* v ) ; +GL-FUNCTION: void glVertexAttrib4Nuiv ( GLuint index, GLuint* v ) ; +GL-FUNCTION: void glVertexAttrib4Nusv ( GLuint index, GLushort* v ) ; +GL-FUNCTION: void glVertexAttrib4bv ( GLuint index, GLbyte* v ) ; +GL-FUNCTION: void glVertexAttrib4d ( GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w ) ; +GL-FUNCTION: void glVertexAttrib4dv ( GLuint index, GLdouble* v ) ; +GL-FUNCTION: void glVertexAttrib4f ( GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w ) ; +GL-FUNCTION: void glVertexAttrib4fv ( GLuint index, GLfloat* v ) ; +GL-FUNCTION: void glVertexAttrib4iv ( GLuint index, GLint* v ) ; +GL-FUNCTION: void glVertexAttrib4s ( GLuint index, GLshort x, GLshort y, GLshort z, GLshort w ) ; +GL-FUNCTION: void glVertexAttrib4sv ( GLuint index, GLshort* v ) ; +GL-FUNCTION: void glVertexAttrib4ubv ( GLuint index, GLubyte* v ) ; +GL-FUNCTION: void glVertexAttrib4uiv ( GLuint index, GLuint* v ) ; +GL-FUNCTION: void glVertexAttrib4usv ( GLuint index, GLushort* v ) ; +GL-FUNCTION: void glVertexAttribPointer ( GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLvoid* pointer ) ; + + +! OpenGL 2.1 + + +: GL_CURRENT_RASTER_SECONDARY_COLOR HEX: 845F ; inline +: GL_PIXEL_PACK_BUFFER HEX: 88EB ; inline +: GL_PIXEL_UNPACK_BUFFER HEX: 88EC ; inline +: GL_PIXEL_PACK_BUFFER_BINDING HEX: 88ED ; inline +: GL_PIXEL_UNPACK_BUFFER_BINDING HEX: 88EF ; inline +: GL_SRGB HEX: 8C40 ; inline +: GL_SRGB8 HEX: 8C41 ; inline +: GL_SRGB_ALPHA HEX: 8C42 ; inline +: GL_SRGB8_ALPHA8 HEX: 8C43 ; inline +: GL_SLUMINANCE_ALPHA HEX: 8C44 ; inline +: GL_SLUMINANCE8_ALPHA8 HEX: 8C45 ; inline +: GL_SLUMINANCE HEX: 8C46 ; inline +: GL_SLUMINANCE8 HEX: 8C47 ; inline +: GL_COMPRESSED_SRGB HEX: 8C48 ; inline +: GL_COMPRESSED_SRGB_ALPHA HEX: 8C49 ; inline +: GL_COMPRESSED_SLUMINANCE HEX: 8C4A ; inline +: GL_COMPRESSED_SLUMINANCE_ALPHA HEX: 8C4B ; inline + +GL-FUNCTION: void glUniformMatrix2x3fv ( GLint location, GLsizei count, GLboolean transpose, GLfloat* value ) ; +GL-FUNCTION: void glUniformMatrix2x4fv ( GLint location, GLsizei count, GLboolean transpose, GLfloat* value ) ; +GL-FUNCTION: void glUniformMatrix3x2fv ( GLint location, GLsizei count, GLboolean transpose, GLfloat* value ) ; +GL-FUNCTION: void glUniformMatrix3x4fv ( GLint location, GLsizei count, GLboolean transpose, GLfloat* value ) ; +GL-FUNCTION: void glUniformMatrix4x2fv ( GLint location, GLsizei count, GLboolean transpose, GLfloat* value ) ; +GL-FUNCTION: void glUniformMatrix4x3fv ( GLint location, GLsizei count, GLboolean transpose, GLfloat* value ) ; + + +! GL_EXT_framebuffer_object + + +: GL_INVALID_FRAMEBUFFER_OPERATION_EXT HEX: 0506 ; inline +: GL_MAX_RENDERBUFFER_SIZE_EXT HEX: 84E8 ; inline +: GL_FRAMEBUFFER_BINDING_EXT HEX: 8CA6 ; inline +: GL_RENDERBUFFER_BINDING_EXT HEX: 8CA7 ; inline +: GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT HEX: 8CD0 ; inline +: GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT HEX: 8CD1 ; inline +: GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT HEX: 8CD2 ; inline +: GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT HEX: 8CD3 ; inline +: GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT HEX: 8CD4 ; inline +: GL_FRAMEBUFFER_COMPLETE_EXT HEX: 8CD5 ; inline +: GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT HEX: 8CD6 ; inline +: GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT HEX: 8CD7 ; inline +: GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT HEX: 8CD9 ; inline +: GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT HEX: 8CDA ; inline +: GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT HEX: 8CDB ; inline +: GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT HEX: 8CDC ; inline +: GL_FRAMEBUFFER_UNSUPPORTED_EXT HEX: 8CDD ; inline +: GL_MAX_COLOR_ATTACHMENTS_EXT HEX: 8CDF ; inline +: GL_COLOR_ATTACHMENT0_EXT HEX: 8CE0 ; inline +: GL_COLOR_ATTACHMENT1_EXT HEX: 8CE1 ; inline +: GL_COLOR_ATTACHMENT2_EXT HEX: 8CE2 ; inline +: GL_COLOR_ATTACHMENT3_EXT HEX: 8CE3 ; inline +: GL_COLOR_ATTACHMENT4_EXT HEX: 8CE4 ; inline +: GL_COLOR_ATTACHMENT5_EXT HEX: 8CE5 ; inline +: GL_COLOR_ATTACHMENT6_EXT HEX: 8CE6 ; inline +: GL_COLOR_ATTACHMENT7_EXT HEX: 8CE7 ; inline +: GL_COLOR_ATTACHMENT8_EXT HEX: 8CE8 ; inline +: GL_COLOR_ATTACHMENT9_EXT HEX: 8CE9 ; inline +: GL_COLOR_ATTACHMENT10_EXT HEX: 8CEA ; inline +: GL_COLOR_ATTACHMENT11_EXT HEX: 8CEB ; inline +: GL_COLOR_ATTACHMENT12_EXT HEX: 8CEC ; inline +: GL_COLOR_ATTACHMENT13_EXT HEX: 8CED ; inline +: GL_COLOR_ATTACHMENT14_EXT HEX: 8CEE ; inline +: GL_COLOR_ATTACHMENT15_EXT HEX: 8CEF ; inline +: GL_DEPTH_ATTACHMENT_EXT HEX: 8D00 ; inline +: GL_STENCIL_ATTACHMENT_EXT HEX: 8D20 ; inline +: GL_FRAMEBUFFER_EXT HEX: 8D40 ; inline +: GL_RENDERBUFFER_EXT HEX: 8D41 ; inline +: GL_RENDERBUFFER_WIDTH_EXT HEX: 8D42 ; inline +: GL_RENDERBUFFER_HEIGHT_EXT HEX: 8D43 ; inline +: GL_RENDERBUFFER_INTERNAL_FORMAT_EXT HEX: 8D44 ; inline +: GL_STENCIL_INDEX1_EXT HEX: 8D46 ; inline +: GL_STENCIL_INDEX4_EXT HEX: 8D47 ; inline +: GL_STENCIL_INDEX8_EXT HEX: 8D48 ; inline +: GL_STENCIL_INDEX16_EXT HEX: 8D49 ; inline +: GL_RENDERBUFFER_RED_SIZE_EXT HEX: 8D50 ; inline +: GL_RENDERBUFFER_GREEN_SIZE_EXT HEX: 8D51 ; inline +: GL_RENDERBUFFER_BLUE_SIZE_EXT HEX: 8D52 ; inline +: GL_RENDERBUFFER_ALPHA_SIZE_EXT HEX: 8D53 ; inline +: GL_RENDERBUFFER_DEPTH_SIZE_EXT HEX: 8D54 ; inline +: GL_RENDERBUFFER_STENCIL_SIZE_EXT HEX: 8D55 ; inline + +GL-FUNCTION: void glBindFramebufferEXT ( GLenum target, GLuint framebuffer ) ; +GL-FUNCTION: void glBindRenderbufferEXT ( GLenum target, GLuint renderbuffer ) ; +GL-FUNCTION: GLenum glCheckFramebufferStatusEXT ( GLenum target ) ; +GL-FUNCTION: void glDeleteFramebuffersEXT ( GLsizei n, GLuint* framebuffers ) ; +GL-FUNCTION: void glDeleteRenderbuffersEXT ( GLsizei n, GLuint* renderbuffers ) ; +GL-FUNCTION: void glFramebufferRenderbufferEXT ( GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer ) ; +GL-FUNCTION: void glFramebufferTexture1DEXT ( GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level ) ; +GL-FUNCTION: void glFramebufferTexture2DEXT ( GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level ) ; +GL-FUNCTION: void glFramebufferTexture3DEXT ( GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset ) ; +GL-FUNCTION: void glGenFramebuffersEXT ( GLsizei n, GLuint* framebuffers ) ; +GL-FUNCTION: void glGenRenderbuffersEXT ( GLsizei n, GLuint* renderbuffers ) ; +GL-FUNCTION: void glGenerateMipmapEXT ( GLenum target ) ; +GL-FUNCTION: void glGetFramebufferAttachmentParameterivEXT ( GLenum target, GLenum attachment, GLenum pname, GLint* params ) ; +GL-FUNCTION: void glGetRenderbufferParameterivEXT ( GLenum target, GLenum pname, GLint* params ) ; +GL-FUNCTION: GLboolean glIsFramebufferEXT ( GLuint framebuffer ) ; +GL-FUNCTION: GLboolean glIsRenderbufferEXT ( GLuint renderbuffer ) ; +GL-FUNCTION: void glRenderbufferStorageEXT ( GLenum target, GLenum internalformat, GLsizei width, GLsizei height ) ; + + +! GL_ARB_texture_float + + +: GL_RGBA32F_ARB HEX: 8814 ; inline +: GL_RGB32F_ARB HEX: 8815 ; inline +: GL_ALPHA32F_ARB HEX: 8816 ; inline +: GL_INTENSITY32F_ARB HEX: 8817 ; inline +: GL_LUMINANCE32F_ARB HEX: 8818 ; inline +: GL_LUMINANCE_ALPHA32F_ARB HEX: 8819 ; inline +: GL_RGBA16F_ARB HEX: 881A ; inline +: GL_RGB16F_ARB HEX: 881B ; inline +: GL_ALPHA16F_ARB HEX: 881C ; inline +: GL_INTENSITY16F_ARB HEX: 881D ; inline +: GL_LUMINANCE16F_ARB HEX: 881E ; inline +: GL_LUMINANCE_ALPHA16F_ARB HEX: 881F ; inline +: GL_TEXTURE_RED_TYPE_ARB HEX: 8C10 ; inline +: GL_TEXTURE_GREEN_TYPE_ARB HEX: 8C11 ; inline +: GL_TEXTURE_BLUE_TYPE_ARB HEX: 8C12 ; inline +: GL_TEXTURE_ALPHA_TYPE_ARB HEX: 8C13 ; inline +: GL_TEXTURE_LUMINANCE_TYPE_ARB HEX: 8C14 ; inline +: GL_TEXTURE_INTENSITY_TYPE_ARB HEX: 8C15 ; inline +: GL_TEXTURE_DEPTH_TYPE_ARB HEX: 8C16 ; inline +: GL_UNSIGNED_NORMALIZED_ARB HEX: 8C17 ; inline + diff --git a/extra/opengl/gl/unix/unix.factor b/extra/opengl/gl/unix/unix.factor new file mode 100644 index 0000000000..08141ad81d --- /dev/null +++ b/extra/opengl/gl/unix/unix.factor @@ -0,0 +1,5 @@ +USING: alien.syntax kernel syntax words ; + +IN: opengl.gl.unix + +: GL-FUNCTION: \ FUNCTION: word-def call ; parsing diff --git a/extra/opengl/gl/windows/windows.factor b/extra/opengl/gl/windows/windows.factor new file mode 100644 index 0000000000..96fb91793d --- /dev/null +++ b/extra/opengl/gl/windows/windows.factor @@ -0,0 +1,18 @@ +USING: alien alien.syntax kernel libc namespaces parser + sequences syntax system vectors ; + +IN: opengl.gl.windows + +SYMBOL: gl-function-pointers + +LIBRARY: gl +FUNCTION: void* wglGetProcAddress ( char* name ) ; + +: GL-FUNCTION: + "stdcall" + scan + scan + dup [ wglGetProcAddress check-ptr ] curry swap + ";" parse-tokens [ "()" subseq? not ] subset + define-indirect + ; parsing diff --git a/extra/opengl/opengl.factor b/extra/opengl/opengl.factor index aabdccd1fb..dd9d6b8ccd 100644 --- a/extra/opengl/opengl.factor +++ b/extra/opengl/opengl.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2005, 2007 Slava Pestov. ! Portions copyright (C) 2007 Eduardo Cavazos. ! See http://factorcode.org/license.txt for BSD license. -USING: alien alien.c-types kernel math namespaces sequences +USING: alien alien.c-types kernel libc math namespaces sequences math.vectors math.constants math.functions opengl.gl opengl.glu combinators arrays ; IN: opengl @@ -20,7 +20,7 @@ IN: opengl : gl-error ( -- ) glGetError dup zero? [ - "GL error: " dup gluErrorString append throw + "GL error: " over gluErrorString append throw ] unless drop ; : do-state ( what quot -- ) @@ -185,3 +185,100 @@ TUPLE: sprite loc dim dim2 dlist texture ; glLoadIdentity GL_MODELVIEW glMatrixMode glLoadIdentity ; + +! Shaders + +: c-true? ( int -- ? ) zero? not ; inline + +: with-gl-shader-source-ptr ( string quot -- ) + swap dup length 1+ [ tuck string>memory swap call ] with-malloc ; inline + +: ( source kind -- shader ) + glCreateShader dup rot [ 1 swap f glShaderSource ] with-gl-shader-source-ptr + [ glCompileShader ] keep + gl-error ; + +: (gl-shader?) ( object -- ? ) + dup integer? [ glIsShader c-true? ] [ drop f ] if ; + +: gl-shader-get-int ( shader enum -- value ) + 0 [ glGetShaderiv ] keep *int ; + +: gl-shader-ok? ( shader -- ? ) + GL_COMPILE_STATUS gl-shader-get-int c-true? ; + +: ( source -- vertex-shader ) + GL_VERTEX_SHADER ; inline + +: (vertex-shader?) ( object -- ? ) + dup (gl-shader?) [ GL_SHADER_TYPE gl-shader-get-int GL_VERTEX_SHADER = ] [ drop f ] if ; + +: ( source -- fragment-shader ) + GL_FRAGMENT_SHADER ; inline + +: (fragment-shader?) ( object -- ? ) + dup (gl-shader?) [ GL_SHADER_TYPE gl-shader-get-int GL_FRAGMENT_SHADER = ] [ drop f ] if ; + +: gl-shader-info-log-length ( shader -- log-length ) + GL_INFO_LOG_LENGTH gl-shader-get-int ; inline + +: gl-shader-info-log ( shader -- log ) + dup gl-shader-info-log-length dup [ [ 0 swap glGetShaderInfoLog ] keep alien>char-string ] with-malloc ; + +: check-gl-shader ( shader -- shader* ) + dup gl-shader-ok? [ dup gl-shader-info-log throw ] unless ; + +: delete-gl-shader ( shader -- ) glDeleteShader ; inline + +PREDICATE: integer gl-shader (gl-shader?) ; +PREDICATE: gl-shader vertex-shader (vertex-shader?) ; +PREDICATE: gl-shader fragment-shader (fragment-shader?) ; + +! Programs + +: ( shaders -- program ) + glCreateProgram swap + [ dupd glAttachShader ] each + [ glLinkProgram ] keep + gl-error ; + +: (gl-program?) ( object -- ? ) + dup integer? [ glIsProgram c-true? ] [ drop f ] if ; + +: gl-program-get-int ( program enum -- value ) + 0 [ glGetProgramiv ] keep *int ; + +: gl-program-ok? ( program -- ? ) + GL_LINK_STATUS gl-program-get-int c-true? ; + +: gl-program-info-log-length ( program -- log-length ) + GL_INFO_LOG_LENGTH gl-program-get-int ; inline + +: gl-program-info-log ( program -- log ) + dup gl-program-info-log-length + dup [ [ 0 swap glGetProgramInfoLog ] keep + alien>char-string ] with-malloc ; + +: check-gl-program ( program -- program* ) + dup gl-program-ok? [ dup gl-program-info-log throw ] unless ; + +: gl-program-shaders-length ( program -- shaders-length ) + GL_ATTACHED_SHADERS gl-program-get-int ; inline + +: gl-program-shaders ( program -- shaders ) + dup gl-program-shaders-length + [ dup "GLuint" [ 0 swap glGetAttachedShaders ] keep ] keep + c-uint-array> ; + +: delete-gl-program-only ( program -- ) glDeleteProgram ; inline + +: detach-gl-program-shader ( program shader -- ) glDetachShader ; inline + +: delete-gl-program ( program -- ) + dup gl-program-shaders [ 2dup detach-gl-program-shader delete-gl-shader ] each + delete-gl-program-only ; + +: with-gl-program ( program quot -- ) + swap glUseProgram call 0 glUseProgram ; inline + +PREDICATE: integer gl-program (gl-program?) ; From 606b0be95b7d9e3b46ab0430022af48c21efee9b Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sat, 12 Jan 2008 23:00:52 -0800 Subject: [PATCH 002/216] TextMate bundle commands: Eval, Help, Infer, Run, See --- .../Commands/Eval Selection:Line.tmCommand | 27 +++++++++++++ .../Commands/Help for Word.tmCommand | 30 +++++++++++++++ .../Infer Effect of Selection.tmCommand | 27 +++++++++++++ .../Commands/Run File in Listener.tmCommand | 25 ++++++++++++ .../Run Selection:Line in Listener.tmCommand | 27 +++++++++++++ .../Commands/See Word.tmCommand | 30 +++++++++++++++ misc/Factor.tmbundle/Support/lib/tm_factor.rb | 38 +++++++++++++++++++ .../Syntaxes/Factor.tmLanguage | 6 +-- .../Syntaxes/HTML (Factor).tmLanguage | 2 +- misc/Factor.tmbundle/info.plist | 13 ++++++- 10 files changed, 220 insertions(+), 5 deletions(-) create mode 100644 misc/Factor.tmbundle/Commands/Eval Selection:Line.tmCommand create mode 100644 misc/Factor.tmbundle/Commands/Help for Word.tmCommand create mode 100644 misc/Factor.tmbundle/Commands/Infer Effect of Selection.tmCommand create mode 100644 misc/Factor.tmbundle/Commands/Run File in Listener.tmCommand create mode 100644 misc/Factor.tmbundle/Commands/Run Selection:Line in Listener.tmCommand create mode 100644 misc/Factor.tmbundle/Commands/See Word.tmCommand create mode 100644 misc/Factor.tmbundle/Support/lib/tm_factor.rb diff --git a/misc/Factor.tmbundle/Commands/Eval Selection:Line.tmCommand b/misc/Factor.tmbundle/Commands/Eval Selection:Line.tmCommand new file mode 100644 index 0000000000..37867a2737 --- /dev/null +++ b/misc/Factor.tmbundle/Commands/Eval Selection:Line.tmCommand @@ -0,0 +1,27 @@ + + + + + beforeRunningCommand + nop + command + #!/usr/bin/env ruby + +require "#{ENV["TM_BUNDLE_SUPPORT"]}/lib/tm_factor" +puts factor_eval(STDIN.read) + fallbackInput + line + input + selection + keyEquivalent + ^E + name + Eval Selection/Line + output + replaceSelectedText + scope + source.factor + uuid + 8E01DDAF-959B-4237-ADB9-C133A4ACCE90 + + diff --git a/misc/Factor.tmbundle/Commands/Help for Word.tmCommand b/misc/Factor.tmbundle/Commands/Help for Word.tmCommand new file mode 100644 index 0000000000..a3d77d2f0c --- /dev/null +++ b/misc/Factor.tmbundle/Commands/Help for Word.tmCommand @@ -0,0 +1,30 @@ + + + + + beforeRunningCommand + nop + command + #!/usr/bin/env ruby + +require "#{ENV["TM_BUNDLE_SUPPORT"]}/lib/tm_factor" + +doc = STDIN.read +word = line_current_word(ENV["TM_CURRENT_LINE"], ENV["TM_LINE_INDEX"].to_i) +factor_run(%Q(#{doc_using_statements(doc)} \\ #{word} help)) + fallbackInput + word + input + document + keyEquivalent + ^H + name + Help for Word + output + showAsTooltip + scope + source.factor + uuid + BC5BE120-734B-40DF-8B6B-5D3243614B27 + + diff --git a/misc/Factor.tmbundle/Commands/Infer Effect of Selection.tmCommand b/misc/Factor.tmbundle/Commands/Infer Effect of Selection.tmCommand new file mode 100644 index 0000000000..378294e6c1 --- /dev/null +++ b/misc/Factor.tmbundle/Commands/Infer Effect of Selection.tmCommand @@ -0,0 +1,27 @@ + + + + + beforeRunningCommand + nop + command + #!/usr/bin/env ruby + +require "#{ENV["TM_BUNDLE_SUPPORT"]}/lib/tm_factor" + +doc = STDIN.read +puts factor_eval(%Q(#{doc_using_statements(doc)} USE: inference\n [ #{ENV["TM_SELECTED_TEXT"]} ] infer.)) + fallbackInput + word + input + document + name + Infer Effect of Selection + output + showAsTooltip + scope + source.factor + uuid + B619FCC0-2DF2-4657-82A8-0E5676A10254 + + diff --git a/misc/Factor.tmbundle/Commands/Run File in Listener.tmCommand b/misc/Factor.tmbundle/Commands/Run File in Listener.tmCommand new file mode 100644 index 0000000000..bc8c84ec13 --- /dev/null +++ b/misc/Factor.tmbundle/Commands/Run File in Listener.tmCommand @@ -0,0 +1,25 @@ + + + + + beforeRunningCommand + nop + command + #!/usr/bin/env ruby + +require "#{ENV["TM_BUNDLE_SUPPORT"]}/lib/tm_factor" +factor_run(%Q("#{ENV["TM_FILEPATH"]}" run-file)) + input + none + keyEquivalent + @r + name + Run File in Listener + output + discard + scope + source.factor + uuid + CAD3BB10-C480-4C0E-9518-94D61F7A0C0B + + diff --git a/misc/Factor.tmbundle/Commands/Run Selection:Line in Listener.tmCommand b/misc/Factor.tmbundle/Commands/Run Selection:Line in Listener.tmCommand new file mode 100644 index 0000000000..5028bd8db3 --- /dev/null +++ b/misc/Factor.tmbundle/Commands/Run Selection:Line in Listener.tmCommand @@ -0,0 +1,27 @@ + + + + + beforeRunningCommand + nop + command + #!/usr/bin/env ruby + +require "#{ENV["TM_BUNDLE_SUPPORT"]}/lib/tm_factor" +factor_run(STDIN.read) + fallbackInput + line + input + selection + keyEquivalent + ^~e + name + Run Selection/Line in Listener + output + discard + scope + source.factor + uuid + 15A984BD-BC65-43E8-878A-267788C8DA70 + + diff --git a/misc/Factor.tmbundle/Commands/See Word.tmCommand b/misc/Factor.tmbundle/Commands/See Word.tmCommand new file mode 100644 index 0000000000..b9dd2e5e90 --- /dev/null +++ b/misc/Factor.tmbundle/Commands/See Word.tmCommand @@ -0,0 +1,30 @@ + + + + + beforeRunningCommand + nop + command + #!/usr/bin/env ruby + +require "#{ENV["TM_BUNDLE_SUPPORT"]}/lib/tm_factor" + +doc = STDIN.read +word = line_current_word(ENV["TM_CURRENT_LINE"], ENV["TM_LINE_INDEX"].to_i) +puts factor_eval(%Q(#{doc_using_statements(doc)} \\ #{word} see)) + fallbackInput + word + input + document + keyEquivalent + ^h + name + See Word + output + showAsTooltip + scope + source.factor + uuid + 35484754-DBF9-4381-BB25-00CAB64DF4A1 + + diff --git a/misc/Factor.tmbundle/Support/lib/tm_factor.rb b/misc/Factor.tmbundle/Support/lib/tm_factor.rb new file mode 100644 index 0000000000..54272e5e36 --- /dev/null +++ b/misc/Factor.tmbundle/Support/lib/tm_factor.rb @@ -0,0 +1,38 @@ +require 'osx/cocoa' + +def _wait_for_return_value(pb) + origCount = pb.changeCount + sleep 0.125 while pb.changeCount == origCount +end + +def perform_service(service, in_string, wait_for_return_value=false) + p = OSX::NSPasteboard.pasteboardWithUniqueName + p.declareTypes_owner([OSX::NSStringPboardType], nil) + p.setString_forType(in_string, OSX::NSStringPboardType) + raise "Unable to call service #{service}" unless OSX::NSPerformService(service, p) + _wait_for_return_value(p) if wait_for_return_value + p.stringForType(OSX::NSStringPboardType) +end + +def textmate_front() + system %Q{osascript -e 'tell app "TextMate" to activate'}; +end + +def factor_run(code) + perform_service("Factor/Evaluate in Listener", code) +end + +def factor_eval(code) + r = perform_service("Factor/Evaluate Selection", code, true) + textmate_front + r +end + +def doc_using_statements(document) + document.scan(/\b(USING:\s[^;]*\s;|USE:\s+\S+|IN:\s\S+)/).join("\n") << "\n" +end + +def line_current_word(line, point) + left = line.rindex(/\s|^/, point - 1) + 1; right = line.index(/\s|$/, point) - 1 + line[left..right] +end diff --git a/misc/Factor.tmbundle/Syntaxes/Factor.tmLanguage b/misc/Factor.tmbundle/Syntaxes/Factor.tmLanguage index ec4961f312..304af129ce 100644 --- a/misc/Factor.tmbundle/Syntaxes/Factor.tmLanguage +++ b/misc/Factor.tmbundle/Syntaxes/Factor.tmLanguage @@ -1,5 +1,5 @@ - + fileTypes @@ -254,9 +254,9 @@ begin - \(\s + \((?=\s) end - \s\) + (^|(?<=\s))\) name comment.parens.factor diff --git a/misc/Factor.tmbundle/Syntaxes/HTML (Factor).tmLanguage b/misc/Factor.tmbundle/Syntaxes/HTML (Factor).tmLanguage index 89c0f191b9..03394b933c 100644 --- a/misc/Factor.tmbundle/Syntaxes/HTML (Factor).tmLanguage +++ b/misc/Factor.tmbundle/Syntaxes/HTML (Factor).tmLanguage @@ -1,5 +1,5 @@ - + fileTypes diff --git a/misc/Factor.tmbundle/info.plist b/misc/Factor.tmbundle/info.plist index 8def3807d7..1ea756a1a5 100644 --- a/misc/Factor.tmbundle/info.plist +++ b/misc/Factor.tmbundle/info.plist @@ -1,9 +1,20 @@ - + name Factor + ordering + + 3C9C9C2A-314A-475B-A4E4-A68BAAF3F36E + 141517D7-73E0-4475-A481-71102575A175 + CAD3BB10-C480-4C0E-9518-94D61F7A0C0B + 15A984BD-BC65-43E8-878A-267788C8DA70 + 8E01DDAF-959B-4237-ADB9-C133A4ACCE90 + 35484754-DBF9-4381-BB25-00CAB64DF4A1 + BC5BE120-734B-40DF-8B6B-5D3243614B27 + B619FCC0-2DF2-4657-82A8-0E5676A10254 + uuid 8061D2F3-B603-411D-AFFE-61784A07906D From 4044cd293a66877d3c6c41cf7cf61d2aba60fc87 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sun, 13 Jan 2008 00:09:08 -0800 Subject: [PATCH 003/216] TYPEDEF-IF: and USE-IF: words; ptrdiff_t C type moved to alien.c-types and special-cased for win64 --- core/alien/c-types/c-types.factor | 3 +++ core/alien/syntax/syntax-docs.factor | 10 ++++++++-- core/alien/syntax/syntax.factor | 3 +++ core/syntax/syntax-docs.factor | 6 ++++++ core/syntax/syntax.factor | 1 + extra/opengl/gl/gl.factor | 2 -- extra/opengl/gl/unix/unix.factor | 2 +- 7 files changed, 22 insertions(+), 5 deletions(-) diff --git a/core/alien/c-types/c-types.factor b/core/alien/c-types/c-types.factor index b665300bee..6d9c2cec14 100755 --- a/core/alien/c-types/c-types.factor +++ b/core/alien/c-types/c-types.factor @@ -358,4 +358,7 @@ M: long-long-type box-return ( type -- ) "ushort*" define-primitive-type [ string>u16-alien ] "ushort*" c-type set-c-type-prep + + win64? "longlong" "long" ? "ptrdiff_t" typedef + ] with-compilation-unit diff --git a/core/alien/syntax/syntax-docs.factor b/core/alien/syntax/syntax-docs.factor index d87b67eb59..00ee6345dc 100755 --- a/core/alien/syntax/syntax-docs.factor +++ b/core/alien/syntax/syntax-docs.factor @@ -49,8 +49,14 @@ $nl HELP: TYPEDEF: { $syntax "TYPEDEF: old new" } -{ $values { "old" "a C type" } { "new" "a C type" } } -{ $description "Alises the C type " { $snippet "old" } " under the name " { $snippet "new" } "." } +{ $values { "word" "a word with stack effect " { $snippet "( -- ? )" } } { "old" "a C type" } { "new" "a C type" } } +{ $description "Alises the C type " { $snippet "old" } " under the name " { $snippet "new" } " if ." } +{ $notes "This word differs from " { $link typedef } " in that it runs at parse time, to ensure correct ordering of operations when loading source files. Words defined in source files are compiled before top-level forms are run, so if a source file defines C binding words and uses " { $link typedef } ", the type alias won't be available at compile time." } ; + +HELP: TYPEDEF-IF: +{ $syntax "TYPEDEF-IF: word old new" } +{ $values { "word" "a word with stack effect " { $snippet "( -- ? )" } } { "old" "a C type" } { "new" "a C type" } } +{ $description "Alises the C type " { $snippet "old" } " under the name " { $snippet "new" } " if " { $snippet "word" } " evaluates to a true value." } { $notes "This word differs from " { $link typedef } " in that it runs at parse time, to ensure correct ordering of operations when loading source files. Words defined in source files are compiled before top-level forms are run, so if a source file defines C binding words and uses " { $link typedef } ", the type alias won't be available at compile time." } ; HELP: C-STRUCT: diff --git a/core/alien/syntax/syntax.factor b/core/alien/syntax/syntax.factor index bc3bc911ef..b81a91efcb 100755 --- a/core/alien/syntax/syntax.factor +++ b/core/alien/syntax/syntax.factor @@ -46,6 +46,9 @@ PRIVATE> : TYPEDEF: scan scan typedef ; parsing +: TYPEDEF-IF: + scan-word execute scan scan rot [ typedef ] [ 2drop ] if ; parsing + : C-STRUCT: scan in get parse-definition diff --git a/core/syntax/syntax-docs.factor b/core/syntax/syntax-docs.factor index 9cf9647e41..f4efc3b6bb 100755 --- a/core/syntax/syntax-docs.factor +++ b/core/syntax/syntax-docs.factor @@ -363,6 +363,12 @@ HELP: USE: { $description "Adds a new vocabulary at the front of the search path. Subsequent word lookups by the parser will search this vocabulary first." } { $errors "Throws an error if the vocabulary does not exist." } ; +HELP: USE-IF: +{ $syntax "USE-IF: word vocabulary" } +{ $values { "word" "a word with stack effect " { $snippet "( -- ? )" } } { "vocabulary" "a vocabulary name" } } +{ $description "Adds " { $snippet "vocabulary" } " at the front of the search path if " { $snippet "word" } " evaluates to a true value." } +{ $errors "Throws an error if the vocabulary does not exist." } ; + HELP: USING: { $syntax "USING: vocabularies... ;" } { $values { "vocabularies" "a list of vocabulary names" } } diff --git a/core/syntax/syntax.factor b/core/syntax/syntax.factor index b0a7ea19bd..cd97aea9eb 100755 --- a/core/syntax/syntax.factor +++ b/core/syntax/syntax.factor @@ -46,6 +46,7 @@ IN: bootstrap.syntax ] define-syntax "USE:" [ scan use+ ] define-syntax + "USE-IF:" [ scan-word execute scan swap [ use+ ] [ drop ] if ] define-syntax "USING:" [ ";" parse-tokens add-use ] define-syntax diff --git a/extra/opengl/gl/gl.factor b/extra/opengl/gl/gl.factor index c7ce176aca..4a9d9c84d5 100644 --- a/extra/opengl/gl/gl.factor +++ b/extra/opengl/gl/gl.factor @@ -1469,8 +1469,6 @@ GL-FUNCTION: void glWindowPos3sv ( GLshort* p ) ; : GL_SRC2_ALPHA GL_SOURCE2_ALPHA ; inline : GL_SRC2_RGB GL_SOURCE2_RGB ; inline -TYPEDEF: long ptrdiff_t - TYPEDEF: ptrdiff_t GLsizeiptr TYPEDEF: ptrdiff_t GLintptr diff --git a/extra/opengl/gl/unix/unix.factor b/extra/opengl/gl/unix/unix.factor index 08141ad81d..16cd38f92f 100644 --- a/extra/opengl/gl/unix/unix.factor +++ b/extra/opengl/gl/unix/unix.factor @@ -2,4 +2,4 @@ USING: alien.syntax kernel syntax words ; IN: opengl.gl.unix -: GL-FUNCTION: \ FUNCTION: word-def call ; parsing +: GL-FUNCTION: POSTPONE: FUNCTION: ; parsing From 8f69f864382af35dbd410a50f722a04ac76139c7 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sun, 13 Jan 2008 17:35:26 -0800 Subject: [PATCH 004/216] Cel shading demo. Caching implementation of GL-FUNCTION: for windows. --- Makefile | 2 +- core/strings/strings-docs.factor | 0 extra/cel-shading/cel-shading.factor | 152 +++++++++++++++++++++++++ extra/opengl/gl/windows/windows.factor | 26 ++++- extra/windows/opengl32/opengl32.factor | 4 +- 5 files changed, 176 insertions(+), 8 deletions(-) mode change 100644 => 100755 core/strings/strings-docs.factor create mode 100644 extra/cel-shading/cel-shading.factor mode change 100644 => 100755 extra/opengl/gl/windows/windows.factor mode change 100644 => 100755 extra/windows/opengl32/opengl32.factor diff --git a/Makefile b/Makefile index 1042731065..e02b6a672b 100755 --- a/Makefile +++ b/Makefile @@ -140,7 +140,7 @@ factor: $(DLL_OBJS) $(EXE_OBJS) clean: rm -f vm/*.o - rm -f libfactor.a + rm -f factor*.dll libfactor*.* vm/resources.o: windres vm/factor.rs vm/resources.o diff --git a/core/strings/strings-docs.factor b/core/strings/strings-docs.factor old mode 100644 new mode 100755 diff --git a/extra/cel-shading/cel-shading.factor b/extra/cel-shading/cel-shading.factor new file mode 100644 index 0000000000..e21638b75b --- /dev/null +++ b/extra/cel-shading/cel-shading.factor @@ -0,0 +1,152 @@ +USING: arrays bunny io io.files kernel + math math.functions math.vectors + namespaces + opengl opengl.gl + prettyprint + sequences ui ui.gadgets ui.gestures ui.render ; +IN: cel-shading + +: NEAR-PLANE 1.0 64.0 / ; inline +: FAR-PLANE 4.0 ; inline +: FOV 2.0 sqrt 1+ ; inline +: MOUSE-MOTION-SCALE 0.5 ; inline +: MOUSE-DISTANCE-SCALE 1.0 64.0 / ; inline +: KEY-ROTATE-STEP 1.0 ; inline +: KEY-DISTANCE-STEP 1.0 64.0 / ; inline +: DIMS { 640 480 } ; inline + +: FOV-RATIO ( -- fov ) DIMS dup first2 min v/n ; + +SYMBOL: last-drag-loc + +TUPLE: cel-shading-gadget yaw pitch distance model program ; + +: ( -- cel-shading-gadget ) + cel-shading-gadget construct-gadget + 0.0 over set-cel-shading-gadget-yaw + 0.0 over set-cel-shading-gadget-pitch + 0.375 over set-cel-shading-gadget-distance + maybe-download read-model over set-cel-shading-gadget-model ; + +: yaw-cel-shading-gadget ( yaw gadget -- ) + [ [ cel-shading-gadget-yaw + ] keep set-cel-shading-gadget-yaw ] keep relayout-1 ; + +: pitch-cel-shading-gadget ( pitch gadget -- ) + [ [ cel-shading-gadget-pitch + ] keep set-cel-shading-gadget-pitch ] keep relayout-1 ; + +: zoom-cel-shading-gadget ( distance gadget -- ) + [ [ cel-shading-gadget-distance + ] keep set-cel-shading-gadget-distance ] keep relayout-1 ; + +M: cel-shading-gadget pref-dim* ( gadget -- dim ) + drop DIMS ; + +: -+ ( x -- -x x ) + dup neg swap ; + +: cel-shading-frustum ( -- -x x -y y near far ) + FOV-RATIO NEAR-PLANE FOV / v*n + first2 [ -+ ] 2apply NEAR-PLANE FAR-PLANE ; + +: cel-shading-vertex-shader-source + { + "varying vec3 position, normal;" + "" + "void" + "main()" + "{" + "gl_Position = ftransform();" + "" + "position = gl_Vertex.xyz;" + "normal = gl_Normal;" + "}" + } "\n" join ; + +: cel-shading-fragment-shader-source + { + "varying vec3 position, normal;" + "uniform vec3 light_direction;" + "uniform vec4 color;" + "uniform vec4 ambient, diffuse;" + "" + "float" + "smooth_modulate(vec3 direction, vec3 normal)" + "{" + "return clamp(dot(direction, normal), 0.0, 1.0);" + "}" + "" + "float" + "modulate(vec3 direction, vec3 normal)" + "{" + "float m = smooth_modulate(direction, normal);" + "return smoothstep(0.0, 0.01, m) * 0.4 + smoothstep(0.49, 0.5, m) * 0.5;" + "}" + "" + "void" + "main()" + "{" + "vec3 direction = normalize(light_direction - position);" + "gl_FragColor = ambient + diffuse * color * vec4(vec3(modulate(direction, normal)), 1); " + "}" + } "\n" join ; + +: cel-shading-program ( -- program ) + cel-shading-vertex-shader-source check-gl-shader + cel-shading-fragment-shader-source check-gl-shader + 2array check-gl-program ; + +M: cel-shading-gadget graft* ( gadget -- ) + 0.0 0.0 0.0 1.0 glClearColor + GL_CULL_FACE glEnable + GL_DEPTH_TEST glEnable + cel-shading-program swap set-cel-shading-gadget-program ; + +M: cel-shading-gadget ungraft* ( gadget -- ) + cel-shading-gadget-program delete-gl-program ; + +: cel-shading-draw-setup ( gadget -- gadget ) + GL_PROJECTION glMatrixMode + glLoadIdentity + cel-shading-frustum glFrustum + GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT bitor glClear + GL_MODELVIEW glMatrixMode + glLoadIdentity + [ >r 0.0 0.0 r> cel-shading-gadget-distance neg glTranslatef ] keep + [ cel-shading-gadget-pitch 1.0 0.0 0.0 glRotatef ] keep + [ cel-shading-gadget-yaw 0.0 1.0 0.0 glRotatef ] keep + [ cel-shading-gadget-program [ "light_direction" glGetUniformLocation -25.0 45.0 80.0 glUniform3f ] keep + [ "color" glGetUniformLocation 0.6 0.5 0.5 1.0 glUniform4f ] keep + [ "ambient" glGetUniformLocation 0.2 0.2 0.2 0.2 glUniform4f ] keep + "diffuse" glGetUniformLocation 0.8 0.8 0.8 0.8 glUniform4f ] keep ; + +M: cel-shading-gadget draw-gadget* ( gadget -- ) + dup cel-shading-gadget-program [ + cel-shading-draw-setup + 0.0 -0.12 0.0 glTranslatef + cel-shading-gadget-model first3 draw-bunny + ] with-gl-program ; + +: reset-last-drag-rel ( -- ) + { 0 0 } last-drag-loc set ; +: last-drag-rel ( -- rel ) + drag-loc [ last-drag-loc get v- ] keep last-drag-loc set ; + +: drag-yaw-pitch ( -- yaw pitch ) + last-drag-rel MOUSE-MOTION-SCALE v*n first2 ; + +cel-shading-gadget H{ + { T{ key-down f f "LEFT" } [ KEY-ROTATE-STEP neg swap yaw-cel-shading-gadget ] } + { T{ key-down f f "RIGHT" } [ KEY-ROTATE-STEP swap yaw-cel-shading-gadget ] } + { T{ key-down f f "DOWN" } [ KEY-ROTATE-STEP neg swap pitch-cel-shading-gadget ] } + { T{ key-down f f "UP" } [ KEY-ROTATE-STEP swap pitch-cel-shading-gadget ] } + { T{ key-down f f "=" } [ KEY-DISTANCE-STEP neg swap zoom-cel-shading-gadget ] } + { T{ key-down f f "-" } [ KEY-DISTANCE-STEP swap zoom-cel-shading-gadget ] } + + { T{ button-down f f 1 } [ drop reset-last-drag-rel ] } + { T{ drag f 1 } [ drag-yaw-pitch rot [ pitch-cel-shading-gadget ] keep yaw-cel-shading-gadget ] } + { T{ mouse-scroll } [ scroll-direction get second MOUSE-DISTANCE-SCALE * swap zoom-cel-shading-gadget ] } +} set-gestures + +: cel-shading-window ( -- ) + [ "Cel Shading" open-window ] with-ui ; + +MAIN: cel-shading-window diff --git a/extra/opengl/gl/windows/windows.factor b/extra/opengl/gl/windows/windows.factor old mode 100644 new mode 100755 index 96fb91793d..186f17206c --- a/extra/opengl/gl/windows/windows.factor +++ b/extra/opengl/gl/windows/windows.factor @@ -1,18 +1,34 @@ -USING: alien alien.syntax kernel libc namespaces parser - sequences syntax system vectors ; +USING: alien alien.syntax arrays assocs hashtables init kernel + libc math namespaces parser sequences syntax system vectors + windows.opengl32 ; IN: opengl.gl.windows + gl-function-pointers set ] "opengl.gl.windows init hook" add-init-hook + +: gl-function-number ( -- n ) + gl-function-number-counter get + dup 1+ gl-function-number-counter set ; + +: gl-function-pointer ( name n -- funptr ) + wglGetCurrentContext 2array dup gl-function-pointers get at + [ -rot 2drop ] + [ >r wglGetProcAddress dup r> gl-function-pointers get set-at ] + if* ; + +PRIVATE> : GL-FUNCTION: "stdcall" scan scan - dup [ wglGetProcAddress check-ptr ] curry swap + dup gl-function-number [ gl-function-pointer ] 2curry swap ";" parse-tokens [ "()" subseq? not ] subset define-indirect ; parsing diff --git a/extra/windows/opengl32/opengl32.factor b/extra/windows/opengl32/opengl32.factor old mode 100644 new mode 100755 index 2d58d34083..a8d8ad8153 --- a/extra/windows/opengl32/opengl32.factor +++ b/extra/windows/opengl32/opengl32.factor @@ -1,8 +1,7 @@ ! Copyright (C) 2005, 2006 Doug Coleman. ! See http://factorcode.org/license.txt for BSD license. USING: alien alien.c-types alien.syntax parser namespaces kernel -math windows.types windows.types init assocs sequences opengl.gl -libc ; +math windows.types windows.types init assocs sequences libc ; IN: windows.opengl32 ! PIXELFORMATDESCRIPTOR flags @@ -100,4 +99,5 @@ LIBRARY: gl FUNCTION: HGLRC wglCreateContext ( HDC hDC ) ; FUNCTION: BOOL wglDeleteContext ( HGLRC hRC ) ; FUNCTION: BOOL wglMakeCurrent ( HDC hDC, HGLRC hglrc ) ; +FUNCTION: HGLRC wglGetCurrentContext ( ) ; FUNCTION: void* wglGetProcAddress ( char* name ) ; From b42d144336e1e98daf93d1e94a5cb38b5e829f02 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sun, 13 Jan 2008 18:15:37 -0800 Subject: [PATCH 005/216] Documentation for the cel shading demo --- extra/cel-shading/authors.txt | 1 + extra/cel-shading/summary.txt | 1 + extra/cel-shading/tags.txt | 3 +++ 3 files changed, 5 insertions(+) create mode 100644 extra/cel-shading/authors.txt create mode 100644 extra/cel-shading/summary.txt create mode 100644 extra/cel-shading/tags.txt diff --git a/extra/cel-shading/authors.txt b/extra/cel-shading/authors.txt new file mode 100644 index 0000000000..6a0dc7293a --- /dev/null +++ b/extra/cel-shading/authors.txt @@ -0,0 +1 @@ +Joe Groff \ No newline at end of file diff --git a/extra/cel-shading/summary.txt b/extra/cel-shading/summary.txt new file mode 100644 index 0000000000..60da092f6d --- /dev/null +++ b/extra/cel-shading/summary.txt @@ -0,0 +1 @@ +Stanford Bunny rendered with a cel-shading GLSL program \ No newline at end of file diff --git a/extra/cel-shading/tags.txt b/extra/cel-shading/tags.txt new file mode 100644 index 0000000000..0db7e8e629 --- /dev/null +++ b/extra/cel-shading/tags.txt @@ -0,0 +1,3 @@ +demos +opengl +glsl \ No newline at end of file From d73d8820c13c2305dce0d1c8f190e683cdb6ef75 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sun, 13 Jan 2008 18:17:28 -0800 Subject: [PATCH 006/216] Ensure that the right vocabs are available for textmate See and Help commands --- misc/Factor.tmbundle/Commands/Help for Word.tmCommand | 2 +- misc/Factor.tmbundle/Commands/See Word.tmCommand | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/misc/Factor.tmbundle/Commands/Help for Word.tmCommand b/misc/Factor.tmbundle/Commands/Help for Word.tmCommand index a3d77d2f0c..350c01d344 100644 --- a/misc/Factor.tmbundle/Commands/Help for Word.tmCommand +++ b/misc/Factor.tmbundle/Commands/Help for Word.tmCommand @@ -11,7 +11,7 @@ require "#{ENV["TM_BUNDLE_SUPPORT"]}/lib/tm_factor" doc = STDIN.read word = line_current_word(ENV["TM_CURRENT_LINE"], ENV["TM_LINE_INDEX"].to_i) -factor_run(%Q(#{doc_using_statements(doc)} \\ #{word} help)) +factor_run(%Q(#{doc_using_statements(doc)} USE: help\n \\ #{word} help)) fallbackInput word input diff --git a/misc/Factor.tmbundle/Commands/See Word.tmCommand b/misc/Factor.tmbundle/Commands/See Word.tmCommand index b9dd2e5e90..4502e235be 100644 --- a/misc/Factor.tmbundle/Commands/See Word.tmCommand +++ b/misc/Factor.tmbundle/Commands/See Word.tmCommand @@ -11,7 +11,7 @@ require "#{ENV["TM_BUNDLE_SUPPORT"]}/lib/tm_factor" doc = STDIN.read word = line_current_word(ENV["TM_CURRENT_LINE"], ENV["TM_LINE_INDEX"].to_i) -puts factor_eval(%Q(#{doc_using_statements(doc)} \\ #{word} see)) +puts factor_eval(%Q(#{doc_using_statements(doc)} USE: prettyprint\n \\ #{word} see)) fallbackInput word input From dc2109e6cbce003b9671b43c465c81fad2d6297f Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sun, 13 Jan 2008 18:46:51 -0800 Subject: [PATCH 007/216] Ensure that the parser vocab is in use for textmate Run command --- misc/Factor.tmbundle/Commands/Run File in Listener.tmCommand | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/Factor.tmbundle/Commands/Run File in Listener.tmCommand b/misc/Factor.tmbundle/Commands/Run File in Listener.tmCommand index bc8c84ec13..f28e062541 100644 --- a/misc/Factor.tmbundle/Commands/Run File in Listener.tmCommand +++ b/misc/Factor.tmbundle/Commands/Run File in Listener.tmCommand @@ -8,7 +8,7 @@ #!/usr/bin/env ruby require "#{ENV["TM_BUNDLE_SUPPORT"]}/lib/tm_factor" -factor_run(%Q("#{ENV["TM_FILEPATH"]}" run-file)) +factor_run(%Q(USE: parser\n "#{ENV["TM_FILEPATH"]}" run-file)) input none keyEquivalent From 53effc35a68bf304f71f05706bb6484c3c65ced4 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sun, 13 Jan 2008 19:06:16 -0800 Subject: [PATCH 008/216] Get multiline working again and use it in cel-shading --- extra/cel-shading/cel-shading.factor | 82 +++++++++++++-------------- extra/multiline/multiline-docs.factor | 3 +- extra/multiline/multiline.factor | 2 +- 3 files changed, 44 insertions(+), 43 deletions(-) diff --git a/extra/cel-shading/cel-shading.factor b/extra/cel-shading/cel-shading.factor index e21638b75b..20b392195a 100644 --- a/extra/cel-shading/cel-shading.factor +++ b/extra/cel-shading/cel-shading.factor @@ -1,5 +1,5 @@ USING: arrays bunny io io.files kernel - math math.functions math.vectors + math math.functions math.vectors multiline namespaces opengl opengl.gl prettyprint @@ -47,47 +47,47 @@ M: cel-shading-gadget pref-dim* ( gadget -- dim ) FOV-RATIO NEAR-PLANE FOV / v*n first2 [ -+ ] 2apply NEAR-PLANE FAR-PLANE ; -: cel-shading-vertex-shader-source - { - "varying vec3 position, normal;" - "" - "void" - "main()" - "{" - "gl_Position = ftransform();" - "" - "position = gl_Vertex.xyz;" - "normal = gl_Normal;" - "}" - } "\n" join ; +STRING: cel-shading-vertex-shader-source +varying vec3 position, normal; -: cel-shading-fragment-shader-source - { - "varying vec3 position, normal;" - "uniform vec3 light_direction;" - "uniform vec4 color;" - "uniform vec4 ambient, diffuse;" - "" - "float" - "smooth_modulate(vec3 direction, vec3 normal)" - "{" - "return clamp(dot(direction, normal), 0.0, 1.0);" - "}" - "" - "float" - "modulate(vec3 direction, vec3 normal)" - "{" - "float m = smooth_modulate(direction, normal);" - "return smoothstep(0.0, 0.01, m) * 0.4 + smoothstep(0.49, 0.5, m) * 0.5;" - "}" - "" - "void" - "main()" - "{" - "vec3 direction = normalize(light_direction - position);" - "gl_FragColor = ambient + diffuse * color * vec4(vec3(modulate(direction, normal)), 1); " - "}" - } "\n" join ; +void +main() +{ + gl_Position = ftransform(); + + position = gl_Vertex.xyz; + normal = gl_Normal; +} + +; + +STRING: cel-shading-fragment-shader-source +varying vec3 position, normal; +uniform vec3 light_direction; +uniform vec4 color; +uniform vec4 ambient, diffuse; + +float +smooth_modulate(vec3 direction, vec3 normal) +{ + return clamp(dot(direction, normal), 0.0, 1.0); +} + +float +modulate(vec3 direction, vec3 normal) +{ + float m = smooth_modulate(direction, normal); + return smoothstep(0.0, 0.01, m) * 0.4 + smoothstep(0.49, 0.5, m) * 0.5; +} + +void +main() +{ + vec3 direction = normalize(light_direction - position); + gl_FragColor = ambient + diffuse * color * vec4(vec3(modulate(direction, normal)), 1); +} + +; : cel-shading-program ( -- program ) cel-shading-vertex-shader-source check-gl-shader diff --git a/extra/multiline/multiline-docs.factor b/extra/multiline/multiline-docs.factor index 7e7375cfad..0c0eb5e9dd 100644 --- a/extra/multiline/multiline-docs.factor +++ b/extra/multiline/multiline-docs.factor @@ -1,4 +1,5 @@ -USING: help.markup help.syntax multiline ; +USING: help.markup help.syntax ; +IN: multiline HELP: STRING: { $syntax "STRING: name\nfoo\n;" } diff --git a/extra/multiline/multiline.factor b/extra/multiline/multiline.factor index 89a6e06053..e8063fc759 100644 --- a/extra/multiline/multiline.factor +++ b/extra/multiline/multiline.factor @@ -16,7 +16,7 @@ IN: multiline : STRING: CREATE dup reset-generic - parse-here 1quotation define-compound ; parsing + [ parse-here 1quotation define ] keep make-inline ; parsing : (parse-multiline-string) ( start-index end-text -- end-index ) lexer get line-text 2dup start From 18451c4675422f7744a88e9ff8daace0564f7a8e Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sun, 13 Jan 2008 19:09:01 -0800 Subject: [PATCH 009/216] TextMate syntax highlighting for multiline strings --- .../Syntaxes/Factor.tmLanguage | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/misc/Factor.tmbundle/Syntaxes/Factor.tmLanguage b/misc/Factor.tmbundle/Syntaxes/Factor.tmLanguage index 304af129ce..8df0179fd1 100644 --- a/misc/Factor.tmbundle/Syntaxes/Factor.tmLanguage +++ b/misc/Factor.tmbundle/Syntaxes/Factor.tmLanguage @@ -240,6 +240,44 @@ + + begin + <" + end + "> + name + string.quoted.double.multiline.factor + patterns + + + include + #escaped_characters + + + + + begin + (^|(?<=\s))(STRING:)\s+(\S+) + captures + + 2 + + name + keyword.colon.factor + + 3 + + name + entity.name.heredoc.factor + + + contentName + string.unquoted.heredoc.factor + end + ^;$ + name + definition.word.heredoc.factor + match inline|foldable From ce92275c8e50ea4347a17749b196e15ea9f9dd2a Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sun, 13 Jan 2008 22:58:11 -0800 Subject: [PATCH 010/216] Documentation for the GLSL-related utility words in opengl --- extra/opengl/opengl-docs.factor | 96 ++++++++++++++++++++++++++++++++- 1 file changed, 95 insertions(+), 1 deletion(-) diff --git a/extra/opengl/opengl-docs.factor b/extra/opengl/opengl-docs.factor index f9a491aba6..58b86f09b3 100644 --- a/extra/opengl/opengl-docs.factor +++ b/extra/opengl/opengl-docs.factor @@ -92,6 +92,96 @@ HELP: with-translation { $values { "loc" "a pair of integers" } { "quot" quotation } } { $description "Calls the quotation with a translation by " { $snippet "loc" } " pixels applied to the current " { $link GL_MODELVIEW } " matrix, restoring the matrix when the quotation is done." } ; +HELP: gl-shader +{ $class-description { $snippet "gl-shader" } " is a predicate class comprising values returned by OpenGL to represent shader objects. The following words are provided for creating and manipulating these objects:" + { $list + { { $link } " - Compile GLSL code into a shader object" } + { { $link gl-shader-ok? } " - Check whether a shader object compiled successfully" } + { { $link check-gl-shader } " - Throw an error unless a shader object compiled successfully" } + { { $link gl-shader-info-log } " - Retrieve the info log of messages generated by the GLSL compiler" } + { { $link delete-gl-shader } " - Invalidate a shader object" } + } + "The derived predicate classes " { $link vertex-shader } " and " { $link fragment-shader } " are also defined for the two standard kinds of shader defined by the OpenGL specification." } ; + +HELP: vertex-shader +{ $class-description { $snippet "vertex-shader" } " is the predicate class of " { $link gl-shader } " objects that refer to shaders of type " { $snippet "GL_VERTEX_SHADER" } ". In addition to the " { $snippet "gl-shader" } " words, the following vertex shader-specific functions are defined:" + { $list + { { $link } " - Compile GLSL code into a vertex shader object "} + } +} ; + +HELP: fragment-shader +{ $class-description { $snippet "fragment-shader" } " is the predicate class of " { $link gl-shader } " objects that refer to shaders of type " { $snippet "GL_FRAGMENT_SHADER" } ". In addition to the " { $snippet "gl-shader" } " words, the following fragment shader-specific functions are defined:" + { $list + { { $link } " - Compile GLSL code into a fragment shader object "} + } +} ; + +HELP: +{ $values { "source" "The GLSL source code to compile" } { "kind" "The kind of shader to compile, such as " { $snippet "GL_VERTEX_SHADER" } " or " { $snippet "GL_FRAGMENT_SHADER" } } } +{ $description "Tries to compile the given GLSL source into a shader object. The returned object can be checked for validity by " { $link check-gl-shader } " or " { $link gl-shader-ok? } ". Errors and warnings generated by the GLSL compiler will be collected in the info log, available from " { $link gl-shader-info-log } ".\n\nWhen the shader object is no longer needed, it should be deleted using " { $link delete-gl-shader } " or else be attached to a " { $link gl-program } " object deleted using " { $link delete-gl-program } "." } ; + +HELP: +{ $values { "source" "The GLSL source code to compile" } } +{ $description "Tries to compile the given GLSL source into a vertex shader object. Equivalent to " { $snippet "GL_VERTEX_SHADER " } "." } ; + +HELP: +{ $values { "source" "The GLSL source code to compile" } } +{ $description "Tries to compile the given GLSL source into a fragment shader object. Equivalent to " { $snippet "GL_FRAGMENT_SHADER " } "." } ; + +HELP: gl-shader-ok? +{ $values { "shader" "A " { $link gl-shader } " object" } } +{ $description "Returns a boolean value indicating whether the given shader object compiled successfully. Compilation errors and warnings are available in the shader's info log, which can be gotten using " { $link gl-shader-info-log } "." } ; + +HELP: check-gl-shader +{ $values { "shader" "A " { $link gl-shader } " object" } } +{ $description "Throws an error containing the " { $link gl-shader-info-log } " for the shader object if it failed to compile. Otherwise, the shader object is left on the stack." } ; + +HELP: delete-gl-shader +{ $values { "shader" "A " { $link gl-shader } " object" } } +{ $description "Deletes the shader object, invalidating it and releasing any resources allocated for it by the OpenGL implementation." } ; + +HELP: gl-shader-info-log +{ $values { "shader" "A " { $link gl-shader } " object" } } +{ $description "Retrieves the info log for " { $snippet "shader" } ", including any errors or warnings generated in compiling the shader object." } ; + +HELP: gl-program +{ $class-description { $snippet "gl-program" } " is a predicate class comprising values returned by OpenGL to represent proram objects. The following words are provided for creating and manipulating these objects:" + { $list + { { $link } " - Link a set of shaders into a GLSL program" } + { { $link gl-program-ok? } " - Check whether a program object linked successfully" } + { { $link check-gl-program } " - Throw an error unless a program object linked successfully" } + { { $link gl-program-info-log } " - Retrieve the info log of messages generated by the GLSL linker" } + { { $link gl-program-shaders } " - Retrieve the set of shader objects composing the GLSL linker" } + { { $link delete-gl-program } " - Invalidate a program object and all its attached shaders" } + { { $link with-gl-program } " - Use a program object" } + } +} ; + +HELP: +{ $values { "shaders" "A sequence of " { $link gl-shader } " objects." } } +{ $description "Creates a new GLSL program object, attaches all the shader objects in the " { $snippet "shaders" } " sequence, and attempts to link them. The returned object can be checked for validity by " { $link check-gl-program } " or " { $link gl-program-ok? } ". Errors and warnings generated by the GLSL linker will be collected in the info log, available from " { $link gl-program-info-log } ".\n\nWhen the program object and its attached shaders are no longer needed, it should be deleted using " { $link delete-gl-program } "." } ; + +HELP: gl-program-ok? +{ $values { "program" "A " { $link gl-program } " object" } } +{ $description "Returns a boolean value indicating whether the given program object linked successfully. Link errors and warnings are available in the program's info log, which can be gotten using " { $link gl-program-info-log } "." } ; + +HELP: check-gl-program +{ $values { "program" "A " { $link gl-program } " object" } } +{ $description "Throws an error containing the " { $link gl-program-info-log } " for the program object if it failed to link. Otherwise, the program object is left on the stack." } ; + +HELP: gl-program-info-log +{ $values { "program" "A " { $link gl-program } " object" } } +{ $description "Retrieves the info log for " { $snippet "program" } ", including any errors or warnings generated in linking the program object." } ; + +HELP: delete-gl-program +{ $values { "program" "A " { $link gl-program } " object" } } +{ $description "Deletes the program object, invalidating it and releasing any resources allocated for it by the OpenGL implementation. Any attached " { $link gl-shader } "s are also deleted.\n\nIf the shader objects should be preserved, they should each be detached using " { $link detach-gl-program-shader } ". The program object can then be destroyed alone using " { $link delete-gl-program-only } "." } ; + +HELP: with-gl-program +{ $values { "program" "A " { $link gl-program } " object" } { "quot" "A quotation" } } +{ $description "Enables " { $snippet "program" } " for all OpenGL calls made in " { $snippet "quot" } ". The fixed-function pipeline is restored at the end of " { $snippet "quot" } "." } ; + ARTICLE: "gl-utilities" "OpenGL utility words" "In addition to the full OpenGL API, the " { $vocab-link "opengl" } " vocabulary includes some utility words to give OpenGL a more Factor-like feel." $nl @@ -112,6 +202,10 @@ $nl { $subsection gl-rect } { $subsection gl-fill-poly } { $subsection gl-poly } -{ $subsection gl-gradient } ; +{ $subsection gl-gradient } +"Compiling, linking, and using GLSL programs:" +{ $subsection gl-shader } +{ $subsection gl-program } +; ABOUT: "gl-utilities" From b10ab726a372b9f147f933e9161d235d2c83b1d2 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Tue, 15 Jan 2008 18:16:38 -0800 Subject: [PATCH 011/216] Fix typo in TYPEDEF: documentation --- core/alien/syntax/syntax-docs.factor | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/core/alien/syntax/syntax-docs.factor b/core/alien/syntax/syntax-docs.factor index 00ee6345dc..858c3f145e 100755 --- a/core/alien/syntax/syntax-docs.factor +++ b/core/alien/syntax/syntax-docs.factor @@ -49,14 +49,14 @@ $nl HELP: TYPEDEF: { $syntax "TYPEDEF: old new" } -{ $values { "word" "a word with stack effect " { $snippet "( -- ? )" } } { "old" "a C type" } { "new" "a C type" } } -{ $description "Alises the C type " { $snippet "old" } " under the name " { $snippet "new" } " if ." } +{ $values { "old" "a C type" } { "new" "a C type" } } +{ $description "Aliases the C type " { $snippet "old" } " under the name " { $snippet "new" } " if ." } { $notes "This word differs from " { $link typedef } " in that it runs at parse time, to ensure correct ordering of operations when loading source files. Words defined in source files are compiled before top-level forms are run, so if a source file defines C binding words and uses " { $link typedef } ", the type alias won't be available at compile time." } ; HELP: TYPEDEF-IF: { $syntax "TYPEDEF-IF: word old new" } { $values { "word" "a word with stack effect " { $snippet "( -- ? )" } } { "old" "a C type" } { "new" "a C type" } } -{ $description "Alises the C type " { $snippet "old" } " under the name " { $snippet "new" } " if " { $snippet "word" } " evaluates to a true value." } +{ $description "Aliases the C type " { $snippet "old" } " under the name " { $snippet "new" } " if " { $snippet "word" } " evaluates to a true value." } { $notes "This word differs from " { $link typedef } " in that it runs at parse time, to ensure correct ordering of operations when loading source files. Words defined in source files are compiled before top-level forms are run, so if a source file defines C binding words and uses " { $link typedef } ", the type alias won't be available at compile time." } ; HELP: C-STRUCT: @@ -87,7 +87,9 @@ HELP: typedef { $description "Alises the C type " { $snippet "old" } " under the name " { $snippet "new" } "." } { $notes "Using this word in the same source file which defines C bindings can cause problems, because words are compiled before top-level forms are run. Use the " { $link POSTPONE: TYPEDEF: } " word instead." } ; -{ typedef POSTPONE: TYPEDEF: } related-words +{ typedef POSTPONE: TYPEDEF: POSTPONE: TYPEDEF-IF: } related-words +{ POSTPONE: TYPEDEF: typedef POSTPONE: TYPEDEF-IF: } related-words +{ POSTPONE: TYPEDEF-IF: POSTPONE: TYPEDEF: typedef } related-words HELP: c-struct? { $values { "type" "a string" } { "?" "a boolean" } } From 9c78c7c05f61958c460f79254609d27f24d65cbd Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Thu, 17 Jan 2008 12:25:43 -0500 Subject: [PATCH 012/216] Solution to Project Euler problem 27 --- extra/project-euler/004/004.factor | 5 +- extra/project-euler/027/027.factor | 67 ++++++++++++++++++++++++ extra/project-euler/common/common.factor | 8 ++- extra/project-euler/project-euler.factor | 4 +- 4 files changed, 76 insertions(+), 8 deletions(-) create mode 100644 extra/project-euler/027/027.factor diff --git a/extra/project-euler/004/004.factor b/extra/project-euler/004/004.factor index 0db0c6f2cb..d7984a4991 100644 --- a/extra/project-euler/004/004.factor +++ b/extra/project-euler/004/004.factor @@ -1,6 +1,6 @@ ! Copyright (c) 2007 Aaron Schaefer, Daniel Ehrenberg. ! See http://factorcode.org/license.txt for BSD license. -USING: arrays combinators.lib hashtables kernel math math.parser math.ranges +USING: hashtables kernel math math.parser math.ranges project-euler.common sequences sorting ; IN: project-euler.004 @@ -21,9 +21,6 @@ IN: project-euler.004 : palindrome? ( n -- ? ) number>string dup reverse = ; -: cartesian-product ( seq1 seq2 -- seq1xseq2 ) - swap [ swap [ 2array ] map-with ] map-with concat ; - + +: euler027 ( -- answer ) + source-027 max-consecutive drop product ; + +! [ euler027 ] 100 ave-time +! 1306 ms run / 58 ms GC ave time - 100 trials + +! TODO: generalize max-consecutive/max-product (from #26) into a new word + +MAIN: euler027 diff --git a/extra/project-euler/common/common.factor b/extra/project-euler/common/common.factor index 2bd2b7ec0b..d21a780773 100644 --- a/extra/project-euler/common/common.factor +++ b/extra/project-euler/common/common.factor @@ -1,5 +1,5 @@ -USING: kernel math math.functions math.miller-rabin math.parser - math.primes.factors math.ranges namespaces sequences ; +USING: arrays combinators.lib kernel math math.functions math.miller-rabin + math.parser math.primes.factors math.ranges namespaces sequences ; IN: project-euler.common ! A collection of words used by more than one Project Euler solution @@ -7,6 +7,7 @@ IN: project-euler.common ! Problems using each public word ! ------------------------------- +! cartesian-product - #4, #27 ! collect-consecutive - #8, #11 ! log10 - #25, #134 ! max-path - #18, #67 @@ -45,6 +46,9 @@ IN: project-euler.common PRIVATE> +: cartesian-product ( seq1 seq2 -- seq1xseq2 ) + swap [ swap [ 2array ] map-with ] map-with concat ; + : collect-consecutive ( seq width -- seq ) [ 2dup count-shifts [ 2dup head shift-3rd , ] times diff --git a/extra/project-euler/project-euler.factor b/extra/project-euler/project-euler.factor index 6abb056d28..8ff3b9da88 100644 --- a/extra/project-euler/project-euler.factor +++ b/extra/project-euler/project-euler.factor @@ -8,8 +8,8 @@ USING: definitions io io.files kernel math.parser sequences vocabs project-euler.013 project-euler.014 project-euler.015 project-euler.016 project-euler.017 project-euler.018 project-euler.019 project-euler.020 project-euler.021 project-euler.022 project-euler.023 project-euler.024 - project-euler.025 project-euler.026 project-euler.067 project-euler.134 - project-euler.169 project-euler.173 project-euler.175 ; + project-euler.025 project-euler.026 project-euler.027 project-euler.067 + project-euler.134 project-euler.169 project-euler.173 project-euler.175 ; IN: project-euler Date: Thu, 17 Jan 2008 12:55:02 -0500 Subject: [PATCH 013/216] Optimize solution to Project Euler problem 27 --- extra/project-euler/027/027.factor | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/extra/project-euler/027/027.factor b/extra/project-euler/027/027.factor index abfe4d5704..3ce684549a 100644 --- a/extra/project-euler/027/027.factor +++ b/extra/project-euler/027/027.factor @@ -36,10 +36,15 @@ IN: project-euler.027 ! SOLUTION ! -------- +! b must be prime since n = 0 must return a prime +! a + b + 1 must be prime since n = 1 must return a prime +! a < b + source-027 max-consecutive drop product ; ! [ euler027 ] 100 ave-time -! 1306 ms run / 58 ms GC ave time - 100 trials +! 687 ms run / 23 ms GC ave time - 100 trials ! TODO: generalize max-consecutive/max-product (from #26) into a new word From 43ee25cdf701e70b3734afc35143fc5acc2e31b3 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Thu, 17 Jan 2008 12:53:29 -1000 Subject: [PATCH 014/216] fix load errors --- extra/shufflers/shufflers-docs.factor | 3 ++- extra/shufflers/shufflers.factor | 2 +- extra/state-machine/state-machine.factor | 4 ++-- extra/tools/deploy/shaker/shaker.factor | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/extra/shufflers/shufflers-docs.factor b/extra/shufflers/shufflers-docs.factor index efeb4dc8a4..ac372534ae 100644 --- a/extra/shufflers/shufflers-docs.factor +++ b/extra/shufflers/shufflers-docs.factor @@ -1,4 +1,5 @@ -USING: shufflers help.syntax help.markup ; +USING: help.syntax help.markup ; +IN: shufflers HELP: SHUFFLE: { $syntax "SHUFFLE: alphabet #" } diff --git a/extra/shufflers/shufflers.factor b/extra/shufflers/shufflers.factor index 01b5133a80..172db1def1 100644 --- a/extra/shufflers/shufflers.factor +++ b/extra/shufflers/shufflers.factor @@ -29,7 +29,7 @@ IN: shufflers : define-shuffles ( names max-out -- ) in-shuffle over length make-shuffles [ [ shuffle>string create-in ] keep - shuffle>quot dupd define-compound put-effect + shuffle>quot dupd define put-effect ] with each out-shuffle ; : SHUFFLE: diff --git a/extra/state-machine/state-machine.factor b/extra/state-machine/state-machine.factor index 85f4812d9a..ac0bdc81c7 100644 --- a/extra/state-machine/state-machine.factor +++ b/extra/state-machine/state-machine.factor @@ -7,7 +7,7 @@ IN: state-machine ";" parse-tokens [ length ] keep unclip add - [ create-in swap 1quotation define-compound ] 2each ; parsing + [ create-in swap 1quotation define ] 2each ; parsing TUPLE: state place data ; @@ -27,7 +27,7 @@ M: missing-state error. : define-machine ( word state-class -- ) execute make-machine - >r over r> define-compound + >r over r> define "state-table" set-word-prop ; : MACHINE: diff --git a/extra/tools/deploy/shaker/shaker.factor b/extra/tools/deploy/shaker/shaker.factor index d157571757..fcdb6ba76e 100755 --- a/extra/tools/deploy/shaker/shaker.factor +++ b/extra/tools/deploy/shaker/shaker.factor @@ -5,7 +5,7 @@ assocs kernel vocabs words sequences memory io system arrays continuations math definitions mirrors splitting parser classes inspector layouts vocabs.loader prettyprint.config prettyprint debugger io.streams.c io.streams.duplex io.files io.backend -quotations words.private tools.deploy.config ; +quotations words.private tools.deploy.config compliler.units ; IN: tools.deploy.shaker : show ( msg -- ) From b03548caad3eb1a28a59956803c2ec803c0850d5 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Thu, 17 Jan 2008 13:00:50 -1000 Subject: [PATCH 015/216] fix typo --- extra/tools/deploy/shaker/shaker.factor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extra/tools/deploy/shaker/shaker.factor b/extra/tools/deploy/shaker/shaker.factor index fcdb6ba76e..4ab12bf352 100755 --- a/extra/tools/deploy/shaker/shaker.factor +++ b/extra/tools/deploy/shaker/shaker.factor @@ -5,7 +5,7 @@ assocs kernel vocabs words sequences memory io system arrays continuations math definitions mirrors splitting parser classes inspector layouts vocabs.loader prettyprint.config prettyprint debugger io.streams.c io.streams.duplex io.files io.backend -quotations words.private tools.deploy.config compliler.units ; +quotations words.private tools.deploy.config compiler.units ; IN: tools.deploy.shaker : show ( msg -- ) From 4cba26462df7ebeda53926dc31b8ef07af056a51 Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Thu, 17 Jan 2008 23:37:10 -0500 Subject: [PATCH 016/216] Solution to Project Euler problem 28 --- extra/project-euler/027/027.factor | 5 +- extra/project-euler/028/028.factor | 61 ++++++++++++++++++++++++ extra/project-euler/project-euler.factor | 5 +- 3 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 extra/project-euler/028/028.factor diff --git a/extra/project-euler/027/027.factor b/extra/project-euler/027/027.factor index 3ce684549a..c208caaf9e 100644 --- a/extra/project-euler/027/027.factor +++ b/extra/project-euler/027/027.factor @@ -38,7 +38,10 @@ IN: project-euler.027 ! b must be prime since n = 0 must return a prime ! a + b + 1 must be prime since n = 1 must return a prime -! a < b +! 1 - a + b must be prime as well, hence >= 2. Therefore: +! 1 - a + b >= 2 +! b - a >= 1 +! a < b (2n + 1)² from 0 .. n +! se -> (4 * n²) - (10 * n) + 7 from 1 .. n +! sw -> (4 * n²) + 1 from 0 .. n +! nw -> (4 * n²) - (6 * n) + 3 from 1 .. n + + + +: euler028 ( -- answer ) + 1001 spiral-diags ; + +! [ euler027 ] 100 ave-time +! 0 ms run / 0 ms GC ave time - 100 trials + +MAIN: euler028 diff --git a/extra/project-euler/project-euler.factor b/extra/project-euler/project-euler.factor index 8ff3b9da88..812a010042 100644 --- a/extra/project-euler/project-euler.factor +++ b/extra/project-euler/project-euler.factor @@ -8,8 +8,9 @@ USING: definitions io io.files kernel math.parser sequences vocabs project-euler.013 project-euler.014 project-euler.015 project-euler.016 project-euler.017 project-euler.018 project-euler.019 project-euler.020 project-euler.021 project-euler.022 project-euler.023 project-euler.024 - project-euler.025 project-euler.026 project-euler.027 project-euler.067 - project-euler.134 project-euler.169 project-euler.173 project-euler.175 ; + project-euler.025 project-euler.026 project-euler.027 project-euler.028 + project-euler.067 project-euler.134 project-euler.169 project-euler.173 + project-euler.175 ; IN: project-euler Date: Fri, 18 Jan 2008 00:43:15 -0500 Subject: [PATCH 017/216] Optimize solution to Project Euler problem 28 --- extra/project-euler/028/028.factor | 27 ++++++--------------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/extra/project-euler/028/028.factor b/extra/project-euler/028/028.factor index 33d87ea451..29a864e2a0 100644 --- a/extra/project-euler/028/028.factor +++ b/extra/project-euler/028/028.factor @@ -25,35 +25,20 @@ IN: project-euler.028 ! SOLUTION ! -------- -! Noticed patterns in the diagnoal numbers starting from the origin going to -! the corners and used these instead of generating the entire spiral: -! ne -> (2n + 1)² from 0 .. n -! se -> (4 * n²) - (10 * n) + 7 from 1 .. n -! sw -> (4 * n²) + 1 from 0 .. n -! nw -> (4 * n²) - (6 * n) + 3 from 1 .. n +! For a square sized n by n, the sum of corners is 4n² - 6n + 6 [ sum-corners ] sigma ; PRIVATE> : euler028 ( -- answer ) - 1001 spiral-diags ; + 1001 sum-diags ; ! [ euler027 ] 100 ave-time ! 0 ms run / 0 ms GC ave time - 100 trials From 6b8b2dff0107abdcf1d6dad2c985de05911650f0 Mon Sep 17 00:00:00 2001 From: Daniel Ehrenberg Date: Thu, 17 Jan 2008 23:51:03 -0600 Subject: [PATCH 018/216] assocs.lib renaming and typo fix --- extra/assocs/lib/lib.factor | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/extra/assocs/lib/lib.factor b/extra/assocs/lib/lib.factor index 0181514ab4..5a277e2d8d 100644 --- a/extra/assocs/lib/lib.factor +++ b/extra/assocs/lib/lib.factor @@ -7,18 +7,18 @@ IN: assocs.lib : >set ( seq -- hash ) [ dup ] H{ } map>assoc ; -: ref-hash ( table key -- value ) swap at ; +: ref-at ( table key -- value ) swap at ; ! set-hash with alternative stack effects -: put-hash* ( table key value -- ) swap rot set-at ; +: put-at* ( table key value -- ) swap rot set-at ; -: put-hash ( table key value -- table ) swap pick set-at ; +: put-at ( table key value -- table ) swap pick set-at ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -: set-hash-stack ( value key seq -- ) - dupd [ key? ] when find-last nip set-at ; +: set-assoc-stack ( value key seq -- ) + dupd [ key? ] with find-last nip set-at ; : at-default ( key assoc -- value/key ) dupd at [ nip ] when* ; From ea85f19dee6edf442b6cf6eed67c14e4596f5569 Mon Sep 17 00:00:00 2001 From: Daniel Ehrenberg Date: Thu, 17 Jan 2008 23:51:35 -0600 Subject: [PATCH 019/216] Fixing missing IN in alien.syntax's docs --- core/alien/syntax/syntax-docs.factor | 1 + 1 file changed, 1 insertion(+) diff --git a/core/alien/syntax/syntax-docs.factor b/core/alien/syntax/syntax-docs.factor index 858c3f145e..ca9ecdf59b 100755 --- a/core/alien/syntax/syntax-docs.factor +++ b/core/alien/syntax/syntax-docs.factor @@ -1,5 +1,6 @@ USING: alien alien.c-types alien.structs alien.syntax alien.syntax.private help.markup help.syntax ; +IN: alien.syntax HELP: DLL" { $syntax "DLL\" path\"" } From dfef1bd7eaae930b8b6dedaa0f63af853ea9f1d9 Mon Sep 17 00:00:00 2001 From: Daniel Ehrenberg Date: Thu, 17 Jan 2008 23:52:56 -0600 Subject: [PATCH 020/216] Really fxing alien.syntax's docs --- core/alien/syntax/syntax-docs.factor | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/alien/syntax/syntax-docs.factor b/core/alien/syntax/syntax-docs.factor index ca9ecdf59b..1bad5acb91 100755 --- a/core/alien/syntax/syntax-docs.factor +++ b/core/alien/syntax/syntax-docs.factor @@ -1,5 +1,4 @@ -USING: alien alien.c-types alien.structs alien.syntax -alien.syntax.private help.markup help.syntax ; +USING: alien alien.c-types alien.structs alien.syntax help.markup help.syntax ; IN: alien.syntax HELP: DLL" From a1ad8b93ea26b12635a53e801939ec366ca630ae Mon Sep 17 00:00:00 2001 From: Daniel Ehrenberg Date: Thu, 17 Jan 2008 23:55:20 -0600 Subject: [PATCH 021/216] Really really fixing alien.syntax's docs! --- core/alien/syntax/syntax-docs.factor | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/alien/syntax/syntax-docs.factor b/core/alien/syntax/syntax-docs.factor index 1bad5acb91..75255d905d 100755 --- a/core/alien/syntax/syntax-docs.factor +++ b/core/alien/syntax/syntax-docs.factor @@ -1,5 +1,6 @@ -USING: alien alien.c-types alien.structs alien.syntax help.markup help.syntax ; +USING: alien alien.c-types alien.structs help.markup help.syntax ; IN: alien.syntax +USE: alien.syntax.private HELP: DLL" { $syntax "DLL\" path\"" } From a3dd5cb1e63f8c02068a32a655b9de4e6af1079a Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Fri, 18 Jan 2008 01:24:55 -0500 Subject: [PATCH 022/216] Solution to Project Euler problem 29 --- extra/project-euler/028/028.factor | 2 +- extra/project-euler/029/029.factor | 37 ++++++++++++++++++++++++ extra/project-euler/project-euler.factor | 4 +-- 3 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 extra/project-euler/029/029.factor diff --git a/extra/project-euler/028/028.factor b/extra/project-euler/028/028.factor index 29a864e2a0..5d20032ea9 100644 --- a/extra/project-euler/028/028.factor +++ b/extra/project-euler/028/028.factor @@ -40,7 +40,7 @@ PRIVATE> : euler028 ( -- answer ) 1001 sum-diags ; -! [ euler027 ] 100 ave-time +! [ euler028 ] 100 ave-time ! 0 ms run / 0 ms GC ave time - 100 trials MAIN: euler028 diff --git a/extra/project-euler/029/029.factor b/extra/project-euler/029/029.factor new file mode 100644 index 0000000000..47855c0bf1 --- /dev/null +++ b/extra/project-euler/029/029.factor @@ -0,0 +1,37 @@ +! Copyright (c) 2007 Aaron Schaefer. +! See http://factorcode.org/license.txt for BSD license. +USING: hashtables kernel math.functions math.ranges project-euler.common + sequences ; +IN: project-euler.029 + +! http://projecteuler.net/index.php?section=problems&id=29 + +! DESCRIPTION +! ----------- + +! Consider all integer combinations of a^b for 2 ≤ a ≤ 5 and 2 ≤ b ≤ 5: + +! 2^2 = 4, 2^3 = 8, 2^4 = 16, 2^5 = 32 +! 3^2 = 9, 3^3 = 27, 3^4 = 81, 3^5 = 243 +! 4^2 = 16, 4^3 = 64, 4^4 = 256, 4^5 = 1024 +! 5^2 = 25, 5^3 = 125, 5^4 = 625, 5^5 = 3125 + +! If they are then placed in numerical order, with any repeats removed, we get +! the following sequence of 15 distinct terms: + +! 4, 8, 9, 16, 25, 27, 32, 64, 81, 125, 243, 256, 625, 1024, 3125 + +! How many distinct terms are in the sequence generated by a^b for 2 ≤ a ≤ 100 +! and 2 ≤ b ≤ 100? + + +! SOLUTION +! -------- + +: euler029 ( -- answer ) + 2 100 [a,b] dup cartesian-product [ first2 ^ ] map prune length ; + +! [ euler029 ] 100 ave-time +! 951 ms run / 12 ms GC ave time - 100 trials + +MAIN: euler029 diff --git a/extra/project-euler/project-euler.factor b/extra/project-euler/project-euler.factor index 812a010042..513eeba020 100644 --- a/extra/project-euler/project-euler.factor +++ b/extra/project-euler/project-euler.factor @@ -9,8 +9,8 @@ USING: definitions io io.files kernel math.parser sequences vocabs project-euler.017 project-euler.018 project-euler.019 project-euler.020 project-euler.021 project-euler.022 project-euler.023 project-euler.024 project-euler.025 project-euler.026 project-euler.027 project-euler.028 - project-euler.067 project-euler.134 project-euler.169 project-euler.173 - project-euler.175 ; + project-euler.029 project-euler.067 project-euler.134 project-euler.169 + project-euler.173 project-euler.175 ; IN: project-euler Date: Thu, 17 Jan 2008 23:06:32 -0800 Subject: [PATCH 023/216] Remove USE-IF: again --- core/syntax/syntax-docs.factor | 6 ------ core/syntax/syntax.factor | 1 - extra/opengl/gl/gl.factor | 5 ++--- 3 files changed, 2 insertions(+), 10 deletions(-) diff --git a/core/syntax/syntax-docs.factor b/core/syntax/syntax-docs.factor index f4efc3b6bb..9cf9647e41 100755 --- a/core/syntax/syntax-docs.factor +++ b/core/syntax/syntax-docs.factor @@ -363,12 +363,6 @@ HELP: USE: { $description "Adds a new vocabulary at the front of the search path. Subsequent word lookups by the parser will search this vocabulary first." } { $errors "Throws an error if the vocabulary does not exist." } ; -HELP: USE-IF: -{ $syntax "USE-IF: word vocabulary" } -{ $values { "word" "a word with stack effect " { $snippet "( -- ? )" } } { "vocabulary" "a vocabulary name" } } -{ $description "Adds " { $snippet "vocabulary" } " at the front of the search path if " { $snippet "word" } " evaluates to a true value." } -{ $errors "Throws an error if the vocabulary does not exist." } ; - HELP: USING: { $syntax "USING: vocabularies... ;" } { $values { "vocabularies" "a list of vocabulary names" } } diff --git a/core/syntax/syntax.factor b/core/syntax/syntax.factor index de627358e4..7616f6e64b 100755 --- a/core/syntax/syntax.factor +++ b/core/syntax/syntax.factor @@ -46,7 +46,6 @@ IN: bootstrap.syntax ] define-syntax "USE:" [ scan use+ ] define-syntax - "USE-IF:" [ scan-word execute scan swap [ use+ ] [ drop ] if ] define-syntax "USING:" [ ";" parse-tokens add-use ] define-syntax diff --git a/extra/opengl/gl/gl.factor b/extra/opengl/gl/gl.factor index 4a9d9c84d5..071fbc45e7 100644 --- a/extra/opengl/gl/gl.factor +++ b/extra/opengl/gl/gl.factor @@ -3,9 +3,8 @@ ! This file is based on the gl.h that comes with xorg-x11 6.8.2 -USING: alien alien.syntax kernel sequences system words ; -USE-IF: windows? opengl.gl.windows -USE-IF: unix? opengl.gl.unix +USING: alien alien.syntax kernel parser sequences system words ; +<< windows? "opengl.gl.windows" "opengl.gl.unix" ? use+ >> IN: opengl.gl From 08e9503f842a2b89570cfe7476d935d247a1fb74 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Fri, 18 Jan 2008 02:39:09 -0500 Subject: [PATCH 024/216] XMode fixes --- extra/xmode/README.txt | 3 +++ extra/xmode/catalog/catalog.factor | 22 +++++++++++----------- extra/xmode/marker/context/context.factor | 1 + extra/xmode/marker/marker-tests.factor | 8 ++++++++ extra/xmode/modes/bcel.xml | 2 +- extra/xmode/modes/clips.xml | 2 +- extra/xmode/modes/objective-c.xml | 2 +- extra/xmode/modes/powerdynamo.xml | 16 ++++++++-------- extra/xmode/modes/rview.xml | 2 +- extra/xmode/modes/tthtml.xml | 2 +- 10 files changed, 36 insertions(+), 24 deletions(-) diff --git a/extra/xmode/README.txt b/extra/xmode/README.txt index 57d9f42b22..07d56dd877 100755 --- a/extra/xmode/README.txt +++ b/extra/xmode/README.txt @@ -36,6 +36,9 @@ to depend on: find a mode file which depends on this flaw, please fix it and submit the changes to the jEdit project. +- References to non-existent rule sets in IMPORT tags and DELEGATE + attributes were ignored in jEdit. They raise an error in Factor. + If you wish to contribute a new or improved mode file, please contact the jEdit project. Updated mode files in jEdit will be periodically imported into the Factor source tree. diff --git a/extra/xmode/catalog/catalog.factor b/extra/xmode/catalog/catalog.factor index 6a0efa072e..9c7e6a1ee7 100644 --- a/extra/xmode/catalog/catalog.factor +++ b/extra/xmode/catalog/catalog.factor @@ -42,9 +42,12 @@ MEMO: (load-mode) ( name -- rule-sets ) SYMBOL: rule-sets +: no-such-rule-set ( name -- * ) + "No such rule set: " swap append throw ; + : get-rule-set ( name -- rule-sets rules ) - "::" split1 [ swap (load-mode) ] [ rule-sets get ] if* - tuck at ; + dup "::" split1 [ swap (load-mode) ] [ rule-sets get ] if* + dup -roll at* [ nip ] [ drop no-such-rule-set ] if ; : resolve-delegate ( rule -- ) dup rule-delegate dup string? @@ -68,14 +71,11 @@ SYMBOL: rule-sets : resolve-imports ( ruleset -- ) dup rule-set-imports [ - get-rule-set dup [ - swap rule-sets [ - 2dup import-keywords - import-rules - ] with-variable - ] [ - 3drop - ] if + get-rule-set swap rule-sets [ + dup resolve-delegates + 2dup import-keywords + import-rules + ] with-variable ] with each ; : finalize-rule-set ( ruleset -- ) @@ -99,7 +99,7 @@ SYMBOL: rule-sets (load-mode) dup finalize-mode ; : reset-modes ( -- ) - \ load-mode "memoize" word-prop clear-assoc ; + \ (load-mode) "memoize" word-prop clear-assoc ; : ?glob-matches ( string glob/f -- ? ) dup [ glob-matches? ] [ 2drop f ] if ; diff --git a/extra/xmode/marker/context/context.factor b/extra/xmode/marker/context/context.factor index 8023e1d321..72ac3f2a3f 100644 --- a/extra/xmode/marker/context/context.factor +++ b/extra/xmode/marker/context/context.factor @@ -10,6 +10,7 @@ end ; : ( ruleset parent -- line-context ) + over [ "no context" throw ] unless { set-line-context-in-rule-set set-line-context-parent } line-context construct ; diff --git a/extra/xmode/marker/marker-tests.factor b/extra/xmode/marker/marker-tests.factor index b9621a112a..6bcba91c84 100755 --- a/extra/xmode/marker/marker-tests.factor +++ b/extra/xmode/marker/marker-tests.factor @@ -133,3 +133,11 @@ IN: temporary ] [ f "font:75%/1.6em \"Lucida Grande\", \"Lucida Sans Unicode\", verdana, geneva, sans-serif;" "css" load-mode tokenize-line 2drop ] unit-test + +[ + { + T{ token f "<" MARKUP } + T{ token f "aaa" MARKUP } + T{ token f ">" MARKUP } + } +] [ f "" "html" load-mode tokenize-line nip ] unit-test diff --git a/extra/xmode/modes/bcel.xml b/extra/xmode/modes/bcel.xml index 19ab3cfd67..628911f431 100644 --- a/extra/xmode/modes/bcel.xml +++ b/extra/xmode/modes/bcel.xml @@ -19,7 +19,7 @@ /**/ - + /** */ diff --git a/extra/xmode/modes/clips.xml b/extra/xmode/modes/clips.xml index ce2efcabab..51d89d05eb 100644 --- a/extra/xmode/modes/clips.xml +++ b/extra/xmode/modes/clips.xml @@ -33,7 +33,7 @@ - + [ ] diff --git a/extra/xmode/modes/objective-c.xml b/extra/xmode/modes/objective-c.xml index c6c52c8211..7496838938 100644 --- a/extra/xmode/modes/objective-c.xml +++ b/extra/xmode/modes/objective-c.xml @@ -89,7 +89,7 @@ elif\b if\b - + diff --git a/extra/xmode/modes/powerdynamo.xml b/extra/xmode/modes/powerdynamo.xml index 7babf3dc74..f5eb29e49c 100644 --- a/extra/xmode/modes/powerdynamo.xml +++ b/extra/xmode/modes/powerdynamo.xml @@ -200,11 +200,11 @@ for the other tags (data, document, etc). more support planned for future. */ - + " " - + ' ' @@ -413,11 +413,11 @@ for the other tags (data, document, etc). more support planned for future. - + " " - + ' ' @@ -428,11 +428,11 @@ for the other tags (data, document, etc). more support planned for future. - + " " - + ' ' @@ -444,11 +444,11 @@ for the other tags (data, document, etc). more support planned for future. - + " " - + ' ' diff --git a/extra/xmode/modes/rview.xml b/extra/xmode/modes/rview.xml index 9747465814..2ca2fdf36a 100644 --- a/extra/xmode/modes/rview.xml +++ b/extra/xmode/modes/rview.xml @@ -23,7 +23,7 @@ /**/ - + /** */ diff --git a/extra/xmode/modes/tthtml.xml b/extra/xmode/modes/tthtml.xml index 24d9667c6c..37bfa2fb17 100644 --- a/extra/xmode/modes/tthtml.xml +++ b/extra/xmode/modes/tthtml.xml @@ -101,7 +101,7 @@ HIGHLIGHT_DIGITS="TRUE" DIGIT_RE="(0x[\p{XDigit}]+[lL]?|[\p{Digit}]+(e[\p{Digit}]*)?[lLdDfF]?)"> - + ${ } From 15fa72da9c3c3e1e12f0fa3a2112300c93393c7b Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Fri, 18 Jan 2008 02:39:24 -0500 Subject: [PATCH 025/216] No point having get/set-global inline --- core/namespaces/namespaces.factor | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/namespaces/namespaces.factor b/core/namespaces/namespaces.factor index bac6895b62..3d3d3c554b 100644 --- a/core/namespaces/namespaces.factor +++ b/core/namespaces/namespaces.factor @@ -15,16 +15,16 @@ IN: namespaces PRIVATE> : namespace ( -- namespace ) namestack* peek ; -: namestack ( -- namestack ) namestack* clone ; inline -: set-namestack ( namestack -- ) >vector 0 setenv ; inline +: namestack ( -- namestack ) namestack* clone ; +: set-namestack ( namestack -- ) >vector 0 setenv ; : global ( -- g ) 21 getenv { hashtable } declare ; inline : init-namespaces ( -- ) global 1array set-namestack ; : get ( variable -- value ) namestack* assoc-stack ; flushable : set ( value variable -- ) namespace set-at ; : on ( variable -- ) t swap set ; inline : off ( variable -- ) f swap set ; inline -: get-global ( variable -- value ) global at ; inline -: set-global ( value variable -- ) global set-at ; inline +: get-global ( variable -- value ) global at ; +: set-global ( value variable -- ) global set-at ; : change ( variable quot -- ) >r dup get r> rot slip set ; inline From 423b0c469745f88c6641b75ac995261cc5e11eba Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Fri, 18 Jan 2008 17:09:30 -0500 Subject: [PATCH 026/216] Remove useless optimization --- core/cpu/architecture/architecture.factor | 10 ++-------- core/cpu/ppc/architecture/architecture.factor | 14 +------------- core/cpu/x86/architecture/architecture.factor | 10 +--------- core/generator/generator.factor | 17 +++-------------- 4 files changed, 7 insertions(+), 44 deletions(-) diff --git a/core/cpu/architecture/architecture.factor b/core/cpu/architecture/architecture.factor index e48ba97f33..4da22ff38a 100755 --- a/core/cpu/architecture/architecture.factor +++ b/core/cpu/architecture/architecture.factor @@ -51,14 +51,8 @@ HOOK: %save-dispatch-xt compiler-backend ( -- ) M: object %save-dispatch-xt %save-word-xt ; -! Call C primitive -HOOK: %call-primitive compiler-backend ( label -- ) - -! Call another label -HOOK: %call-label compiler-backend ( label -- ) - -! Far jump to C primitive -HOOK: %jump-primitive compiler-backend ( label -- ) +! Call another word +HOOK: %call compiler-backend ( word -- ) ! Local jump for branches HOOK: %jump-label compiler-backend ( label -- ) diff --git a/core/cpu/ppc/architecture/architecture.factor b/core/cpu/ppc/architecture/architecture.factor index edbed571e1..7444c21a8c 100755 --- a/core/cpu/ppc/architecture/architecture.factor +++ b/core/cpu/ppc/architecture/architecture.factor @@ -97,26 +97,14 @@ M: ppc-backend %epilogue ( n -- ) 1 1 rot ADDI 0 MTLR ; -: %prepare-primitive ( word -- ) - #! Save stack pointer to stack_chain->callstack_top, load XT - 4 1 MR - 0 11 LOAD32 - rc-absolute-ppc-2/2 rel-primitive ; - : (%call) 11 MTLR BLRL ; -M: ppc-backend %call-primitive ( word -- ) - %prepare-primitive (%call) ; - : (%jump) 11 MTCTR BCTR ; -M: ppc-backend %jump-primitive ( word -- ) - %prepare-primitive (%jump) ; - : %load-dlsym ( symbol dll register -- ) 0 swap LOAD32 rc-absolute-ppc-2/2 rel-dlsym ; -M: ppc-backend %call-label ( label -- ) BL ; +M: ppc-backend %call ( label -- ) BL ; M: ppc-backend %jump-label ( label -- ) B ; diff --git a/core/cpu/x86/architecture/architecture.factor b/core/cpu/x86/architecture/architecture.factor index 876c631b81..8c5d5c1dc0 100755 --- a/core/cpu/x86/architecture/architecture.factor +++ b/core/cpu/x86/architecture/architecture.factor @@ -70,15 +70,7 @@ M: x86-backend %prepare-alien-invoke temp-reg v>operand 2 cells [+] ds-reg MOV temp-reg v>operand 3 cells [+] rs-reg MOV ; -M: x86-backend %call-primitive ( word -- ) - stack-save-reg stack-reg cell neg [+] LEA - address-operand CALL ; - -M: x86-backend %jump-primitive ( word -- ) - stack-save-reg stack-reg MOV - address-operand JMP ; - -M: x86-backend %call-label ( label -- ) CALL ; +M: x86-backend %call ( label -- ) CALL ; M: x86-backend %jump-label ( label -- ) JMP ; diff --git a/core/generator/generator.factor b/core/generator/generator.factor index df01f9e490..0e499cf90f 100755 --- a/core/generator/generator.factor +++ b/core/generator/generator.factor @@ -100,21 +100,10 @@ UNION: #terminal ! node M: node generate-node drop iterate-next ; -: %call ( word -- ) - dup primitive? [ %call-primitive ] [ %call-label ] if ; - : %jump ( word -- ) - { - { [ dup compiling-label get eq? ] [ - drop current-label-start get %jump-label - ] } - { [ dup primitive? ] [ - %epilogue-later %jump-primitive - ] } - { [ t ] [ - %epilogue-later %jump-label - ] } - } cond ; + dup compiling-label get eq? + [ drop current-label-start get ] [ %epilogue-later ] if + %jump-label ; : generate-call ( label -- next ) dup maybe-compile From 011681f07ab08c0425e398bda93000f6fca3aef2 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Fri, 18 Jan 2008 17:09:45 -0500 Subject: [PATCH 027/216] Fix construct-empty transform --- .../transforms/transforms-tests.factor | 4 ++- core/inference/transforms/transforms.factor | 26 +++++++++++++------ 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/core/inference/transforms/transforms-tests.factor b/core/inference/transforms/transforms-tests.factor index 6dc5bcabcd..9a62a1faca 100644 --- a/core/inference/transforms/transforms-tests.factor +++ b/core/inference/transforms/transforms-tests.factor @@ -1,6 +1,6 @@ IN: temporary USING: sequences inference.transforms tools.test math kernel -quotations ; +quotations tools.test.inference ; : compose-n-quot >quotation ; : compose-n compose-n-quot call ; @@ -18,3 +18,5 @@ quotations ; [ 268 ] [ 1 { 8 { 3 2 } } bitfield-quot call ] unit-test [ 512 ] [ 1 { { 1+ 8 } } bitfield-quot call ] unit-test + +\ construct-empty must-infer diff --git a/core/inference/transforms/transforms.factor b/core/inference/transforms/transforms.factor index 62c3129f3a..eabe4b8c2a 100755 --- a/core/inference/transforms/transforms.factor +++ b/core/inference/transforms/transforms.factor @@ -1,8 +1,8 @@ -! Copyright (C) 2007 Slava Pestov. +! Copyright (C) 2007, 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: arrays kernel words sequences generic math namespaces quotations assocs combinators math.bitfields inference.backend -inference.dataflow inference.state tuples.private ; +inference.dataflow inference.state tuples.private effects ; IN: inference.transforms : pop-literals ( n -- rstate seq ) @@ -61,11 +61,21 @@ M: pair (bitfield-quot) ( spec -- quot ) \ set-slots [ [get-slots] ] 1 define-transform -: [construct] ( word quot -- newquot ) - >r dup +inlined+ depends-on dup tuple-size r> 2curry ; +\ construct-boa [ + dup +inlined+ depends-on + dup tuple-size [ ] 2curry +] 1 define-transform -\ construct-boa -[ [ ] [construct] ] 1 define-transform +\ construct-empty [ + 1 ensure-values + peek-d value? [ + pop-literal + dup +inlined+ depends-on + dup tuple-size [ ] 2curry + swap infer-quot + ] [ + \ construct-empty declared-infer + ] if +] "infer" set-word-prop -\ construct-empty -[ [ ] [construct] ] 1 define-transform +\ construct-empty 1 1 "inferred-effect" set-word-prop From 30dec8b0a886eea7e9f833d3eda019ec3750f3e3 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Fri, 18 Jan 2008 17:09:55 -0500 Subject: [PATCH 028/216] Fix documentation typos --- core/kernel/kernel-docs.factor | 2 +- extra/io/launcher/launcher-docs.factor | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/kernel/kernel-docs.factor b/core/kernel/kernel-docs.factor index 8f0e4efbd9..2301216394 100755 --- a/core/kernel/kernel-docs.factor +++ b/core/kernel/kernel-docs.factor @@ -557,7 +557,7 @@ HELP: dip HELP: while { $values { "pred" "a quotation with stack effect " { $snippet "( -- ? )" } } { "body" "a quotation" } { "tail" "a quotation" } } -{ $description "Repeatedly calls " { $snippet "pred" } ". If it yields " { $link f } ", iteration stops, otherwise " { $snippet "quot" } " is called. After iteration stops, " { $snippet "tail" } " is called." } +{ $description "Repeatedly calls " { $snippet "pred" } ". If it yields " { $link f } ", iteration stops, otherwise " { $snippet "body" } " is called. After iteration stops, " { $snippet "tail" } " is called." } { $notes "In most cases, tail recursion should be used, because it is simpler both in terms of implementation and conceptually. However in some cases this combinator expresses intent better and should be used." $nl "Strictly speaking, the " { $snippet "tail" } " is not necessary, since the following are equivalent:" diff --git a/extra/io/launcher/launcher-docs.factor b/extra/io/launcher/launcher-docs.factor index 99f318eaf4..7ad5e064bf 100755 --- a/extra/io/launcher/launcher-docs.factor +++ b/extra/io/launcher/launcher-docs.factor @@ -85,7 +85,7 @@ HELP: run-detached HELP: { $values { "obj" object } { "stream" "a bidirectional stream" } } -{ $description "Launches a process and redirects its input and output via a paper of pipes which may be read and written as a stream." } +{ $description "Launches a process and redirects its input and output via a pair of pipes which may be read and written as a stream." } { $notes "Closing the stream will block until the process exits." } ; { run-process run-detached } related-words From 5c388404d6e061a1d6b4894e12560b010fe5b2f1 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Fri, 18 Jan 2008 17:10:08 -0500 Subject: [PATCH 029/216] Fix sha1 --- extra/benchmark/sha1/sha1.factor | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extra/benchmark/sha1/sha1.factor b/extra/benchmark/sha1/sha1.factor index 614077c673..897d83ea0e 100644 --- a/extra/benchmark/sha1/sha1.factor +++ b/extra/benchmark/sha1/sha1.factor @@ -1,7 +1,7 @@ USING: crypto.sha1 io.files kernel ; IN: benchmark.sha1 -: sha1-primes-list ( -- seq ) - "extra/math/primes/list/list.factor" resource-path file>sha1 ; +: sha1-primes-list ( -- ) + "extra/math/primes/list/list.factor" resource-path file>sha1 drop ; MAIN: sha1-primes-list From ab7849f71105559a337f81f408cdecccb48bc8f9 Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Fri, 18 Jan 2008 17:11:06 -0500 Subject: [PATCH 030/216] Use vectors instead of arrays in solution to Project Euler problem 2 --- extra/project-euler/002/002.factor | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extra/project-euler/002/002.factor b/extra/project-euler/002/002.factor index b9375b7d1e..55c1b153cc 100644 --- a/extra/project-euler/002/002.factor +++ b/extra/project-euler/002/002.factor @@ -22,12 +22,12 @@ IN: project-euler.002 r add dup 2 tail* sum r> (fib-upto) ] [ 2drop ] if ; + 2dup <= [ [ over push dup 2 tail* sum ] dip (fib-upto) ] [ 2drop ] if ; PRIVATE> : fib-upto ( n -- seq ) - { 0 } 1 rot (fib-upto) ; + V{ 0 } clone 1 rot (fib-upto) ; : euler002 ( -- answer ) 1000000 fib-upto [ even? ] subset sum ; From 588253dfe3f9c042c1522b2b8174236b63f6ad97 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Fri, 18 Jan 2008 18:18:54 -0500 Subject: [PATCH 031/216] Cleaning up Unix I/O --- extra/io/unix/backend/backend.factor | 127 +++++++++------------ extra/io/unix/backend/select/select.factor | 53 +++++++++ extra/io/unix/sockets/sockets.factor | 20 ++-- extra/unix/kqueue/kqueue.factor | 73 ++++++++++++ 4 files changed, 188 insertions(+), 85 deletions(-) create mode 100644 extra/io/unix/backend/select/select.factor create mode 100644 extra/unix/kqueue/kqueue.factor diff --git a/extra/io/unix/backend/backend.factor b/extra/io/unix/backend/backend.factor index 3522a2218b..ec73a5395e 100755 --- a/extra/io/unix/backend/backend.factor +++ b/extra/io/unix/backend/backend.factor @@ -1,21 +1,24 @@ -! Copyright (C) 2004, 2007 Slava Pestov. +! Copyright (C) 2004, 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: alien bit-arrays generic assocs io kernel -kernel.private math io.nonblocking sequences strings structs -sbufs threads unix vectors io.buffers io.backend -io.streams.duplex math.parser continuations system libc ; +USING: alien generic assocs kernel kernel.private math +io.nonblocking sequences strings structs sbufs threads unix +vectors io.buffers io.backend io.streams.duplex math.parser +continuations system libc qualified namespaces ; +QUALIFIED: io IN: io.unix.backend +! Multiplexer protocol +SYMBOL: unix-io-backend + +HOOK: init-unix-io unix-io-backend ( -- ) +HOOK: register-io-task unix-io-backend ( task -- ) +HOOK: unregister-io-task unix-io-backend ( task -- ) +HOOK: unix-io-multiplex unix-io-backend ( timeval -- ) + TUPLE: unix-io ; -! We want namespaces::bind to shadow the bind system call from -! unix -USING: namespaces ; - ! Global variables -SYMBOL: read-fdset SYMBOL: read-tasks -SYMBOL: write-fdset SYMBOL: write-tasks ! Some general stuff @@ -53,9 +56,9 @@ M: integer close-handle ( fd -- ) ! port to finish I/O TUPLE: io-task port callbacks ; -: ( port class -- task ) - >r V{ } clone io-task construct-boa - { set-delegate } r> construct ; inline +: ( port continuation class -- task ) + >r 1vector io-task construct-boa r> construct-delegate ; + inline ! Multiplexer GENERIC: do-io-task ( task -- ? ) @@ -63,58 +66,30 @@ GENERIC: task-container ( task -- vector ) : io-task-fd io-task-port port-handle ; -: add-io-task ( callback task -- ) - [ io-task-callbacks push ] keep - dup io-task-fd over task-container 2dup at [ +: check-io-task ( task -- ) + dup io-task-fd swap task-container at [ "Cannot perform multiple reads from the same port" throw - ] when set-at ; + ] when ; + +: add-io-task ( task -- ) + dup check-io-task + dup register-io-task + dup io-task-fd over task-container set-at ; : remove-io-task ( task -- ) - dup io-task-fd swap task-container delete-at ; + dup io-task-fd over task-container delete-at + unregister-io-task ; : pop-callbacks ( task -- ) - dup io-task-callbacks swap remove-io-task - [ schedule-thread ] each ; + dup remove-io-task + io-task-callbacks [ schedule-thread ] each ; : handle-fd ( task -- ) dup io-task-port touch-port dup do-io-task [ pop-callbacks ] [ drop ] if ; -: handle-fdset ( fdset tasks -- ) - swap [ - swap dup io-task-port timeout? [ - dup io-task-port "Timeout" swap report-error - nip pop-callbacks - ] [ - tuck io-task-fd swap nth - [ handle-fd ] [ drop ] if - ] if drop - ] curry assoc-each ; - -: init-fdset ( fdset tasks -- ) - swap dup clear-bits - [ >r drop t swap r> set-nth ] curry assoc-each ; - -: read-fdset/tasks - read-fdset get-global read-tasks get-global ; - -: write-fdset/tasks - write-fdset get-global write-tasks get-global ; - -: init-fdsets ( -- read write except ) - read-fdset/tasks dupd init-fdset - write-fdset/tasks dupd init-fdset - f ; - -: (io-multiplex) ( ms -- ) - >r FD_SETSIZE init-fdsets r> make-timeval select 0 < [ - err_no ignorable-error? [ (io-error) ] unless - ] when ; - -M: unix-io io-multiplex ( ms -- ) - (io-multiplex) - read-fdset/tasks handle-fdset - write-fdset/tasks handle-fdset ; +: handle-timeout ( task -- ) + "Timeout" over io-task-port report-error pop-callbacks ; ! Readers : reader-eof ( reader -- ) @@ -137,17 +112,18 @@ M: unix-io io-multiplex ( ms -- ) TUPLE: read-task ; -: ( port -- task ) read-task ; +: ( port continuation -- task ) + read-task ; M: read-task do-io-task io-task-port dup refill [ [ reader-eof ] [ drop ] if ] keep ; -M: read-task task-container drop read-tasks get-global ; +M: read-task task-container + drop read-tasks get-global ; M: input-port (wait-to-read) - [ swap add-io-task stop ] callcc0 - pending-error ; + [ add-io-task stop ] callcc0 pending-error ; ! Writers : write-step ( port -- ? ) @@ -156,35 +132,34 @@ M: input-port (wait-to-read) TUPLE: write-task ; -: ( port -- task ) write-task ; +: ( port continuation -- task ) + write-task ; M: write-task do-io-task io-task-port dup buffer-empty? over port-error or [ 0 swap buffer-reset t ] [ write-step ] if ; -M: write-task task-container drop write-tasks get-global ; +M: write-task task-container + drop write-tasks get-global ; -: add-write-io-task ( callback task -- ) - dup io-task-fd write-tasks get-global at - [ io-task-callbacks push ] [ add-io-task ] ?if ; +: add-write-io-task ( port continuation -- ) + over port-handle write-tasks get-global at + [ io-task-callbacks push drop ] + [ add-io-task ] if* ; : (wait-to-write) ( port -- ) - [ swap add-write-io-task stop ] callcc0 drop ; + [ add-write-io-task stop ] callcc0 drop ; M: port port-flush ( port -- ) dup buffer-empty? [ drop ] [ (wait-to-write) ] if ; -USE: io +M: unix-io io-multiplex ( ms -- ) + make-timeval unix-io-multiplex ; M: unix-io init-io ( -- ) - #! Should only be called on startup. Calling this at any - #! other time can have unintended consequences. - global [ - H{ } clone read-tasks set - FD_SETSIZE 8 * read-fdset set - H{ } clone write-tasks set - FD_SETSIZE 8 * write-fdset set - ] bind ; + H{ } clone read-tasks set-global + H{ } clone write-tasks set-global + init-unix-io ; M: unix-io init-stdio ( -- ) - 0 1 handle>duplex-stream stdio set-global ; + 0 1 handle>duplex-stream io:stdio set-global ; diff --git a/extra/io/unix/backend/select/select.factor b/extra/io/unix/backend/select/select.factor new file mode 100644 index 0000000000..255010bff6 --- /dev/null +++ b/extra/io/unix/backend/select/select.factor @@ -0,0 +1,53 @@ +! Copyright (C) 2004, 2008 Slava Pestov. +! See http://factorcode.org/license.txt for BSD license. +USING: alien.syntax kernel io.nonblocking io.unix.backend +bit-arrays sequences assocs unix math namespaces ; +IN: io.unix.backend.select + +TUPLE: unix-select-io ; + +! Global variables +SYMBOL: read-fdset +SYMBOL: write-fdset + +M: unix-select-io init-unix-io ( -- ) + FD_SETSIZE 8 * read-fdset set-global + FD_SETSIZE 8 * write-fdset set-global ; + +: handle-fdset ( fdset tasks -- ) + swap [ + swap dup io-task-port timeout? [ + nip handle-timeout + ] [ + tuck io-task-fd swap nth + [ handle-fd ] [ drop ] if + ] if drop + ] curry assoc-each ; + +: init-fdset ( fdset tasks -- ) + swap dup clear-bits + [ >r drop t swap r> set-nth ] curry assoc-each ; + +: read-fdset/tasks + read-fdset get-global read-tasks get-global ; + +: write-fdset/tasks + write-fdset get-global write-tasks get-global ; + +: init-fdsets ( -- read write except ) + read-fdset/tasks dupd init-fdset + write-fdset/tasks dupd init-fdset + f ; + +M: unix-select-io register-io-task ( task -- ) drop ; + +M: unix-select-io unregister-io-task ( task -- ) drop ; + +M: unix-select-io unix-io-multiplex ( timeval -- ) + >r FD_SETSIZE init-fdsets r> select 0 < [ + err_no ignorable-error? [ (io-error) ] unless + ] when + read-fdset/tasks handle-fdset + write-fdset/tasks handle-fdset ; + +T{ unix-select-io } unix-io-backend set-global diff --git a/extra/io/unix/sockets/sockets.factor b/extra/io/unix/sockets/sockets.factor index 0787a1afde..30d3bbd94c 100644 --- a/extra/io/unix/sockets/sockets.factor +++ b/extra/io/unix/sockets/sockets.factor @@ -33,7 +33,8 @@ M: unix-io addrinfo-error ( n -- ) TUPLE: connect-task ; -: ( port -- task ) connect-task ; +: ( port continuation -- task ) + connect-task ; M: connect-task do-io-task io-task-port dup port-handle f 0 write @@ -42,7 +43,7 @@ M: connect-task do-io-task M: connect-task task-container drop write-tasks get-global ; : wait-to-connect ( port -- ) - [ swap add-io-task stop ] callcc0 drop ; + [ add-io-task stop ] callcc0 drop ; M: unix-io (client) ( addrspec -- stream ) dup make-sockaddr/size >r >r @@ -66,7 +67,8 @@ USE: unix TUPLE: accept-task ; -: ( port -- task ) accept-task ; +: ( port continuation -- task ) + accept-task ; M: accept-task task-container drop read-tasks get ; @@ -85,7 +87,7 @@ M: accept-task do-io-task over 0 >= [ do-accept t ] [ 2drop defer-error ] if ; : wait-to-accept ( server -- ) - [ swap add-io-task stop ] callcc0 drop ; + [ add-io-task stop ] callcc0 drop ; USE: io.sockets @@ -136,7 +138,8 @@ packet-size receive-buffer set-global TUPLE: receive-task ; -: ( stream -- task ) receive-task ; +: ( stream continuation -- task ) + receive-task ; M: receive-task do-io-task io-task-port @@ -152,7 +155,7 @@ M: receive-task do-io-task M: receive-task task-container drop read-tasks get ; : wait-receive ( stream -- ) - [ swap add-io-task stop ] callcc0 drop ; + [ add-io-task stop ] callcc0 drop ; M: unix-io receive ( datagram -- packet addrspec ) dup check-datagram-port @@ -166,7 +169,7 @@ M: unix-io receive ( datagram -- packet addrspec ) TUPLE: send-task packet sockaddr len ; -: ( packet sockaddr len port -- task ) +: ( packet sockaddr len stream continuation -- task ) send-task [ { set-send-task-packet @@ -185,8 +188,7 @@ M: send-task do-io-task M: send-task task-container drop write-tasks get ; : wait-send ( packet sockaddr len stream -- ) - [ >r r> swap add-io-task stop ] callcc0 - 2drop 2drop ; + [ add-io-task stop ] callcc0 2drop 2drop ; M: unix-io send ( packet addrspec datagram -- ) 3dup check-datagram-send diff --git a/extra/unix/kqueue/kqueue.factor b/extra/unix/kqueue/kqueue.factor new file mode 100644 index 0000000000..4e6504470d --- /dev/null +++ b/extra/unix/kqueue/kqueue.factor @@ -0,0 +1,73 @@ +! Copyright (C) 2008 Slava Pestov. +! See http://factorcode.org/license.txt for BSD license. +USING: alien.syntax ; +IN: unix.kqueue + +FUNCTION: int kqueue ( ) ; + +FUNCTION: int kevent ( int kq, kevent* changelist, int nchanges, kevent* eventlist, int nevents, timespec* timeout ) ; + +C-STRUCT: kevent + { "ulong" "ident" } ! identifier for this event + { "short" "filter" } ! filter for event + { "ushort" "flags" } ! action flags for kqueue + { "uint" "fflags" } ! filter flag value + { "long" "data" } ! filter data value + { "void*" "udata" } ! opaque user data identifier +; + +: EVFILT_READ -1 ; inline +: EVFILT_WRITE -2 ; inline +: EVFILT_AIO -3 ; inline ! attached to aio requests +: EVFILT_VNODE -4 ; inline ! attached to vnodes +: EVFILT_PROC -5 ; inline ! attached to struct proc +: EVFILT_SIGNAL -6 ; inline ! attached to struct proc +: EVFILT_TIMER -7 ; inline ! timers +: EVFILT_MACHPORT -8 ; inline ! Mach ports +: EVFILT_FS -9 ; inline ! Filesystem events + +! actions +: EV_ADD HEX: 1 ; inline ! add event to kq (implies enable) +: EV_DELETE HEX: 2 ; inline ! delete event from kq +: EV_ENABLE HEX: 4 ; inline ! enable event +: EV_DISABLE HEX: 8 ; inline ! disable event (not reported) + +! flags +: EV_ONESHOT HEX: 10 ; inline ! only report one occurrence +: EV_CLEAR HEX: 20 ; inline ! clear event state after reporting + +: EV_SYSFLAGS HEX: f000 ; inline ! reserved by system +: EV_FLAG0 HEX: 1000 ; inline ! filter-specific flag +: EV_FLAG1 HEX: 2000 ; inline ! filter-specific flag + +! returned values +: EV_EOF HEX: 8000 ; inline ! EOF detected +: EV_ERROR HEX: 4000 ; inline ! error, data contains errno + +: EV_POLL EV_FLAG0 ; inline +: EV_OOBAND EV_FLAG1 ; inline + +: NOTE_LOWAT HEX: 00000001 ; inline ! low water mark + +: NOTE_DELETE HEX: 00000001 ; inline ! vnode was removed +: NOTE_WRITE HEX: 00000002 ; inline ! data contents changed +: NOTE_EXTEND HEX: 00000004 ; inline ! size increased +: NOTE_ATTRIB HEX: 00000008 ; inline ! attributes changed +: NOTE_LINK HEX: 00000010 ; inline ! link count changed +: NOTE_RENAME HEX: 00000020 ; inline ! vnode was renamed +: NOTE_REVOKE HEX: 00000040 ; inline ! vnode access was revoked + +: NOTE_EXIT HEX: 80000000 ; inline ! process exited +: NOTE_FORK HEX: 40000000 ; inline ! process forked +: NOTE_EXEC HEX: 20000000 ; inline ! process exec'd +: NOTE_PCTRLMASK HEX: f0000000 ; inline ! mask for hint bits +: NOTE_PDATAMASK HEX: 000fffff ; inline ! mask for pid + +: NOTE_SECONDS HEX: 00000001 ; inline ! data is seconds +: NOTE_USECONDS HEX: 00000002 ; inline ! data is microseconds +: NOTE_NSECONDS HEX: 00000004 ; inline ! data is nanoseconds +: NOTE_ABSOLUTE HEX: 00000008 ; inline ! absolute timeout + +: NOTE_TRACK HEX: 00000001 ; inline ! follow across forks +: NOTE_TRACKERR HEX: 00000002 ; inline ! could not track child +: NOTE_CHILD HEX: 00000004 ; inline ! am a child process From 309a1c179c6fb745210eb7f92dce8c0a872abcf3 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Fri, 18 Jan 2008 19:43:14 -0500 Subject: [PATCH 032/216] Add stderr stream; more Unix I/O work --- core/io/io.factor | 3 + core/io/streams/c/c.factor | 5 +- extra/io/unix/backend/backend.factor | 8 ++- extra/io/unix/backend/kqueue/kqueue.factor | 83 ++++++++++++++++++++++ extra/io/unix/backend/select/select.factor | 5 +- extra/io/unix/unix.factor | 16 +++-- extra/structs/structs.factor | 1 - extra/unix/unix.factor | 6 ++ vm/io.c | 5 +- vm/run.h | 7 +- 10 files changed, 120 insertions(+), 19 deletions(-) create mode 100644 extra/io/unix/backend/kqueue/kqueue.factor diff --git a/core/io/io.factor b/core/io/io.factor index 0336ffda78..56b284eaaf 100755 --- a/core/io/io.factor +++ b/core/io/io.factor @@ -35,6 +35,9 @@ GENERIC: stream-write-table ( table-cells style stream -- ) ! Default stream SYMBOL: stdio +! Default error stream +SYMBOL: stderr + : close ( -- ) stdio get stream-close ; : readln ( -- str/f ) stdio get stream-readln ; diff --git a/core/io/streams/c/c.factor b/core/io/streams/c/c.factor index 61eea4ba7b..1dfb89f9c9 100755 --- a/core/io/streams/c/c.factor +++ b/core/io/streams/c/c.factor @@ -57,11 +57,12 @@ M: c-reader stream-close M: object init-io ; : stdin 11 getenv ; - : stdout 12 getenv ; +: stderr 38 getenv ; M: object init-stdio - stdin stdout stdio set-global ; + stdin stdout stdio set-global + stderr stderr set-global ; M: object io-multiplex (sleep) ; diff --git a/extra/io/unix/backend/backend.factor b/extra/io/unix/backend/backend.factor index ec73a5395e..f29d71dd86 100755 --- a/extra/io/unix/backend/backend.factor +++ b/extra/io/unix/backend/backend.factor @@ -154,7 +154,7 @@ M: port port-flush ( port -- ) dup buffer-empty? [ drop ] [ (wait-to-write) ] if ; M: unix-io io-multiplex ( ms -- ) - make-timeval unix-io-multiplex ; + unix-io-multiplex ; M: unix-io init-io ( -- ) H{ } clone read-tasks set-global @@ -162,4 +162,8 @@ M: unix-io init-io ( -- ) init-unix-io ; M: unix-io init-stdio ( -- ) - 0 1 handle>duplex-stream io:stdio set-global ; + 0 1 handle>duplex-stream io:stdio set-global + 2 io:stderr set-global ; + +: multiplexer-error ( n -- ) + 0 < [ err_no ignorable-error? [ (io-error) ] unless ] when ; diff --git a/extra/io/unix/backend/kqueue/kqueue.factor b/extra/io/unix/backend/kqueue/kqueue.factor new file mode 100644 index 0000000000..35f2641e00 --- /dev/null +++ b/extra/io/unix/backend/kqueue/kqueue.factor @@ -0,0 +1,83 @@ +! Copyright (C) 2008 Slava Pestov. +! See http://factorcode.org/license.txt for BSD license. +USING: alien.syntax kernel io.nonblocking io.unix.backend +sequences assocs unix unix.kqueue math namespaces ; +IN: io.unix.backend.kqueue + +TUPLE: unix-kqueue-io ; + +! Global variables +SYMBOL: kqueue-fd +SYMBOL: kqueue-changes +SYMBOL: kqueue-events + +: max-events ( -- n ) + #! We read up to 256 events at a time. This is an arbitrary + #! constant... + 256 ; inline + +M: unix-kqueue-io init-unix-io ( -- ) + V{ } clone kqueue-changes set-global + max-events "kevent" kqueue-events set-global + kqueue kqueue-fd dup io-error set-global ; + +: add-change ( event -- ) kqueue-changes get-global push ; + +: io-task-filter ( task -- n ) + class { + { read-task EVFILT_READ } + { accept-task EVFILT_READ } + { receive-task EVFILT_READ } + { write-task EVFILT_WRITE } + { connect-task EVFILT_WRITE } + { send-task EVFILT_WRITE } + } case ; + +: make-kevent ( task -- event ) + "kevent" + over io-task-fd over set-kevent-ident + over io-task-filter over set-kevent-filter ; + +: make-add-kevent ( task -- event ) + make-kevent + EV_ADD over set-kevent-flags ; + +: make-delete-kevent ( task -- event ) + make-kevent + EV_DELETE over set-kevent-flags ; + +M: unix-select-io register-io-task ( task -- ) + make-add-kevent add-change ; + +M: unix-select-io unregister-io-task ( task -- ) + make-delete-kevent add-change ; + +: kqueue-changelist ( -- byte-array n ) + kqueue-changes get-global + dup concat f like over length rot delete-all ; + +: kqueue-eventlist ( -- byte-array n ) + kqueue-events get-global max-events ; + +: do-kevent ( timespec -- n ) + >r + kqueue-fd get-global + kqueue-changelist + kqueue-eventlist + r> kevent dup multiplexer-error ; + +: kevent-task ( kevent -- task ) + dup kevent-filter { + { [ dup EVFILT_READ = ] [ read-tasks ] } + { [ dup EVFILT_WRITE = ] [ write-tasks ] } + } cond get at ; + +: handle-kevents ( n eventlist -- ) + [ kevent-nth kevent-task handle-fd ] curry each ; + +M: unix-select-io unix-io-multiplex ( ms -- ) + make-timespec + do-kevent + kqueue-events get-global handle-kevents ; + +T{ unix-kqueue-io } unix-io-backend set-global diff --git a/extra/io/unix/backend/select/select.factor b/extra/io/unix/backend/select/select.factor index 255010bff6..b132c8b9e8 100644 --- a/extra/io/unix/backend/select/select.factor +++ b/extra/io/unix/backend/select/select.factor @@ -44,9 +44,8 @@ M: unix-select-io register-io-task ( task -- ) drop ; M: unix-select-io unregister-io-task ( task -- ) drop ; M: unix-select-io unix-io-multiplex ( timeval -- ) - >r FD_SETSIZE init-fdsets r> select 0 < [ - err_no ignorable-error? [ (io-error) ] unless - ] when + make-timeval >r FD_SETSIZE init-fdsets r> + select multiplexer-error read-fdset/tasks handle-fdset write-fdset/tasks handle-fdset ; diff --git a/extra/io/unix/unix.factor b/extra/io/unix/unix.factor index 7114f388e0..1c86224433 100755 --- a/extra/io/unix/unix.factor +++ b/extra/io/unix/unix.factor @@ -1,9 +1,11 @@ -USE: io.unix.backend -USE: io.unix.files -USE: io.unix.sockets -USE: io.unix.launcher -USE: io.unix.mmap -USE: io.backend -USE: namespaces +USING: io.unix.backend io.unix.files io.unix.sockets +io.unix.launcher io.unix.mmap io.backend combinators namespaces +system vocabs.loader ; + +{ + { [ macosx? ] [ "io.unix.backend.kqueue" ] } + { [ bsd? ] [ "io.unix.backend.kqueue" ] } + { [ unix? ] [ "io.unix.backend.select" ] } +} cond require T{ unix-io } io-backend set-global diff --git a/extra/structs/structs.factor b/extra/structs/structs.factor index c0792ed317..f54917dc47 100644 --- a/extra/structs/structs.factor +++ b/extra/structs/structs.factor @@ -10,4 +10,3 @@ C-STRUCT: timeval "timeval" [ set-timeval-usec ] keep [ set-timeval-sec ] keep ; - diff --git a/extra/unix/unix.factor b/extra/unix/unix.factor index 94bb598c25..d87e7f885d 100755 --- a/extra/unix/unix.factor +++ b/extra/unix/unix.factor @@ -41,6 +41,12 @@ C-STRUCT: timespec { "time_t" "sec" } { "long" "nsec" } ; +: make-timespec ( ms -- timespec ) + 1000 /mod 1000000 * + "timespec" + [ set-timespec-nsec ] keep + [ set-timespec-usec ] keep ; + ! ! ! Unix constants ! File type diff --git a/vm/io.c b/vm/io.c index bc7d057abf..d3a29abe72 100755 --- a/vm/io.c +++ b/vm/io.c @@ -13,8 +13,9 @@ normal operation. */ void init_c_io(void) { - userenv[IN_ENV] = allot_alien(F,(CELL)stdin); - userenv[OUT_ENV] = allot_alien(F,(CELL)stdout); + userenv[STDIN_ENV] = allot_alien(F,(CELL)stdin); + userenv[STDOUT_ENV] = allot_alien(F,(CELL)stdout); + userenv[STDERR_ENV] = allot_alien(F,(CELL)stderr); } void io_error(void) diff --git a/vm/run.h b/vm/run.h index 6f2caa0c14..976fa36337 100755 --- a/vm/run.h +++ b/vm/run.h @@ -16,8 +16,8 @@ typedef enum { OS_ENV, /* operating system name */ ARGS_ENV = 10, /* command line arguments */ - IN_ENV, /* stdin FILE* handle */ - OUT_ENV, /* stdout FILE* handle */ + STDIN_ENV, /* stdin FILE* handle */ + STDOUT_ENV, /* stdout FILE* handle */ IMAGE_ENV = 13, /* image path name */ EXECUTABLE_ENV, /* runtime executable path name */ @@ -51,6 +51,9 @@ typedef enum { STACK_TRACES_ENV = 36, UNDEFINED_ENV = 37, /* default quotation for undefined words */ + + STDERR_ENV = 38, /* stderr FILE* handle */ + STAGE2_ENV = 39 /* have we bootstrapped? */ } F_ENVTYPE; From d5257e47b14cb1bd77a8a748ca5ff53a2c7fd4a6 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Fri, 18 Jan 2008 19:50:18 -0500 Subject: [PATCH 033/216] Fix circularity --- core/alien/syntax/syntax-docs.factor | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/alien/syntax/syntax-docs.factor b/core/alien/syntax/syntax-docs.factor index 858c3f145e..09169e63b4 100755 --- a/core/alien/syntax/syntax-docs.factor +++ b/core/alien/syntax/syntax-docs.factor @@ -1,5 +1,6 @@ -USING: alien alien.c-types alien.structs alien.syntax -alien.syntax.private help.markup help.syntax ; +IN: alien.syntax +USING: alien alien.c-types alien.structs alien.syntax.private +help.markup help.syntax ; HELP: DLL" { $syntax "DLL\" path\"" } From 670a28477286dc633771d1dbcbc6389a942765ad Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Fri, 18 Jan 2008 19:50:35 -0500 Subject: [PATCH 034/216] Fix stderr --- core/io/streams/c/c-docs.factor | 15 ++++++++++----- core/io/streams/c/c.factor | 10 +++++----- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/core/io/streams/c/c-docs.factor b/core/io/streams/c/c-docs.factor index af8136262a..de8a756f92 100644 --- a/core/io/streams/c/c-docs.factor +++ b/core/io/streams/c/c-docs.factor @@ -14,9 +14,10 @@ ARTICLE: "io.streams.c" "ANSI C streams" { $subsection fclose } { $subsection fgetc } { $subsection fread } -"Two standard file handles:" -{ $subsection stdin } -{ $subsection stdout } ; +"The three standard file handles:" +{ $subsection stdin-handle } +{ $subsection stdout-handle } +{ $subsection stderr-handle } ; ABOUT: "io.streams.c" @@ -64,10 +65,14 @@ HELP: fread ( n alien -- str/f ) { $description "Reads a sequence of characters from a C FILE* handle, and outputs " { $link f } " on end of file." } { $errors "Throws an error if the input operation failed." } ; -HELP: stdin +HELP: stdin-handle { $values { "in" "a C FILE* handle" } } { $description "Outputs the console standard input file handle." } ; -HELP: stdout +HELP: stdout-handle { $values { "out" "a C FILE* handle" } } { $description "Outputs the console standard output file handle." } ; + +HELP: stderr-handle +{ $values { "out" "a C FILE* handle" } } +{ $description "Outputs the console standard error file handle." } ; diff --git a/core/io/streams/c/c.factor b/core/io/streams/c/c.factor index 1dfb89f9c9..d816e08443 100755 --- a/core/io/streams/c/c.factor +++ b/core/io/streams/c/c.factor @@ -56,13 +56,13 @@ M: c-reader stream-close M: object init-io ; -: stdin 11 getenv ; -: stdout 12 getenv ; -: stderr 38 getenv ; +: stdin-handle 11 getenv ; +: stdout-handle 12 getenv ; +: stderr-handle 38 getenv ; M: object init-stdio - stdin stdout stdio set-global - stderr stderr set-global ; + stdin-handle stdout-handle stdio set-global + stderr-handle stderr set-global ; M: object io-multiplex (sleep) ; From 3f5342890e92f3b07ff713c1eea02f95e47fe19c Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Fri, 18 Jan 2008 19:50:48 -0500 Subject: [PATCH 035/216] Fix typo --- extra/unix/unix.factor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extra/unix/unix.factor b/extra/unix/unix.factor index d87e7f885d..16b279765f 100755 --- a/extra/unix/unix.factor +++ b/extra/unix/unix.factor @@ -45,7 +45,7 @@ C-STRUCT: timespec 1000 /mod 1000000 * "timespec" [ set-timespec-nsec ] keep - [ set-timespec-usec ] keep ; + [ set-timespec-sec ] keep ; ! ! ! Unix constants From f138c3675eb7794a198c63c8991d15c8afef7027 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Fri, 18 Jan 2008 19:51:01 -0500 Subject: [PATCH 036/216] Fix typo --- core/kernel/kernel-docs.factor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/kernel/kernel-docs.factor b/core/kernel/kernel-docs.factor index 2301216394..f832742034 100755 --- a/core/kernel/kernel-docs.factor +++ b/core/kernel/kernel-docs.factor @@ -49,7 +49,7 @@ ARTICLE: "basic-combinators" "Basic combinators" { $subsection execute } "These words are used to implement " { $emphasis "combinators" } ", which are words that take code from the stack. Note that combinator definitions must be followed by the " { $link POSTPONE: inline } " declaration in order to compile in the optimizing compiler; for example:" { $code - ": keep ( x quot -- x | quot: x -- )" + ": keep ( x quot -- x )" " over >r call r> ; inline" } "Word inlining is documented in " { $link "declarations" } "." From 8339cb0b4a01447d095797458a464ad3dee2c248 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Fri, 18 Jan 2008 20:28:43 -0500 Subject: [PATCH 037/216] Fix for word renaming --- extra/tools/deploy/shaker/shaker.factor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extra/tools/deploy/shaker/shaker.factor b/extra/tools/deploy/shaker/shaker.factor index d157571757..fd6c79e5ba 100755 --- a/extra/tools/deploy/shaker/shaker.factor +++ b/extra/tools/deploy/shaker/shaker.factor @@ -11,7 +11,7 @@ IN: tools.deploy.shaker : show ( msg -- ) #! Use primitives directly so that we can print stuff even #! after most of the image has been stripped away - "\r\n" append stdout fwrite stdout fflush ; + "\r\n" append stdout-handle fwrite stdout-handle fflush ; : strip-init-hooks ( -- ) "Stripping startup hooks" show From 74329237e6d49522ba0c169ca04039e041d02fff Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Fri, 18 Jan 2008 20:29:43 -0500 Subject: [PATCH 038/216] kqueue work in progress --- extra/io/unix/backend/kqueue/kqueue.factor | 67 +++++++++++++++------- extra/io/unix/unix.factor | 5 +- 2 files changed, 48 insertions(+), 24 deletions(-) diff --git a/extra/io/unix/backend/kqueue/kqueue.factor b/extra/io/unix/backend/kqueue/kqueue.factor index 35f2641e00..287b88c1c3 100644 --- a/extra/io/unix/backend/kqueue/kqueue.factor +++ b/extra/io/unix/backend/kqueue/kqueue.factor @@ -1,14 +1,16 @@ ! Copyright (C) 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: alien.syntax kernel io.nonblocking io.unix.backend -sequences assocs unix unix.kqueue math namespaces ; +USING: alien.c-types kernel io.nonblocking io.unix.backend +io.unix.sockets sequences assocs unix unix.kqueue math +namespaces classes combinators ; IN: io.unix.backend.kqueue TUPLE: unix-kqueue-io ; ! Global variables SYMBOL: kqueue-fd -SYMBOL: kqueue-changes +SYMBOL: kqueue-added +SYMBOL: kqueue-deleted SYMBOL: kqueue-events : max-events ( -- n ) @@ -17,26 +19,43 @@ SYMBOL: kqueue-events 256 ; inline M: unix-kqueue-io init-unix-io ( -- ) - V{ } clone kqueue-changes set-global + H{ } clone kqueue-added set-global + H{ } clone kqueue-deleted set-global max-events "kevent" kqueue-events set-global - kqueue kqueue-fd dup io-error set-global ; + kqueue dup io-error kqueue-fd set-global ; -: add-change ( event -- ) kqueue-changes get-global push ; +M: unix-kqueue-io register-io-task ( task -- ) + dup io-task-fd kqueue-added get-global key? [ drop ] [ + dup io-task-fd kqueue-deleted get-global key? [ + io-task-fd kqueue-deleted get-global delete-at + ] [ + dup io-task-fd kqueue-added get-global set-at + ] if + ] if ; + +M: unix-kqueue-io unregister-io-task ( task -- ) + dup io-task-fd kqueue-deleted get-global key? [ drop ] [ + dup io-task-fd kqueue-added get-global key? [ + io-task-fd kqueue-added get-global delete-at + ] [ + dup io-task-fd kqueue-deleted get-global set-at + ] if + ] if ; : io-task-filter ( task -- n ) class { - { read-task EVFILT_READ } - { accept-task EVFILT_READ } - { receive-task EVFILT_READ } - { write-task EVFILT_WRITE } - { connect-task EVFILT_WRITE } - { send-task EVFILT_WRITE } + { read-task [ EVFILT_READ ] } + { accept-task [ EVFILT_READ ] } + { receive-task [ EVFILT_READ ] } + { write-task [ EVFILT_WRITE ] } + { connect-task [ EVFILT_WRITE ] } + { send-task [ EVFILT_WRITE ] } } case ; : make-kevent ( task -- event ) "kevent" over io-task-fd over set-kevent-ident - over io-task-filter over set-kevent-filter ; + swap io-task-filter over set-kevent-filter ; : make-add-kevent ( task -- event ) make-kevent @@ -46,15 +65,19 @@ M: unix-kqueue-io init-unix-io ( -- ) make-kevent EV_DELETE over set-kevent-flags ; -M: unix-select-io register-io-task ( task -- ) - make-add-kevent add-change ; +: kqueue-additions ( -- kevents ) + kqueue-added get-global + dup clear-assoc values + [ make-add-kevent ] map ; -M: unix-select-io unregister-io-task ( task -- ) - make-delete-kevent add-change ; +: kqueue-deletions ( -- kevents ) + kqueue-deleted get-global + dup clear-assoc values + [ make-delete-kevent ] map ; : kqueue-changelist ( -- byte-array n ) - kqueue-changes get-global - dup concat f like over length rot delete-all ; + kqueue-additions kqueue-deletions append + dup concat f like swap length ; : kqueue-eventlist ( -- byte-array n ) kqueue-events get-global max-events ; @@ -67,15 +90,15 @@ M: unix-select-io unregister-io-task ( task -- ) r> kevent dup multiplexer-error ; : kevent-task ( kevent -- task ) - dup kevent-filter { + dup kevent-ident swap kevent-filter { { [ dup EVFILT_READ = ] [ read-tasks ] } { [ dup EVFILT_WRITE = ] [ write-tasks ] } - } cond get at ; + } cond nip get at ; : handle-kevents ( n eventlist -- ) [ kevent-nth kevent-task handle-fd ] curry each ; -M: unix-select-io unix-io-multiplex ( ms -- ) +M: unix-kqueue-io unix-io-multiplex ( ms -- ) make-timespec do-kevent kqueue-events get-global handle-kevents ; diff --git a/extra/io/unix/unix.factor b/extra/io/unix/unix.factor index 1c86224433..3800008864 100755 --- a/extra/io/unix/unix.factor +++ b/extra/io/unix/unix.factor @@ -3,8 +3,9 @@ io.unix.launcher io.unix.mmap io.backend combinators namespaces system vocabs.loader ; { - { [ macosx? ] [ "io.unix.backend.kqueue" ] } - { [ bsd? ] [ "io.unix.backend.kqueue" ] } + ! kqueue is a work in progress + ! { [ macosx? ] [ "io.unix.backend.kqueue" ] } + ! { [ bsd? ] [ "io.unix.backend.kqueue" ] } { [ unix? ] [ "io.unix.backend.select" ] } } cond require From 827faa205c661af763dd916385330475a2dac8b0 Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Fri, 18 Jan 2008 20:07:41 -0500 Subject: [PATCH 039/216] Alternate solution to Project Euler problem 2 --- extra/project-euler/002/002.factor | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/extra/project-euler/002/002.factor b/extra/project-euler/002/002.factor index 55c1b153cc..b0b21e76e1 100644 --- a/extra/project-euler/002/002.factor +++ b/extra/project-euler/002/002.factor @@ -1,6 +1,6 @@ ! Copyright (c) 2007 Aaron Schaefer. ! See http://factorcode.org/license.txt for BSD license. -USING: kernel math sequences ; +USING: kernel math sequences shuffle ; IN: project-euler.002 ! http://projecteuler.net/index.php?section=problems&id=2 @@ -35,4 +35,18 @@ PRIVATE> ! [ euler002 ] 100 ave-time ! 0 ms run / 0 ms GC ave time - 100 trials -MAIN: euler002 + +! ALTERNATE SOLUTIONS +! ------------------- + +: fib-upto* ( n -- seq ) + 0 1 [ pick over >= ] [ tuck + dup ] [ ] unfold 3nip + 1 head-slice* { 0 1 } swap append ; + +: euler002a ( -- answer ) + 1000000 fib-upto* [ even? ] subset sum ; + +! [ euler002a ] 100 ave-time +! 0 ms run / 0 ms GC ave time - 100 trials + +MAIN: euler002a From 44e9d1fdd098023b6043b0f86c57598c0d00b70e Mon Sep 17 00:00:00 2001 From: Eduardo Cavazos Date: Sat, 19 Jan 2008 05:26:59 -0600 Subject: [PATCH 040/216] Typo in Unit testing docs --- extra/tools/test/test-docs.factor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extra/tools/test/test-docs.factor b/extra/tools/test/test-docs.factor index 48a1192282..32825c965d 100644 --- a/extra/tools/test/test-docs.factor +++ b/extra/tools/test/test-docs.factor @@ -6,7 +6,7 @@ ARTICLE: "tools.test" "Unit testing" $nl "For example, if you were developing a word for computing symbolic derivatives, your unit tests would apply the word to certain input functions, comparing the results against the correct values. While the passing of these tests would not guarantee the algorithm is correct, it would at least ensure that what used to work keeps working, in that as soon as something breaks due to a change in another part of your program, failing tests will let you know." $nl -"Unit tests for a vocabulary are placed in test files, named " { $snippet { $emphasis "vocab" } " -tests.factor" } " alongside " { $snippet { $emphasis "vocab" } ".factor" } "; see " { $link "vocabs.loader" } " for details." +"Unit tests for a vocabulary are placed in test files, named " { $snippet { $emphasis "vocab" } "-tests.factor" } " alongside " { $snippet { $emphasis "vocab" } ".factor" } "; see " { $link "vocabs.loader" } " for details." $nl "If the test harness needs to define words, they should be placed in the " { $snippet "temporary" } " vocabulary so that they can be forgotten after the tests have been run. Test harness files consist mostly of calls to the following two words:" { $subsection unit-test } From 5585815935f7599fc956d6d610f685aee8716fda Mon Sep 17 00:00:00 2001 From: Samuel Tardieu Date: Sat, 19 Jan 2008 14:18:30 +0100 Subject: [PATCH 041/216] Add missing structs dependency needed for Unix bootstraping --- extra/io/unix/backend/select/select.factor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extra/io/unix/backend/select/select.factor b/extra/io/unix/backend/select/select.factor index b132c8b9e8..3c808a278f 100644 --- a/extra/io/unix/backend/select/select.factor +++ b/extra/io/unix/backend/select/select.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2004, 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: alien.syntax kernel io.nonblocking io.unix.backend -bit-arrays sequences assocs unix math namespaces ; +bit-arrays sequences assocs unix math namespaces structs ; IN: io.unix.backend.select TUPLE: unix-select-io ; From e29d665a10b9aab987bb60d0b36ae768c29837d7 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Sat, 19 Jan 2008 10:18:35 -1000 Subject: [PATCH 042/216] fix up misc/factor.sh add bootstrap option fix usage() --- misc/factor.sh | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/misc/factor.sh b/misc/factor.sh index b2cbb836e6..8dca786846 100755 --- a/misc/factor.sh +++ b/misc/factor.sh @@ -237,19 +237,19 @@ maybe_download_dlls() { fi } +get_config_info() { + check_installed_programs + find_build_info + check_libraries +} + bootstrap() { ./$FACTOR_BINARY -i=$BOOT_IMAGE } -usage() { - echo "usage: $0 install|install-x11|update|quick-update" -} - install() { check_factor_exists - check_installed_programs - find_build_info - check_libraries + get_config_info git_clone cd_factor make_factor @@ -259,9 +259,7 @@ install() { } update() { - check_installed_programs - find_build_info - check_libraries + get_config_info git_pull_factorcode make_clean make_factor @@ -288,11 +286,16 @@ install_libraries() { sudo apt-get install libc6-dev libfreetype6-dev libx11-dev xorg-dev glutg3-dev wget git-core git-doc rlwrap } +usage() { + echo "usage: $0 install|install-x11|self-update|quick-update|update|bootstrap" +} + case "$1" in install) install ;; install-x11) install_libraries; install ;; self-update) update; make_boot_image; bootstrap;; quick-update) update; refresh_image ;; update) update; update_bootstrap ;; + bootstrap) get_config_info; bootstrap ;; *) usage ;; esac From 80fcbf2514a18bcead63601948c428bd4964a6f0 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Sat, 19 Jan 2008 10:18:52 -1000 Subject: [PATCH 043/216] add missing use --- extra/io/unix/backend/select/select.factor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extra/io/unix/backend/select/select.factor b/extra/io/unix/backend/select/select.factor index b132c8b9e8..3c808a278f 100644 --- a/extra/io/unix/backend/select/select.factor +++ b/extra/io/unix/backend/select/select.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2004, 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: alien.syntax kernel io.nonblocking io.unix.backend -bit-arrays sequences assocs unix math namespaces ; +bit-arrays sequences assocs unix math namespaces structs ; IN: io.unix.backend.select TUPLE: unix-select-io ; From 3355b075bbd3b5c3f68162e92835bcdffc70686b Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Sat, 19 Jan 2008 15:19:21 -0500 Subject: [PATCH 044/216] Add attribution for alternate solution on PE problem 2 --- extra/project-euler/002/002.factor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extra/project-euler/002/002.factor b/extra/project-euler/002/002.factor index b0b21e76e1..0b8f773887 100644 --- a/extra/project-euler/002/002.factor +++ b/extra/project-euler/002/002.factor @@ -1,4 +1,4 @@ -! Copyright (c) 2007 Aaron Schaefer. +! Copyright (c) 2007 Aaron Schaefer, Alexander Solovyov. ! See http://factorcode.org/license.txt for BSD license. USING: kernel math sequences shuffle ; IN: project-euler.002 From 654574181b0c3e5fd481192cc7c10fdfd44018c4 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Sun, 20 Jan 2008 09:52:50 -0700 Subject: [PATCH 045/216] fix up some old code --- extra/hexdump/hexdump.factor | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/extra/hexdump/hexdump.factor b/extra/hexdump/hexdump.factor index 57bbbe2481..6a91cd65c5 100644 --- a/extra/hexdump/hexdump.factor +++ b/extra/hexdump/hexdump.factor @@ -1,4 +1,6 @@ -USING: arrays io io.streams.string kernel math math.parser namespaces prettyprint sequences splitting strings ; +USING: arrays combinators.lib io io.streams.string +kernel math math.parser namespaces prettyprint +sequences splitting strings ; IN: hexdump hex write "h" write nl ; -: offset. ( lineno -- ) 16 * >hex 8 CHAR: 0 pad-left write "h: " write ; -: h-pad. ( digit -- ) >hex 2 CHAR: 0 pad-left write ; +: offset. ( lineno -- ) + 16 * >hex 8 CHAR: 0 pad-left write "h: " write ; + +: h-pad. ( digit -- ) + >hex 2 CHAR: 0 pad-left write ; + : line. ( str n -- ) offset. dup [ h-pad. " " write ] each - 16 over length - " " concat write + 16 over length - 3 * CHAR: \s write [ dup printable? [ drop CHAR: . ] unless write1 ] each nl ; @@ -19,9 +25,8 @@ PRIVATE> : hexdump ( seq -- str ) [ dup length header. - 16 dup length [ line. ] 2each + 16 [ line. ] each-index ] string-out ; : hexdump. ( seq -- ) hexdump write ; - From ff224b791ef11418e2da35efc1f2431bb8ac6fa8 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sun, 20 Jan 2008 09:23:33 -0800 Subject: [PATCH 046/216] Fix typo in 3keep documentation --- core/kernel/kernel-docs.factor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/kernel/kernel-docs.factor b/core/kernel/kernel-docs.factor index 8f0e4efbd9..47f98a2eb8 100755 --- a/core/kernel/kernel-docs.factor +++ b/core/kernel/kernel-docs.factor @@ -372,7 +372,7 @@ HELP: 2keep { $description "Call a quotation with two values on the stack, restoring the values when the quotation returns." } ; HELP: 3keep -{ $values { "quot" "a quotation with stack effect " { $snippet "( x y -- )" } } { "x" object } { "y" object } { "z" object } } +{ $values { "quot" "a quotation with stack effect " { $snippet "( x y z -- )" } } { "x" object } { "y" object } { "z" object } } { $description "Call a quotation with three values on the stack, restoring the values when the quotation returns." } ; HELP: 2apply From 5e48afda60880cd9835edf6a2a86e612a5fdabb1 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sun, 20 Jan 2008 09:25:49 -0800 Subject: [PATCH 047/216] Add roll and -roll to the set of highlighted shuffle words in the TextMate bundle --- misc/Factor.tmbundle/Syntaxes/Factor.tmLanguage | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/Factor.tmbundle/Syntaxes/Factor.tmLanguage b/misc/Factor.tmbundle/Syntaxes/Factor.tmLanguage index 8df0179fd1..199185c93d 100644 --- a/misc/Factor.tmbundle/Syntaxes/Factor.tmLanguage +++ b/misc/Factor.tmbundle/Syntaxes/Factor.tmLanguage @@ -139,7 +139,7 @@ match - (^|(?<=\s))(drop|2drop|3drop|keep|2keep|3keep|nip|2nip|dup|2dup|3dup|dupd|over|pick|tuck|swap|rot|-rot|slip|2swap|swapd|>r|r>)(\s|$) + (^|(?<=\s))(drop|2drop|3drop|keep|2keep|3keep|nip|2nip|dup|2dup|3dup|dupd|over|pick|tuck|swap|rot|-rot|roll|-roll|slip|2swap|swapd|>r|r>)(\s|$) name keyword.control.stack.factor From c5f0829b095c37385ae16b242db0d1e80d40487c Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sun, 20 Jan 2008 10:08:36 -0800 Subject: [PATCH 048/216] Add call-with and call-with2 to combinators.lib, which act like map-call-with except they do not collect the results into an array --- extra/combinators/lib/lib.factor | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/extra/combinators/lib/lib.factor b/extra/combinators/lib/lib.factor index 9356d6c9b5..0882f3d810 100755 --- a/extra/combinators/lib/lib.factor +++ b/extra/combinators/lib/lib.factor @@ -173,14 +173,24 @@ MACRO: parallel-call ( quots -- ) ! map-call and friends ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +: (make-call-with) ( quots -- quot ) + [ [ keep ] curry ] map concat [ drop ] append ; + +MACRO: call-with ( quots -- ) + (make-call-with) ; + MACRO: map-call-with ( quots -- ) - [ [ [ keep ] curry ] map concat ] keep length [ nip narray ] curry compose ; + [ (make-call-with) ] keep length [ narray ] curry compose ; + +: (make-call-with2) ( quots -- quot ) + [ [ 2dup >r >r ] swap append [ r> r> ] append ] map concat + [ 2drop ] append ; + +MACRO: call-with2 ( quots -- ) + (make-call-with2) ; MACRO: map-call-with2 ( quots -- ) - dup >r - [ [ 2dup >r >r ] swap append [ r> r> ] append ] map concat - [ 2drop ] append - r> length [ narray ] curry append ; + dup >r (make-call-with2) r> length [ narray ] curry append ; MACRO: map-exec-with ( words -- ) [ 1quotation ] map [ map-call-with ] curry ; From 1302a8055d27f3cf14c1d021166811dbe43003ed Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sun, 20 Jan 2008 13:13:04 -0500 Subject: [PATCH 049/216] More kqueue work --- extra/io/unix/backend/kqueue/kqueue.factor | 52 +++++----------------- extra/io/unix/unix.factor | 5 +-- 2 files changed, 13 insertions(+), 44 deletions(-) diff --git a/extra/io/unix/backend/kqueue/kqueue.factor b/extra/io/unix/backend/kqueue/kqueue.factor index 287b88c1c3..226e6c2ec7 100644 --- a/extra/io/unix/backend/kqueue/kqueue.factor +++ b/extra/io/unix/backend/kqueue/kqueue.factor @@ -9,8 +9,6 @@ TUPLE: unix-kqueue-io ; ! Global variables SYMBOL: kqueue-fd -SYMBOL: kqueue-added -SYMBOL: kqueue-deleted SYMBOL: kqueue-events : max-events ( -- n ) @@ -19,29 +17,9 @@ SYMBOL: kqueue-events 256 ; inline M: unix-kqueue-io init-unix-io ( -- ) - H{ } clone kqueue-added set-global - H{ } clone kqueue-deleted set-global max-events "kevent" kqueue-events set-global kqueue dup io-error kqueue-fd set-global ; -M: unix-kqueue-io register-io-task ( task -- ) - dup io-task-fd kqueue-added get-global key? [ drop ] [ - dup io-task-fd kqueue-deleted get-global key? [ - io-task-fd kqueue-deleted get-global delete-at - ] [ - dup io-task-fd kqueue-added get-global set-at - ] if - ] if ; - -M: unix-kqueue-io unregister-io-task ( task -- ) - dup io-task-fd kqueue-deleted get-global key? [ drop ] [ - dup io-task-fd kqueue-added get-global key? [ - io-task-fd kqueue-added get-global delete-at - ] [ - dup io-task-fd kqueue-deleted get-global set-at - ] if - ] if ; - : io-task-filter ( task -- n ) class { { read-task [ EVFILT_READ ] } @@ -57,6 +35,10 @@ M: unix-kqueue-io unregister-io-task ( task -- ) over io-task-fd over set-kevent-ident swap io-task-filter over set-kevent-filter ; +: register-kevent ( task flags -- ) + >r make-kevent r> over set-kevent-flags + kqueue-fd get-global swap 1 f 0 f kevent io-error ; + : make-add-kevent ( task -- event ) make-kevent EV_ADD over set-kevent-flags ; @@ -65,28 +47,16 @@ M: unix-kqueue-io unregister-io-task ( task -- ) make-kevent EV_DELETE over set-kevent-flags ; -: kqueue-additions ( -- kevents ) - kqueue-added get-global - dup clear-assoc values - [ make-add-kevent ] map ; +M: unix-kqueue-io register-io-task ( task -- ) + EV_ADD EV_ENABLE bitor register-kevent ; -: kqueue-deletions ( -- kevents ) - kqueue-deleted get-global - dup clear-assoc values - [ make-delete-kevent ] map ; +M: unix-kqueue-io unregister-io-task ( task -- ) + EV_DELETE EV_DISABLE bitor register-kevent ; -: kqueue-changelist ( -- byte-array n ) - kqueue-additions kqueue-deletions append - dup concat f like swap length ; - -: kqueue-eventlist ( -- byte-array n ) - kqueue-events get-global max-events ; - -: do-kevent ( timespec -- n ) +: wait-kevent ( timespec -- n ) >r kqueue-fd get-global - kqueue-changelist - kqueue-eventlist + f 0 kqueue-events get-global max-events r> kevent dup multiplexer-error ; : kevent-task ( kevent -- task ) @@ -100,7 +70,7 @@ M: unix-kqueue-io unregister-io-task ( task -- ) M: unix-kqueue-io unix-io-multiplex ( ms -- ) make-timespec - do-kevent + wait-kevent kqueue-events get-global handle-kevents ; T{ unix-kqueue-io } unix-io-backend set-global diff --git a/extra/io/unix/unix.factor b/extra/io/unix/unix.factor index 3800008864..1c86224433 100755 --- a/extra/io/unix/unix.factor +++ b/extra/io/unix/unix.factor @@ -3,9 +3,8 @@ io.unix.launcher io.unix.mmap io.backend combinators namespaces system vocabs.loader ; { - ! kqueue is a work in progress - ! { [ macosx? ] [ "io.unix.backend.kqueue" ] } - ! { [ bsd? ] [ "io.unix.backend.kqueue" ] } + { [ macosx? ] [ "io.unix.backend.kqueue" ] } + { [ bsd? ] [ "io.unix.backend.kqueue" ] } { [ unix? ] [ "io.unix.backend.select" ] } } cond require From 7db1b072f8972d7e88c4174401bfb9256488958f Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sun, 20 Jan 2008 17:06:38 -0500 Subject: [PATCH 050/216] epoll() binding --- extra/unix/linux/epoll/epoll.factor | 30 +++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 extra/unix/linux/epoll/epoll.factor diff --git a/extra/unix/linux/epoll/epoll.factor b/extra/unix/linux/epoll/epoll.factor new file mode 100644 index 0000000000..946c387acc --- /dev/null +++ b/extra/unix/linux/epoll/epoll.factor @@ -0,0 +1,30 @@ +! Copyright (C) 2008 Slava Pestov. +! See http://factorcode.org/license.txt for BSD license. +IN: unix.linux.epoll +USING: alien.syntax ; + +FUNCTION: int epoll_create ( int size ) ; + +FUNCTION: int epoll_ctl ( int epfd, int op, int fd, epoll_event* event ) ; + +C-STRUCT: epoll-event + { "uint" "events" } + { "uint" "fd" } ; + +FUNCTION: int epoll_wait ( int epfd, epoll_event* events, int maxevents, int timeout ) ; + +: EPOLL_CTL_ADD 1 ; inline ! Add a file decriptor to the interface. +: EPOLL_CTL_DEL 2 ; inline ! Remove a file decriptor from the interface. +: EPOLL_CTL_MOD 3 ; inline ! Change file decriptor epoll_event structure. + +: EPOLLIN HEX: 001 ; inline +: EPOLLPRI HEX: 002 ; inline +: EPOLLOUT HEX: 004 ; inline +: EPOLLRDNORM HEX: 040 ; inline +: EPOLLRDBAND HEX: 080 ; inline +: EPOLLWRNORM HEX: 100 ; inline +: EPOLLWRBAND HEX: 200 ; inline +: EPOLLMSG HEX: 400 ; inline +: EPOLLERR HEX: 008 ; inline +: EPOLLHUP HEX: 010 ; inline +: EPOLLET 31 2^ ; inline From eb5644ad5f05093fe69c2586ec36232d7b6329f6 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sun, 20 Jan 2008 17:07:18 -0500 Subject: [PATCH 051/216] Unix I/O re-working; nested multiplexer support, use kqueue on *bsd to wait for process completion, start Linux epoll support --- extra/io/unix/backend/backend.factor | 118 +++++++++++---------- extra/io/unix/backend/kqueue/kqueue.factor | 76 ------------- extra/io/unix/backend/select/select.factor | 52 --------- extra/io/unix/bsd/bsd.factor | 29 +++++ extra/io/unix/epoll/epoll.factor | 61 +++++++++++ extra/io/unix/kqueue/kqueue.factor | 90 ++++++++++++++++ extra/io/unix/launcher/launcher.factor | 37 ++++--- extra/io/unix/linux/linux.factor | 17 +++ extra/io/unix/select/select.factor | 47 ++++++++ extra/io/unix/sockets/sockets.factor | 8 +- extra/io/unix/unix.factor | 9 +- extra/unix/process/process.factor | 62 +++++------ 12 files changed, 367 insertions(+), 239 deletions(-) delete mode 100644 extra/io/unix/backend/kqueue/kqueue.factor delete mode 100644 extra/io/unix/backend/select/select.factor create mode 100644 extra/io/unix/bsd/bsd.factor create mode 100644 extra/io/unix/epoll/epoll.factor create mode 100644 extra/io/unix/kqueue/kqueue.factor create mode 100644 extra/io/unix/linux/linux.factor create mode 100644 extra/io/unix/select/select.factor diff --git a/extra/io/unix/backend/backend.factor b/extra/io/unix/backend/backend.factor index f29d71dd86..19856dc6be 100755 --- a/extra/io/unix/backend/backend.factor +++ b/extra/io/unix/backend/backend.factor @@ -7,19 +7,46 @@ continuations system libc qualified namespaces ; QUALIFIED: io IN: io.unix.backend -! Multiplexer protocol -SYMBOL: unix-io-backend +MIXIN: unix-io -HOOK: init-unix-io unix-io-backend ( -- ) -HOOK: register-io-task unix-io-backend ( task -- ) -HOOK: unregister-io-task unix-io-backend ( task -- ) -HOOK: unix-io-multiplex unix-io-backend ( timeval -- ) +! I/O tasks +TUPLE: io-task port callbacks ; -TUPLE: unix-io ; +: io-task-fd io-task-port port-handle ; -! Global variables -SYMBOL: read-tasks -SYMBOL: write-tasks +: ( port continuation class -- task ) + >r 1vector io-task construct-boa r> construct-delegate ; + inline + +GENERIC: do-io-task ( task -- ? ) +GENERIC: io-task-container ( mx task -- hashtable ) + +! I/O multiplexers +TUPLE: mx fd reads writes ; + +: ( -- mx ) f H{ } clone H{ } clone mx construct-boa ; + +: construct-mx ( class -- obj ) swap construct-delegate ; + +GENERIC: register-io-task ( task mx -- ) +GENERIC: unregister-io-task ( task mx -- ) +GENERIC: unix-io-multiplex ( ms mx -- ) + +: fd/container ( task mx -- task fd container ) + over io-task-container >r dup io-task-fd r> ; inline + +: check-io-task ( task mx -- ) + fd/container key? nip [ + "Cannot perform multiple reads from the same port" throw + ] when ; + +M: mx register-io-task ( task mx -- ) + 2dup check-io-task fd/container set-at ; + +: add-io-task ( task -- ) mx get-global register-io-task ; + +M: mx unregister-io-task ( task mx -- ) + fd/container delete-at drop ; ! Some general stuff : file-mode OCT: 0666 ; @@ -52,43 +79,15 @@ M: integer close-handle ( fd -- ) err_no dup ignorable-error? [ 2drop f ] [ strerror swap report-error t ] if ; -! Associates a port with a list of continuations waiting on the -! port to finish I/O -TUPLE: io-task port callbacks ; - -: ( port continuation class -- task ) - >r 1vector io-task construct-boa r> construct-delegate ; - inline - -! Multiplexer -GENERIC: do-io-task ( task -- ? ) -GENERIC: task-container ( task -- vector ) - -: io-task-fd io-task-port port-handle ; - -: check-io-task ( task -- ) - dup io-task-fd swap task-container at [ - "Cannot perform multiple reads from the same port" throw - ] when ; - -: add-io-task ( task -- ) - dup check-io-task - dup register-io-task - dup io-task-fd over task-container set-at ; - -: remove-io-task ( task -- ) - dup io-task-fd over task-container delete-at - unregister-io-task ; - -: pop-callbacks ( task -- ) - dup remove-io-task +: pop-callbacks ( mx task -- ) + dup rot unregister-io-task io-task-callbacks [ schedule-thread ] each ; -: handle-fd ( task -- ) +: handle-io-task ( mx task -- ) dup io-task-port touch-port - dup do-io-task [ pop-callbacks ] [ drop ] if ; + dup do-io-task [ pop-callbacks ] [ 2drop ] if ; -: handle-timeout ( task -- ) +: handle-timeout ( mx task -- ) "Timeout" over io-task-port report-error pop-callbacks ; ! Readers @@ -119,8 +118,7 @@ M: read-task do-io-task io-task-port dup refill [ [ reader-eof ] [ drop ] if ] keep ; -M: read-task task-container - drop read-tasks get-global ; +M: read-task io-task-container drop mx-reads ; M: input-port (wait-to-read) [ add-io-task stop ] callcc0 pending-error ; @@ -139,13 +137,12 @@ M: write-task do-io-task io-task-port dup buffer-empty? over port-error or [ 0 swap buffer-reset t ] [ write-step ] if ; -M: write-task task-container - drop write-tasks get-global ; +M: write-task io-task-container drop mx-writes ; : add-write-io-task ( port continuation -- ) - over port-handle write-tasks get-global at + over port-handle mx get-global mx-writes at* [ io-task-callbacks push drop ] - [ add-io-task ] if* ; + [ drop add-io-task ] if ; : (wait-to-write) ( port -- ) [ add-write-io-task stop ] callcc0 drop ; @@ -154,16 +151,27 @@ M: port port-flush ( port -- ) dup buffer-empty? [ drop ] [ (wait-to-write) ] if ; M: unix-io io-multiplex ( ms -- ) - unix-io-multiplex ; - -M: unix-io init-io ( -- ) - H{ } clone read-tasks set-global - H{ } clone write-tasks set-global - init-unix-io ; + mx get-global unix-io-multiplex ; M: unix-io init-stdio ( -- ) 0 1 handle>duplex-stream io:stdio set-global 2 io:stderr set-global ; +! mx io-task for embedding an fd-based mx inside another mx +TUPLE: mx-port mx ; + +: ( mx -- port ) + dup mx-fd f + mx-port over set-port-type + { set-mx-port-mx set-delegate } mx-port construct ; + +TUPLE: mx-task ; + +: ( port -- task ) + f io-task construct-boa mx-task construct-delegate ; + +M: mx-task do-io-task + io-task-port mx-port-mx 0 swap unix-io-multiplex f ; + : multiplexer-error ( n -- ) 0 < [ err_no ignorable-error? [ (io-error) ] unless ] when ; diff --git a/extra/io/unix/backend/kqueue/kqueue.factor b/extra/io/unix/backend/kqueue/kqueue.factor deleted file mode 100644 index 226e6c2ec7..0000000000 --- a/extra/io/unix/backend/kqueue/kqueue.factor +++ /dev/null @@ -1,76 +0,0 @@ -! Copyright (C) 2008 Slava Pestov. -! See http://factorcode.org/license.txt for BSD license. -USING: alien.c-types kernel io.nonblocking io.unix.backend -io.unix.sockets sequences assocs unix unix.kqueue math -namespaces classes combinators ; -IN: io.unix.backend.kqueue - -TUPLE: unix-kqueue-io ; - -! Global variables -SYMBOL: kqueue-fd -SYMBOL: kqueue-events - -: max-events ( -- n ) - #! We read up to 256 events at a time. This is an arbitrary - #! constant... - 256 ; inline - -M: unix-kqueue-io init-unix-io ( -- ) - max-events "kevent" kqueue-events set-global - kqueue dup io-error kqueue-fd set-global ; - -: io-task-filter ( task -- n ) - class { - { read-task [ EVFILT_READ ] } - { accept-task [ EVFILT_READ ] } - { receive-task [ EVFILT_READ ] } - { write-task [ EVFILT_WRITE ] } - { connect-task [ EVFILT_WRITE ] } - { send-task [ EVFILT_WRITE ] } - } case ; - -: make-kevent ( task -- event ) - "kevent" - over io-task-fd over set-kevent-ident - swap io-task-filter over set-kevent-filter ; - -: register-kevent ( task flags -- ) - >r make-kevent r> over set-kevent-flags - kqueue-fd get-global swap 1 f 0 f kevent io-error ; - -: make-add-kevent ( task -- event ) - make-kevent - EV_ADD over set-kevent-flags ; - -: make-delete-kevent ( task -- event ) - make-kevent - EV_DELETE over set-kevent-flags ; - -M: unix-kqueue-io register-io-task ( task -- ) - EV_ADD EV_ENABLE bitor register-kevent ; - -M: unix-kqueue-io unregister-io-task ( task -- ) - EV_DELETE EV_DISABLE bitor register-kevent ; - -: wait-kevent ( timespec -- n ) - >r - kqueue-fd get-global - f 0 kqueue-events get-global max-events - r> kevent dup multiplexer-error ; - -: kevent-task ( kevent -- task ) - dup kevent-ident swap kevent-filter { - { [ dup EVFILT_READ = ] [ read-tasks ] } - { [ dup EVFILT_WRITE = ] [ write-tasks ] } - } cond nip get at ; - -: handle-kevents ( n eventlist -- ) - [ kevent-nth kevent-task handle-fd ] curry each ; - -M: unix-kqueue-io unix-io-multiplex ( ms -- ) - make-timespec - wait-kevent - kqueue-events get-global handle-kevents ; - -T{ unix-kqueue-io } unix-io-backend set-global diff --git a/extra/io/unix/backend/select/select.factor b/extra/io/unix/backend/select/select.factor deleted file mode 100644 index 3c808a278f..0000000000 --- a/extra/io/unix/backend/select/select.factor +++ /dev/null @@ -1,52 +0,0 @@ -! Copyright (C) 2004, 2008 Slava Pestov. -! See http://factorcode.org/license.txt for BSD license. -USING: alien.syntax kernel io.nonblocking io.unix.backend -bit-arrays sequences assocs unix math namespaces structs ; -IN: io.unix.backend.select - -TUPLE: unix-select-io ; - -! Global variables -SYMBOL: read-fdset -SYMBOL: write-fdset - -M: unix-select-io init-unix-io ( -- ) - FD_SETSIZE 8 * read-fdset set-global - FD_SETSIZE 8 * write-fdset set-global ; - -: handle-fdset ( fdset tasks -- ) - swap [ - swap dup io-task-port timeout? [ - nip handle-timeout - ] [ - tuck io-task-fd swap nth - [ handle-fd ] [ drop ] if - ] if drop - ] curry assoc-each ; - -: init-fdset ( fdset tasks -- ) - swap dup clear-bits - [ >r drop t swap r> set-nth ] curry assoc-each ; - -: read-fdset/tasks - read-fdset get-global read-tasks get-global ; - -: write-fdset/tasks - write-fdset get-global write-tasks get-global ; - -: init-fdsets ( -- read write except ) - read-fdset/tasks dupd init-fdset - write-fdset/tasks dupd init-fdset - f ; - -M: unix-select-io register-io-task ( task -- ) drop ; - -M: unix-select-io unregister-io-task ( task -- ) drop ; - -M: unix-select-io unix-io-multiplex ( timeval -- ) - make-timeval >r FD_SETSIZE init-fdsets r> - select multiplexer-error - read-fdset/tasks handle-fdset - write-fdset/tasks handle-fdset ; - -T{ unix-select-io } unix-io-backend set-global diff --git a/extra/io/unix/bsd/bsd.factor b/extra/io/unix/bsd/bsd.factor new file mode 100644 index 0000000000..8ed84dc305 --- /dev/null +++ b/extra/io/unix/bsd/bsd.factor @@ -0,0 +1,29 @@ +! Copyright (C) 2008 Slava Pestov. +! See http://factorcode.org/license.txt for BSD license. +IN: io.unix.bsd +USING: io.backend io.unix.backend io.unix.kqueue io.unix.select +io.unix.launcher namespaces kernel assocs threads continuations +; + +! On *BSD and Mac OS X, we use select() for the top-level +! multiplexer, and we hang a kqueue off of it but file change +! notification and process exit notification. + +! kqueue is buggy with files and ptys so we can't use it as the +! main multiplexer. + +TUPLE: bsd-io ; + +INSTANCE: bsd-io unix-io + +M: bsd-io init-io ( -- ) + mx set-global + kqueue-mx set-global + kqueue-mx get-global dup io-task-fd + 2dup mx get-global mx-reads set-at + mx get-global mx-writes set-at ; + +M: bsd-io wait-for-process ( pid -- status ) + [ kqueue-mx get-global add-pid-task stop ] curry callcc1 ; + +T{ bsd-io } io-backend set-global diff --git a/extra/io/unix/epoll/epoll.factor b/extra/io/unix/epoll/epoll.factor new file mode 100644 index 0000000000..e39c35aca3 --- /dev/null +++ b/extra/io/unix/epoll/epoll.factor @@ -0,0 +1,61 @@ +! Copyright (C) 2008 Slava Pestov. +! See http://factorcode.org/license.txt for BSD license. +USING: alien.c-types kernel io.nonblocking io.unix.backend +bit-arrays sequences assocs unix math namespaces structs ; +IN: io.unix.epoll + +TUPLE: epoll-mx events ; + +: max-events ( -- n ) + #! We read up to 256 events at a time. This is an arbitrary + #! constant... + 256 ; inline + +: ( -- mx ) + epoll-mx construct-mx + max-events epoll_create dup io-error over set-mx-fd + max-events "epoll-event" over set-epoll-mx-events ; + +: io-task-filter ( task -- n ) + class { + { read-task [ EVFILT_READ ] } + { accept-task [ EVFILT_READ ] } + { receive-task [ EVFILT_READ ] } + { write-task [ EVFILT_WRITE ] } + { connect-task [ EVFILT_WRITE ] } + { send-task [ EVFILT_WRITE ] } + } case ; + +: make-event ( task -- event ) + "epoll-event" + tuck set-epoll-event-events + over io-task-fd over set-epoll-fd ; + +: do-epoll-ctl ( task mx what -- ) + >r >r make-event r> mx-fd r> pick event-data *int roll + epoll_ctl io-error ; + +M: epoll-mx register-io-task ( task mx -- ) + EPOLL_CTL_ADD do-epoll-ctl ; + +M: epoll-mx unregister-io-task ( task mx -- ) + EPOLL_CTL_DEL do-epoll-ctl ; + +: wait-kevent ( mx timeout -- n ) + >r mx-fd epoll-mx-events max-events r> epoll_wait + dup multiplexer-error ; + +: epoll-read-task ( mx fd -- ) + over mx-reads at* [ handle-io-task ] [ 2drop ] if ; + +: epoll-write-task ( mx fd -- ) + over mx-reads at* [ handle-io-task ] [ 2drop ] if ; + +: handle-event ( mx kevent -- ) + epoll-event-fd 2dup epoll-read-task epoll-write-task ; + +: handle-events ( mx n -- ) + [ over epoll-mx-events kevent-nth handle-kevent ] with each ; + +M: epoll-mx unix-io-multiplex ( ms mx -- ) + dup rot wait-kevent handle-kevents ; diff --git a/extra/io/unix/kqueue/kqueue.factor b/extra/io/unix/kqueue/kqueue.factor new file mode 100644 index 0000000000..e1ce7666f1 --- /dev/null +++ b/extra/io/unix/kqueue/kqueue.factor @@ -0,0 +1,90 @@ +! Copyright (C) 2008 Slava Pestov. +! See http://factorcode.org/license.txt for BSD license. +USING: alien.c-types kernel io.nonblocking io.unix.backend +io.unix.sockets sequences assocs unix unix.kqueue unix.process +math namespaces classes combinators threads vectors ; +IN: io.unix.kqueue + +TUPLE: kqueue-mx events processes ; + +: max-events ( -- n ) + #! We read up to 256 events at a time. This is an arbitrary + #! constant... + 256 ; inline + +: ( -- mx ) + kqueue-mx construct-mx + kqueue dup io-error over set-mx-fd + H{ } clone over set-kqueue-mx-processes + max-events "kevent" over set-kqueue-mx-events ; + +: io-task-filter ( task -- n ) + class { + { read-task [ EVFILT_READ ] } + { accept-task [ EVFILT_READ ] } + { receive-task [ EVFILT_READ ] } + { write-task [ EVFILT_WRITE ] } + { connect-task [ EVFILT_WRITE ] } + { send-task [ EVFILT_WRITE ] } + } case ; + +: make-kevent ( task flags -- event ) + "kevent" + tuck set-kevent-flags + over io-task-fd over set-kevent-ident + swap io-task-filter over set-kevent-filter ; + +: register-kevent ( kevent mx -- ) + mx-fd swap 1 f 0 f kevent io-error ; + +M: kqueue-mx register-io-task ( task mx -- ) + over EV_ADD make-kevent over register-kevent + delegate register-io-task ; + +M: kqueue-mx unregister-io-task ( task mx -- ) + 2dup delegate unregister-io-task + swap EV_DELETE make-kevent swap register-kevent ; + +: wait-kevent ( mx timespec -- n ) + >r dup mx-fd f 0 roll kqueue-mx-events max-events r> kevent + dup multiplexer-error ; + +: kevent-read-task ( mx fd -- ) + over mx-reads at handle-io-task ; + +: kevent-write-task ( mx fd -- ) + over mx-reads at handle-io-task ; + +: kevent-proc-task ( mx pid -- ) + dup (wait-for-pid) spin kqueue-mx-processes delete-at* [ + [ schedule-thread-with ] with each + ] [ 2drop ] if ; + +: handle-kevent ( mx kevent -- ) + dup kevent-ident swap kevent-filter { + { [ dup EVFILT_READ = ] [ drop kevent-read-task ] } + { [ dup EVFILT_WRITE = ] [ drop kevent-write-task ] } + { [ dup EVFILT_PROC = ] [ drop kevent-proc-task ] } + } cond ; + +: handle-kevents ( mx n -- ) + [ over kqueue-mx-events kevent-nth handle-kevent ] with each ; + +M: kqueue-mx unix-io-multiplex ( ms mx -- ) + swap make-timespec dupd wait-kevent handle-kevents ; + +: make-proc-kevent ( pid -- kevent ) + "kevent" + tuck set-kevent-ident + EV_ADD over set-kevent-flags + EVFILT_PROC over set-kevent-filter + NOTE_EXIT over set-kevent-fflags ; + +: add-pid-task ( continuation pid mx -- ) + 2dup kqueue-mx-processes at* [ + 2nip push + ] [ + drop + over make-proc-kevent over register-kevent + >r >r 1vector r> r> kqueue-mx-processes set-at + ] if ; diff --git a/extra/io/unix/launcher/launcher.factor b/extra/io/unix/launcher/launcher.factor index 74bced16c4..adf571a8b7 100755 --- a/extra/io/unix/launcher/launcher.factor +++ b/extra/io/unix/launcher/launcher.factor @@ -1,14 +1,18 @@ -! Copyright (C) 2007 Slava Pestov. +! Copyright (C) 2007, 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: io io.launcher io.unix.backend io.nonblocking -sequences kernel namespaces math system alien.c-types -debugger continuations arrays assocs combinators unix.process +USING: io io.backend io.launcher io.unix.backend io.nonblocking +sequences kernel namespaces math system alien.c-types debugger +continuations arrays assocs combinators unix.process parser-combinators memoize promises strings ; IN: io.unix.launcher ! Search unix first USE: unix +HOOK: wait-for-process io-backend ( pid -- status ) + +M: unix-io wait-for-process ( pid -- status ) wait-for-pid ; + ! Our command line parser. Supported syntax: ! foo bar baz -- simple tokens ! foo\ bar -- escaping the space @@ -44,28 +48,26 @@ MEMO: 'arguments' ( -- parser ) : (spawn-process) ( -- ) [ - pass-environment? [ - get-arguments get-environment assoc>env exec-args-with-env - ] [ - get-arguments exec-args-with-path - ] if io-error + get-arguments + pass-environment? + [ get-environment assoc>env exec-args-with-env ] + [ exec-args-with-path ] if + io-error ] [ error. :c flush ] recover 1 exit ; -: wait-for-process ( pid -- ) - 0 0 waitpid drop ; - : spawn-process ( -- pid ) [ (spawn-process) ] [ ] with-fork ; : spawn-detached ( -- ) - [ spawn-process 0 exit ] [ ] with-fork wait-for-process ; + [ spawn-process 0 exit ] [ ] with-fork + wait-for-process drop ; M: unix-io run-process* ( desc -- ) [ +detached+ get [ spawn-detached ] [ - spawn-process wait-for-process + spawn-process wait-for-process drop ] if ] with-descriptor ; @@ -85,15 +87,16 @@ M: unix-io run-process* ( desc -- ) -rot 2dup second close first close ] with-fork first swap second rot ; -TUPLE: pipe-stream pid ; +TUPLE: pipe-stream pid status ; : ( in out pid -- stream ) - pipe-stream construct-boa + f pipe-stream construct-boa -rot handle>duplex-stream over set-delegate ; M: pipe-stream stream-close dup delegate stream-close - pipe-stream-pid wait-for-process ; + dup pipe-stream-pid wait-for-process + swap set-pipe-stream-status ; M: unix-io process-stream* [ spawn-process-stream ] with-descriptor ; diff --git a/extra/io/unix/linux/linux.factor b/extra/io/unix/linux/linux.factor new file mode 100644 index 0000000000..180e81e30a --- /dev/null +++ b/extra/io/unix/linux/linux.factor @@ -0,0 +1,17 @@ +! Copyright (C) 2008 Slava Pestov. +! See http://factorcode.org/license.txt for BSD license. +IN: io.unix.linux +USING: io.unix.backend io.unix.select namespaces kernel assocs ; + +TUPLE: linux-io ; + +INSTANCE: linux-io unix-io + +M: linux-io init-io ( -- ) + start-wait-loop + mx set-global ; + +M: linux-io wait-for-pid ( pid -- status ) + [ kqueue-mx get-global add-pid-task stop ] curry callcc1 ; + +T{ linux-io } io-backend set-global diff --git a/extra/io/unix/select/select.factor b/extra/io/unix/select/select.factor new file mode 100644 index 0000000000..e74324f3b6 --- /dev/null +++ b/extra/io/unix/select/select.factor @@ -0,0 +1,47 @@ +! Copyright (C) 2004, 2008 Slava Pestov. +! See http://factorcode.org/license.txt for BSD license. +USING: alien.c-types kernel io.nonblocking io.unix.backend +bit-arrays sequences assocs unix math namespaces structs ; +IN: io.unix.select + +TUPLE: select-mx read-fdset write-fdset ; + +! Factor's bit-arrays are an array of bytes, OS X expects +! FD_SET to be an array of cells, so we have to account for +! byte order differences on big endian platforms +: little-endian? 1 *char 1 = ; foldable + +: munge ( i -- i' ) + little-endian? [ BIN: 11000 bitxor ] unless ; inline + +: ( -- mx ) + select-mx construct-mx + FD_SETSIZE 8 * over set-select-mx-read-fdset + FD_SETSIZE 8 * over set-select-mx-write-fdset ; + +: handle-fd ( fd task fdset mx -- ) + roll munge rot nth [ swap handle-io-task ] [ 2drop ] if ; + +: handle-fdset ( tasks fdset mx -- ) + [ handle-fd ] 2curry assoc-each ; + +: init-fdset ( tasks fdset -- ) + dup clear-bits + [ >r drop t swap munge r> set-nth ] curry assoc-each ; + +: read-fdset/tasks + { mx-reads select-mx-read-fdset } get-slots ; + +: write-fdset/tasks + { mx-writes select-mx-write-fdset } get-slots ; + +: init-fdsets ( mx -- read write except ) + [ read-fdset/tasks tuck init-fdset ] keep + write-fdset/tasks tuck init-fdset + f ; + +M: select-mx unix-io-multiplex ( ms mx -- ) + swap >r FD_SETSIZE over init-fdsets r> make-timeval + select multiplexer-error + dup read-fdset/tasks pick handle-fdset + dup write-fdset/tasks rot handle-fdset ; diff --git a/extra/io/unix/sockets/sockets.factor b/extra/io/unix/sockets/sockets.factor index 30d3bbd94c..81c0e50b42 100644 --- a/extra/io/unix/sockets/sockets.factor +++ b/extra/io/unix/sockets/sockets.factor @@ -40,7 +40,7 @@ M: connect-task do-io-task io-task-port dup port-handle f 0 write 0 < [ defer-error ] [ drop t ] if ; -M: connect-task task-container drop write-tasks get-global ; +M: connect-task io-task-container drop mx-writes ; : wait-to-connect ( port -- ) [ add-io-task stop ] callcc0 drop ; @@ -70,7 +70,7 @@ TUPLE: accept-task ; : ( port continuation -- task ) accept-task ; -M: accept-task task-container drop read-tasks get ; +M: accept-task io-task-container drop mx-reads ; : accept-sockaddr ( port -- fd sockaddr ) dup port-handle swap server-port-addr sockaddr-type @@ -152,7 +152,7 @@ M: receive-task do-io-task 2drop defer-error ] if ; -M: receive-task task-container drop read-tasks get ; +M: receive-task io-task-container drop mx-reads ; : wait-receive ( stream -- ) [ add-io-task stop ] callcc0 drop ; @@ -185,7 +185,7 @@ M: send-task do-io-task [ send-task-len do-send ] keep swap 0 < [ io-task-port defer-error ] [ drop t ] if ; -M: send-task task-container drop write-tasks get ; +M: send-task io-task-container drop mx-writes ; : wait-send ( packet sockaddr len stream -- ) [ add-io-task stop ] callcc0 2drop 2drop ; diff --git a/extra/io/unix/unix.factor b/extra/io/unix/unix.factor index 1c86224433..d6d0a9cc22 100755 --- a/extra/io/unix/unix.factor +++ b/extra/io/unix/unix.factor @@ -3,9 +3,8 @@ io.unix.launcher io.unix.mmap io.backend combinators namespaces system vocabs.loader ; { - { [ macosx? ] [ "io.unix.backend.kqueue" ] } - { [ bsd? ] [ "io.unix.backend.kqueue" ] } - { [ unix? ] [ "io.unix.backend.select" ] } + { [ bsd? ] [ "io.unix.bsd" ] } + { [ macosx? ] [ "io.unix.bsd" ] } + { [ linux? ] [ "io.unix.backend.linux" ] } + { [ solaris? ] [ "io.unix.backend.solaris" ] } } cond require - -T{ unix-io } io-backend set-global diff --git a/extra/unix/process/process.factor b/extra/unix/process/process.factor index a99611aba6..b2877dc4a1 100644 --- a/extra/unix/process/process.factor +++ b/extra/unix/process/process.factor @@ -1,53 +1,55 @@ - -USING: kernel alien.c-types sequences math unix combinators.cleave ; +USING: kernel alien.c-types sequences math unix +combinators.cleave vectors kernel namespaces continuations +threads assocs vectors ; IN: unix.process -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! Low-level Unix process launching utilities. These are used +! to implement io.launcher on Unix. User code should use +! io.launcher instead. : >argv ( seq -- alien ) [ malloc-char-string ] map f add >c-void*-array ; -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - : exec ( pathname argv -- int ) - [ malloc-char-string ] [ >argv ] bi* execv ; + [ malloc-char-string ] [ >argv ] bi* execv ; : exec-with-path ( filename argv -- int ) - [ malloc-char-string ] [ >argv ] bi* execvp ; + [ malloc-char-string ] [ >argv ] bi* execvp ; : exec-with-env ( filename argv envp -- int ) - [ malloc-char-string ] [ >argv ] [ >argv ] tri* execve ; + [ malloc-char-string ] [ >argv ] [ >argv ] tri* execve ; -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +: exec-args ( seq -- int ) + [ first ] [ ] bi exec ; -: exec-args ( seq -- int ) [ first ] [ ] bi exec ; -: exec-args-with-path ( seq -- int ) [ first ] [ ] bi exec-with-path ; +: exec-args-with-path ( seq -- int ) + [ first ] [ ] bi exec-with-path ; -: exec-args-with-env ( seq seq -- int ) >r [ first ] [ ] bi r> exec-with-env ; +: exec-args-with-env ( seq seq -- int ) + >r [ first ] [ ] bi r> exec-with-env ; -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +: with-fork ( child parent -- ) + fork dup zero? -roll swap curry if ; inline -: with-fork ( child parent -- ) fork dup zero? -roll swap curry if ; inline - -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -USING: kernel alien.c-types namespaces continuations threads assocs unix - combinators.cleave ; +! Lame polling strategy for getting process exit codes. On +! BSD, we use kqueue which is more efficient. SYMBOL: pid-wait -! KEY | VALUE -! ----------- -! pid | continuation +: (wait-for-pid) ( pid -- status ) + 0 [ 0 waitpid drop ] keep *int ; -: init-pid-wait ( -- ) H{ } clone pid-wait set-global ; - -: wait-for-pid ( pid -- status ) [ pid-wait get set-at stop ] curry callcc1 ; +: wait-for-pid ( pid -- status ) + [ pid-wait get-global [ ?push ] change-at stop ] curry + callcc1 ; : wait-loop ( -- ) - -1 0 tuck WNOHANG waitpid ! &status return - [ *int ] [ pid-wait get delete-at* drop ] bi* ! status ? - dup [ schedule-thread-with ] [ 2drop ] if - 250 sleep wait-loop ; + -1 0 tuck WNOHANG waitpid ! &status return + [ *int ] [ pid-wait get delete-at* drop ] bi* ! status ? + [ schedule-thread-with ] with each + 250 sleep + wait-loop ; -: start-wait-loop ( -- ) init-pid-wait [ wait-loop ] in-thread ; \ No newline at end of file +: start-wait-loop ( -- ) + H{ } clone pid-wait set-global + [ wait-loop ] in-thread ; \ No newline at end of file From 6812eac271fa5beea592ef9630e5371f4e3ca168 Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Sun, 20 Jan 2008 19:20:28 -0500 Subject: [PATCH 052/216] Solution to Project Euler problem 30 --- extra/project-euler/030/030.factor | 46 ++++++++++++++++++++++++ extra/project-euler/common/common.factor | 2 +- extra/project-euler/project-euler.factor | 4 +-- 3 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 extra/project-euler/030/030.factor diff --git a/extra/project-euler/030/030.factor b/extra/project-euler/030/030.factor new file mode 100644 index 0000000000..854b7ca5ca --- /dev/null +++ b/extra/project-euler/030/030.factor @@ -0,0 +1,46 @@ +! Copyright (c) 2007 Aaron Schaefer. +! See http://factorcode.org/license.txt for BSD license. +USING: combinators.lib kernel math math.functions project-euler.common sequences ; +IN: project-euler.030 + +! http://projecteuler.net/index.php?section=problems&id=30 + +! DESCRIPTION +! ----------- + +! Surprisingly there are only three numbers that can be written as the sum of +! fourth powers of their digits: + +! 1634 = 1^4 + 6^4 + 3^4 + 4^4 +! 8208 = 8^4 + 2^4 + 0^4 + 8^4 +! 9474 = 9^4 + 4^4 + 7^4 + 4^4 + +! As 1 = 1^4 is not a sum it is not included. + +! The sum of these numbers is 1634 + 8208 + 9474 = 19316. + +! Find the sum of all the numbers that can be written as the sum of fifth +! powers of their digits. + + +! SOLUTION +! -------- + +! if n is the number of digits +! n * 9^5 = 10^n when n ≈ 5.513 +! 10^5.513 ≈ 325537 + +digits [ 5 ^ ] sigma ; + +PRIVATE> + +: euler030 ( -- answer ) + 325537 [ dup sum-fifth-powers = ] subset sum 1- ; + +! [ euler030 ] 100 ave-time +! 2537 ms run / 125 ms GC ave time - 100 trials + +MAIN: euler030 diff --git a/extra/project-euler/common/common.factor b/extra/project-euler/common/common.factor index d21a780773..c875a440ba 100644 --- a/extra/project-euler/common/common.factor +++ b/extra/project-euler/common/common.factor @@ -11,7 +11,7 @@ IN: project-euler.common ! collect-consecutive - #8, #11 ! log10 - #25, #134 ! max-path - #18, #67 -! number>digits - #16, #20 +! number>digits - #16, #20, #30 ! propagate-all - #18, #67 ! sum-proper-divisors - #21 ! tau* - #12 diff --git a/extra/project-euler/project-euler.factor b/extra/project-euler/project-euler.factor index 513eeba020..329a1b9668 100644 --- a/extra/project-euler/project-euler.factor +++ b/extra/project-euler/project-euler.factor @@ -9,8 +9,8 @@ USING: definitions io io.files kernel math.parser sequences vocabs project-euler.017 project-euler.018 project-euler.019 project-euler.020 project-euler.021 project-euler.022 project-euler.023 project-euler.024 project-euler.025 project-euler.026 project-euler.027 project-euler.028 - project-euler.029 project-euler.067 project-euler.134 project-euler.169 - project-euler.173 project-euler.175 ; + project-euler.029 project-euler.030 project-euler.067 project-euler.134 + project-euler.169 project-euler.173 project-euler.175 ; IN: project-euler Date: Sun, 20 Jan 2008 18:59:47 -0600 Subject: [PATCH 053/216] start windows file change code --- extra/io/windows/directory/directory.factor | 34 +++++++++++++++++++++ extra/io/windows/nt/backend/backend.factor | 6 +++- 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 extra/io/windows/directory/directory.factor diff --git a/extra/io/windows/directory/directory.factor b/extra/io/windows/directory/directory.factor new file mode 100644 index 0000000000..4728a063a0 --- /dev/null +++ b/extra/io/windows/directory/directory.factor @@ -0,0 +1,34 @@ +USING: alien.c-types destructors io.windows +io.windows.nt.backend kernel math windows +windows.kernel32 windows.types libc ; +IN: io.windows.directory + +: open-directory ( path -- handle ) + [ + FILE_LIST_DIRECTORY + share-mode + f + OPEN_EXISTING + FILE_FLAG_BACKUP_SEMANTICS FILE_FLAG_OVERLAPPED bitor + f + CreateFile + dup invalid-handle? dup close-later + dup add-completion + ] with-destructors ; + +: directory-notifications ( -- n ) + FILE_NOTIFY_CHANGE_FILE_NAME FILE_NOTIFY_CHANGE_DIR_NAME bitor ; + +: read-directory-changes ( handle -- ) + [ + 65536 dup malloc + swap + TRUE + directory-notifications + 0 + (make-overlapped) + ! f works here, blocking + f + ReadDirectoryChangesW win32-error=0/f + ] with-destructors ; + diff --git a/extra/io/windows/nt/backend/backend.factor b/extra/io/windows/nt/backend/backend.factor index 0d1f2cec0b..c107c36b5a 100755 --- a/extra/io/windows/nt/backend/backend.factor +++ b/extra/io/windows/nt/backend/backend.factor @@ -132,7 +132,11 @@ M: windows-nt-io add-completion ( handle -- ) ] if ] if ] [ - lookup-callback io-callback-continuation + lookup-callback [ + io-callback-continuation + ] [ + "unhandled io event" print flush f + ] if* ] if ; : maybe-expire ( io-callbck -- ) From a06b67baa7e11e6ccfe85403246b5f6042b1b950 Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Sun, 20 Jan 2008 22:30:58 -0500 Subject: [PATCH 054/216] Solution to Project Euler problem 31 --- extra/project-euler/031/031.factor | 63 ++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 extra/project-euler/031/031.factor diff --git a/extra/project-euler/031/031.factor b/extra/project-euler/031/031.factor new file mode 100644 index 0000000000..b4402d8904 --- /dev/null +++ b/extra/project-euler/031/031.factor @@ -0,0 +1,63 @@ +! Copyright (c) 2007 Aaron Schaefer. +! See http://factorcode.org/license.txt for BSD license. +USING: kernel math ; +IN: project-euler.031 + +! http://projecteuler.net/index.php?section=problems&id=31 + +! DESCRIPTION +! ----------- + +! In England the currency is made up of pound, £, and pence, p, and there are +! eight coins in general circulation: + +! 1p, 2p, 5p, 10p, 20p, 50p, £1 (100p) and £2 (200p). + +! It is possible to make £2 in the following way: + +! 1×£1 + 1×50p + 2×20p + 1×5p + 1×2p + 3×1p + +! How many different ways can £2 be made using any number of coins? + + + +! SOLUTION +! -------- + += [ [ 2 - 2p ] keep 1p + ] [ drop 0 ] if ; + +: 5p ( m -- n ) + dup 0 >= [ [ 5 - 5p ] keep 2p + ] [ drop 0 ] if ; + +: 10p ( m -- n ) + dup 0 >= [ [ 10 - 10p ] keep 5p + ] [ drop 0 ] if ; + +: 20p ( m -- n ) + dup 0 >= [ [ 20 - 20p ] keep 10p + ] [ drop 0 ] if ; + +: 50p ( m -- n ) + dup 0 >= [ [ 50 - 50p ] keep 20p + ] [ drop 0 ] if ; + +: 100p ( m -- n ) + dup 0 >= [ [ 100 - 100p ] keep 50p + ] [ drop 0 ] if ; + +: 200p ( m -- n ) + dup 0 >= [ [ 200 - 200p ] keep 100p + ] [ drop 0 ] if ; + +PRIVATE> + +: euler031 ( -- answer ) + 200 200p ; + +! [ euler031 ] 100 ave-time +! 4 ms run / 0 ms GC ave time - 100 trials + +! TODO: generalize to eliminate duplication; use a sequence to specify denominations? + +MAIN: euler031 From feb4e8df9e0d5159cbe68dd85754d769ec0605b4 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Mon, 21 Jan 2008 15:33:37 -0500 Subject: [PATCH 055/216] Fix typo --- core/math/math-docs.factor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/math/math-docs.factor b/core/math/math-docs.factor index 307a5531a1..1ec3592c79 100755 --- a/core/math/math-docs.factor +++ b/core/math/math-docs.factor @@ -209,7 +209,7 @@ HELP: bitxor HELP: shift { $values { "x" integer } { "n" integer } { "y" integer } } -{ $description "Shifts " { $snippet "x" } " to the left by " { $snippet "y" } " bits if " { $snippet "y" } " is positive, or " { $snippet "-y" } " bits to the right if " { $snippet "y" } " is negative. A left shift of a fixnum may overflow, yielding a bignum. A right shift may result in bits ``falling off'' the right hand side and being discarded." } +{ $description "Shifts " { $snippet "x" } " to the left by " { $snippet "n" } " bits if " { $snippet "n" } " is positive, or " { $snippet "-n" } " bits to the right if " { $snippet "n" } " is negative. A left shift of a fixnum may overflow, yielding a bignum. A right shift may result in bits ``falling off'' the right hand side and being discarded." } { $examples { $example "BIN: 101 5 shift .b" "10100000" } { $example "BIN: 11111 -2 shift .b" "111" } } ; HELP: bitnot From c1963dd4abd6566550c18edc73268898ca366fce Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Mon, 21 Jan 2008 15:33:43 -0500 Subject: [PATCH 056/216] I/O cleanups --- extra/io/nonblocking/nonblocking-docs.factor | 2 +- extra/io/nonblocking/nonblocking.factor | 30 +++++++++---------- extra/io/sniffer/bsd/bsd.factor | 2 +- extra/io/unix/backend/backend.factor | 31 +++++++++++++------- extra/io/unix/epoll/epoll.factor | 18 +++++------- extra/io/unix/kqueue/kqueue.factor | 20 +++++-------- extra/io/unix/select/select.factor | 2 +- extra/io/unix/sockets/sockets.factor | 21 ++++--------- extra/io/windows/ce/sockets/sockets.factor | 4 +-- extra/io/windows/nt/sockets/sockets.factor | 4 +-- 10 files changed, 62 insertions(+), 72 deletions(-) diff --git a/extra/io/nonblocking/nonblocking-docs.factor b/extra/io/nonblocking/nonblocking-docs.factor index 049c3bf497..c4adc3aa38 100644 --- a/extra/io/nonblocking/nonblocking-docs.factor +++ b/extra/io/nonblocking/nonblocking-docs.factor @@ -55,7 +55,7 @@ HELP: init-handle { $contract "Prepares a native handle for use by the port; called by " { $link } "." } ; HELP: -{ $values { "handle" "a native handle identifying an I/O resource" } { "buffer" "a " { $link buffer } " or " { $link f } } { "port" "a new " { $link port } } } +{ $values { "handle" "a native handle identifying an I/O resource" } { "buffer" "a " { $link buffer } " or " { $link f } } { "type" symbol } { "port" "a new " { $link port } } } { $description "Creates a new " { $link port } " using the specified native handle and I/O buffer." } $low-level-note ; diff --git a/extra/io/nonblocking/nonblocking.factor b/extra/io/nonblocking/nonblocking.factor index 9ff21aa011..9839cc7066 100755 --- a/extra/io/nonblocking/nonblocking.factor +++ b/extra/io/nonblocking/nonblocking.factor @@ -12,38 +12,36 @@ SYMBOL: default-buffer-size ! Common delegate of native stream readers and writers TUPLE: port handle error timeout cutoff type eof? ; -SYMBOL: input -SYMBOL: output SYMBOL: closed -PREDICATE: port input-port port-type input eq? ; -PREDICATE: port output-port port-type output eq? ; +PREDICATE: port input-port port-type input-port eq? ; +PREDICATE: port output-port port-type output-port eq? ; GENERIC: init-handle ( handle -- ) GENERIC: close-handle ( handle -- ) -: ( handle buffer -- port ) - over init-handle +: ( handle buffer type -- port ) + pick init-handle 0 0 { set-port-handle set-delegate + set-port-type set-port-timeout set-port-cutoff } port construct ; -: ( handle -- port ) - default-buffer-size get ; +: ( handle type -- port ) + default-buffer-size get swap ; : ( handle -- stream ) - input over set-port-type ; + input-port ; : ( handle -- stream ) - output over set-port-type ; + output-port ; : handle>duplex-stream ( in-handle out-handle -- stream ) - [ >r r> ] - [ ] [ stream-close ] + [ >r r> ] [ ] [ stream-close ] cleanup ; : touch-port ( port -- ) @@ -170,8 +168,8 @@ M: port stream-close TUPLE: server-port addr client ; -: ( port addr -- server ) - server-port pick set-port-type +: ( handle addr -- server ) + >r f server-port r> { set-delegate set-server-port-addr } server-port construct ; @@ -180,8 +178,8 @@ TUPLE: server-port addr client ; TUPLE: datagram-port addr packet packet-addr ; -: ( port addr -- datagram ) - datagram-port pick set-port-type +: ( handle addr -- datagram ) + >r f datagram-port r> { set-delegate set-datagram-port-addr } datagram-port construct ; diff --git a/extra/io/sniffer/bsd/bsd.factor b/extra/io/sniffer/bsd/bsd.factor index 5c32bd78d2..ae87c05d38 100644 --- a/extra/io/sniffer/bsd/bsd.factor +++ b/extra/io/sniffer/bsd/bsd.factor @@ -83,7 +83,7 @@ M: unix-io ( obj -- sniffer ) ] keep dupd sniffer-spec-ifname ioctl-sniffer-fd dup make-ioctl-buffer - input over set-port-type + input-port \ sniffer construct-delegate ] with-destructors ; diff --git a/extra/io/unix/backend/backend.factor b/extra/io/unix/backend/backend.factor index 19856dc6be..6da26b5b67 100755 --- a/extra/io/unix/backend/backend.factor +++ b/extra/io/unix/backend/backend.factor @@ -18,19 +18,33 @@ TUPLE: io-task port callbacks ; >r 1vector io-task construct-boa r> construct-delegate ; inline +TUPLE: input-task ; + +: ( port continuation class -- task ) + >r input-task r> construct-delegate ; inline + +TUPLE: output-task ; + +: ( port continuation class -- task ) + >r output-task r> construct-delegate ; inline + GENERIC: do-io-task ( task -- ? ) GENERIC: io-task-container ( mx task -- hashtable ) ! I/O multiplexers TUPLE: mx fd reads writes ; +M: input-task io-task-container drop mx-reads ; + +M: output-task io-task-container drop mx-writes ; + : ( -- mx ) f H{ } clone H{ } clone mx construct-boa ; : construct-mx ( class -- obj ) swap construct-delegate ; GENERIC: register-io-task ( task mx -- ) GENERIC: unregister-io-task ( task mx -- ) -GENERIC: unix-io-multiplex ( ms mx -- ) +GENERIC: wait-for-events ( ms mx -- ) : fd/container ( task mx -- task fd container ) over io-task-container >r dup io-task-fd r> ; inline @@ -112,14 +126,12 @@ M: integer close-handle ( fd -- ) TUPLE: read-task ; : ( port continuation -- task ) - read-task ; + read-task ; M: read-task do-io-task io-task-port dup refill [ [ reader-eof ] [ drop ] if ] keep ; -M: read-task io-task-container drop mx-reads ; - M: input-port (wait-to-read) [ add-io-task stop ] callcc0 pending-error ; @@ -131,14 +143,12 @@ M: input-port (wait-to-read) TUPLE: write-task ; : ( port continuation -- task ) - write-task ; + write-task ; M: write-task do-io-task io-task-port dup buffer-empty? over port-error or [ 0 swap buffer-reset t ] [ write-step ] if ; -M: write-task io-task-container drop mx-writes ; - : add-write-io-task ( port continuation -- ) over port-handle mx get-global mx-writes at* [ io-task-callbacks push drop ] @@ -151,7 +161,7 @@ M: port port-flush ( port -- ) dup buffer-empty? [ drop ] [ (wait-to-write) ] if ; M: unix-io io-multiplex ( ms -- ) - mx get-global unix-io-multiplex ; + mx get-global wait-for-events ; M: unix-io init-stdio ( -- ) 0 1 handle>duplex-stream io:stdio set-global @@ -161,8 +171,7 @@ M: unix-io init-stdio ( -- ) TUPLE: mx-port mx ; : ( mx -- port ) - dup mx-fd f - mx-port over set-port-type + dup mx-fd f mx-port { set-mx-port-mx set-delegate } mx-port construct ; TUPLE: mx-task ; @@ -171,7 +180,7 @@ TUPLE: mx-task ; f io-task construct-boa mx-task construct-delegate ; M: mx-task do-io-task - io-task-port mx-port-mx 0 swap unix-io-multiplex f ; + io-task-port mx-port-mx 0 swap wait-for-events f ; : multiplexer-error ( n -- ) 0 < [ err_no ignorable-error? [ (io-error) ] unless ] when ; diff --git a/extra/io/unix/epoll/epoll.factor b/extra/io/unix/epoll/epoll.factor index e39c35aca3..f2230f6e81 100644 --- a/extra/io/unix/epoll/epoll.factor +++ b/extra/io/unix/epoll/epoll.factor @@ -16,19 +16,15 @@ TUPLE: epoll-mx events ; max-events epoll_create dup io-error over set-mx-fd max-events "epoll-event" over set-epoll-mx-events ; -: io-task-filter ( task -- n ) - class { - { read-task [ EVFILT_READ ] } - { accept-task [ EVFILT_READ ] } - { receive-task [ EVFILT_READ ] } - { write-task [ EVFILT_WRITE ] } - { connect-task [ EVFILT_WRITE ] } - { send-task [ EVFILT_WRITE ] } - } case ; +GENERIC: io-task-events ( task -- n ) + +M: input-task drop EPOLLIN ; + +M: output-task drop EPOLLOUT ; : make-event ( task -- event ) "epoll-event" - tuck set-epoll-event-events + over io-task-events over set-epoll-event-events over io-task-fd over set-epoll-fd ; : do-epoll-ctl ( task mx what -- ) @@ -57,5 +53,5 @@ M: epoll-mx unregister-io-task ( task mx -- ) : handle-events ( mx n -- ) [ over epoll-mx-events kevent-nth handle-kevent ] with each ; -M: epoll-mx unix-io-multiplex ( ms mx -- ) +M: epoll-mx wait-for-events ( ms mx -- ) dup rot wait-kevent handle-kevents ; diff --git a/extra/io/unix/kqueue/kqueue.factor b/extra/io/unix/kqueue/kqueue.factor index e1ce7666f1..4fbfbcaaf0 100644 --- a/extra/io/unix/kqueue/kqueue.factor +++ b/extra/io/unix/kqueue/kqueue.factor @@ -1,8 +1,8 @@ ! Copyright (C) 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: alien.c-types kernel io.nonblocking io.unix.backend -io.unix.sockets sequences assocs unix unix.kqueue unix.process -math namespaces classes combinators threads vectors ; +sequences assocs unix unix.kqueue unix.process math namespaces +combinators threads vectors ; IN: io.unix.kqueue TUPLE: kqueue-mx events processes ; @@ -18,15 +18,11 @@ TUPLE: kqueue-mx events processes ; H{ } clone over set-kqueue-mx-processes max-events "kevent" over set-kqueue-mx-events ; -: io-task-filter ( task -- n ) - class { - { read-task [ EVFILT_READ ] } - { accept-task [ EVFILT_READ ] } - { receive-task [ EVFILT_READ ] } - { write-task [ EVFILT_WRITE ] } - { connect-task [ EVFILT_WRITE ] } - { send-task [ EVFILT_WRITE ] } - } case ; +GENERIC: io-task-filter ( task -- n ) + +M: input-task io-task-filter drop EVFILT_READ ; + +M: output-task io-task-filter drop EVFILT_WRITE ; : make-kevent ( task flags -- event ) "kevent" @@ -70,7 +66,7 @@ M: kqueue-mx unregister-io-task ( task mx -- ) : handle-kevents ( mx n -- ) [ over kqueue-mx-events kevent-nth handle-kevent ] with each ; -M: kqueue-mx unix-io-multiplex ( ms mx -- ) +M: kqueue-mx wait-for-events ( ms mx -- ) swap make-timespec dupd wait-kevent handle-kevents ; : make-proc-kevent ( pid -- kevent ) diff --git a/extra/io/unix/select/select.factor b/extra/io/unix/select/select.factor index e74324f3b6..c28686d2f2 100644 --- a/extra/io/unix/select/select.factor +++ b/extra/io/unix/select/select.factor @@ -40,7 +40,7 @@ TUPLE: select-mx read-fdset write-fdset ; write-fdset/tasks tuck init-fdset f ; -M: select-mx unix-io-multiplex ( ms mx -- ) +M: select-mx wait-for-events ( ms mx -- ) swap >r FD_SETSIZE over init-fdsets r> make-timeval select multiplexer-error dup read-fdset/tasks pick handle-fdset diff --git a/extra/io/unix/sockets/sockets.factor b/extra/io/unix/sockets/sockets.factor index 81c0e50b42..35366b1d41 100644 --- a/extra/io/unix/sockets/sockets.factor +++ b/extra/io/unix/sockets/sockets.factor @@ -1,4 +1,4 @@ -! Copyright (C) 2004, 2007 Slava Pestov, Ivan Tikhonov. +! Copyright (C) 2004, 2008 Slava Pestov, Ivan Tikhonov. ! See http://factorcode.org/license.txt for BSD license. ! We need to fiddle with the exact search order here, since @@ -34,14 +34,12 @@ M: unix-io addrinfo-error ( n -- ) TUPLE: connect-task ; : ( port continuation -- task ) - connect-task ; + connect-task ; M: connect-task do-io-task io-task-port dup port-handle f 0 write 0 < [ defer-error ] [ drop t ] if ; -M: connect-task io-task-container drop mx-writes ; - : wait-to-connect ( port -- ) [ add-io-task stop ] callcc0 drop ; @@ -68,9 +66,7 @@ USE: unix TUPLE: accept-task ; : ( port continuation -- task ) - accept-task ; - -M: accept-task io-task-container drop mx-reads ; + accept-task ; : accept-sockaddr ( port -- fd sockaddr ) dup port-handle swap server-port-addr sockaddr-type @@ -101,7 +97,6 @@ M: unix-io ( addrspec -- stream ) [ SOCK_STREAM server-fd dup 10 listen zero? [ dup close (io-error) ] unless - f ] keep ; M: unix-io accept ( server -- client ) @@ -113,7 +108,7 @@ M: unix-io accept ( server -- client ) ! Datagram sockets - UDP and Unix domain M: unix-io - [ SOCK_DGRAM server-fd f ] keep ; + [ SOCK_DGRAM server-fd ] keep ; SYMBOL: receive-buffer @@ -139,7 +134,7 @@ packet-size receive-buffer set-global TUPLE: receive-task ; : ( stream continuation -- task ) - receive-task ; + receive-task ; M: receive-task do-io-task io-task-port @@ -152,8 +147,6 @@ M: receive-task do-io-task 2drop defer-error ] if ; -M: receive-task io-task-container drop mx-reads ; - : wait-receive ( stream -- ) [ add-io-task stop ] callcc0 drop ; @@ -170,7 +163,7 @@ M: unix-io receive ( datagram -- packet addrspec ) TUPLE: send-task packet sockaddr len ; : ( packet sockaddr len stream continuation -- task ) - send-task [ + send-task [ { set-send-task-packet set-send-task-sockaddr @@ -185,8 +178,6 @@ M: send-task do-io-task [ send-task-len do-send ] keep swap 0 < [ io-task-port defer-error ] [ drop t ] if ; -M: send-task io-task-container drop mx-writes ; - : wait-send ( packet sockaddr len stream -- ) [ add-io-task stop ] callcc0 2drop 2drop ; diff --git a/extra/io/windows/ce/sockets/sockets.factor b/extra/io/windows/ce/sockets/sockets.factor index da64b25933..cc19976bc5 100755 --- a/extra/io/windows/ce/sockets/sockets.factor +++ b/extra/io/windows/ce/sockets/sockets.factor @@ -38,7 +38,7 @@ M: windows-ce-io ( addrspec -- duplex-stream ) [ windows.winsock:SOCK_STREAM server-fd dup listen-on-socket - f + ] keep ; M: windows-ce-io accept ( server -- client ) @@ -58,7 +58,7 @@ M: windows-ce-io accept ( server -- client ) M: windows-ce-io ( addrspec -- datagram ) [ - windows.winsock:SOCK_DGRAM server-fd f + windows.winsock:SOCK_DGRAM server-fd ] keep ; : packet-size 65536 ; inline diff --git a/extra/io/windows/nt/sockets/sockets.factor b/extra/io/windows/nt/sockets/sockets.factor index e86f070719..a6c44a0b86 100755 --- a/extra/io/windows/nt/sockets/sockets.factor +++ b/extra/io/windows/nt/sockets/sockets.factor @@ -149,7 +149,7 @@ M: windows-nt-io ( addrspec -- server ) [ SOCK_STREAM server-fd dup listen-on-socket dup add-completion - f + ] keep ] with-destructors ; @@ -158,7 +158,7 @@ M: windows-nt-io ( addrspec -- datagram ) [ SOCK_DGRAM server-fd dup add-completion - f + ] keep ] with-destructors ; From 913403f06617a12fa080cb5208223ba6a66b5b21 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Mon, 21 Jan 2008 17:29:54 -0500 Subject: [PATCH 057/216] Load fix --- extra/io/nonblocking/nonblocking-docs.factor | 2 +- extra/io/nonblocking/nonblocking.factor | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/extra/io/nonblocking/nonblocking-docs.factor b/extra/io/nonblocking/nonblocking-docs.factor index c4adc3aa38..d0d5818bee 100644 --- a/extra/io/nonblocking/nonblocking-docs.factor +++ b/extra/io/nonblocking/nonblocking-docs.factor @@ -40,7 +40,7 @@ $nl { { $link port-error } " - the most recent I/O error, if any. This error is thrown to the waiting thread when " { $link pending-error } " is called by stream operations" } { { $link port-timeout } " - a timeout, specifying the maximum length of time, in milliseconds, for which input operations can block before throwing an error. A value of 0 denotes no timeout is desired." } { { $link port-cutoff } " - the time when the current timeout expires; if no input data arrives before this time, an error is thrown" } - { { $link port-type } " - a symbol identifying the port's intended purpose. Can be " { $link input } ", " { $link output } ", " { $link closed } ", or any other symbol" } + { { $link port-type } " - a symbol identifying the port's intended purpose" } { { $link port-eof? } " - a flag indicating if the port has reached the end of file while reading" } } } ; diff --git a/extra/io/nonblocking/nonblocking.factor b/extra/io/nonblocking/nonblocking.factor index 9839cc7066..8a7e732281 100755 --- a/extra/io/nonblocking/nonblocking.factor +++ b/extra/io/nonblocking/nonblocking.factor @@ -160,7 +160,7 @@ M: output-port stream-flush ( port -- ) M: port stream-close dup port-type closed eq? [ dup port-type >r closed over set-port-type r> - output eq? [ dup port-flush ] when + output-port eq? [ dup port-flush ] when dup port-handle close-handle dup delegate [ buffer-free ] when* f over set-delegate From 64d284a97041f65356a4a77ffc64da4f66995329 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Mon, 21 Jan 2008 17:30:10 -0500 Subject: [PATCH 058/216] Fix recompilation of foldable, flushable --- core/compiler/test/redefine.factor | 24 ++++++++++++++++++++++++ core/optimizer/backend/backend.factor | 11 ++++++----- core/words/words-tests.factor | 11 +++++++++++ core/words/words.factor | 2 +- 4 files changed, 42 insertions(+), 6 deletions(-) diff --git a/core/compiler/test/redefine.factor b/core/compiler/test/redefine.factor index 6e652df877..718e98c9c2 100755 --- a/core/compiler/test/redefine.factor +++ b/core/compiler/test/redefine.factor @@ -205,3 +205,27 @@ DEFER: generic-then-not-generic-test-2 [ ] [ "IN: temporary USE: math : generic-then-not-generic-test-1 1 + ;" eval ] unit-test [ 4 ] [ generic-then-not-generic-test-2 ] unit-test + +DEFER: foldable-test-2 + +[ ] [ "IN: temporary : foldable-test-1 3 ; foldable" eval ] unit-test + +[ ] [ "IN: temporary : foldable-test-2 foldable-test-1 ;" eval ] unit-test + +[ 3 ] [ foldable-test-2 ] unit-test + +[ ] [ "IN: temporary : foldable-test-1 4 ; foldable" eval ] unit-test + +[ 4 ] [ foldable-test-2 ] unit-test + +DEFER: flushable-test-2 + +[ ] [ "IN: temporary USE: kernel : flushable-test-1 drop 3 ; flushable" eval ] unit-test + +[ ] [ "IN: temporary USE: kernel : flushable-test-2 V{ } dup flushable-test-1 drop ;" eval ] unit-test + +[ V{ } ] [ flushable-test-2 ] unit-test + +[ ] [ "IN: temporary USING: kernel sequences ; : flushable-test-1 3 over push ;" eval ] unit-test + +[ V{ 3 } ] [ flushable-test-2 ] unit-test diff --git a/core/optimizer/backend/backend.factor b/core/optimizer/backend/backend.factor index 1122d83129..4843a9ff26 100644 --- a/core/optimizer/backend/backend.factor +++ b/core/optimizer/backend/backend.factor @@ -17,17 +17,17 @@ SYMBOL: optimizer-changed GENERIC: optimize-node* ( node -- node/t changed? ) -: ?union ( hash/f hash -- hash ) +: ?union ( assoc/f assoc -- hash ) over [ union ] [ nip ] if ; -: add-node-literals ( hash node -- ) +: add-node-literals ( assoc node -- ) over assoc-empty? [ 2drop ] [ [ node-literals ?union ] keep set-node-literals ] if ; -: add-node-classes ( hash node -- ) +: add-node-classes ( assoc node -- ) over assoc-empty? [ 2drop ] [ @@ -324,6 +324,7 @@ M: #dispatch optimize-node* ] if ; : flush-eval ( #call -- node ) + dup node-param +inlined+ depends-on dup node-out-d length f inline-literals ; : partial-eval? ( #call -- ? ) @@ -337,9 +338,9 @@ M: #dispatch optimize-node* dup node-in-d [ node-literal ] with map ; : partial-eval ( #call -- node ) + dup node-param +inlined+ depends-on dup literal-in-d over node-param 1quotation - [ with-datastack ] catch - [ 3drop t ] [ inline-literals ] if ; + [ with-datastack inline-literals ] [ 2drop 2drop t ] recover ; : define-identities ( words identities -- ) [ "identities" set-word-prop ] curry each ; diff --git a/core/words/words-tests.factor b/core/words/words-tests.factor index a88892b5f4..2455250dc9 100755 --- a/core/words/words-tests.factor +++ b/core/words/words-tests.factor @@ -175,3 +175,14 @@ SYMBOL: quot-uses-b [ t ] [ "symbol-generic" "temporary" lookup symbol? ] unit-test [ f ] [ "symbol-generic" "temporary" lookup generic? ] unit-test + +! Regressions +[ ] [ "IN: temporary : decl-forget-test ; foldable" eval ] unit-test +[ t ] [ "decl-forget-test" "temporary" lookup "foldable" word-prop ] unit-test +[ ] [ "IN: temporary : decl-forget-test ;" eval ] unit-test +[ f ] [ "decl-forget-test" "temporary" lookup "foldable" word-prop ] unit-test + +[ ] [ "IN: temporary : decl-forget-test ; flushable" eval ] unit-test +[ t ] [ "decl-forget-test" "temporary" lookup "flushable" word-prop ] unit-test +[ ] [ "IN: temporary : decl-forget-test ;" eval ] unit-test +[ f ] [ "decl-forget-test" "temporary" lookup "flushable" word-prop ] unit-test diff --git a/core/words/words.factor b/core/words/words.factor index a2d9234353..6d8bad4f9e 100755 --- a/core/words/words.factor +++ b/core/words/words.factor @@ -127,7 +127,7 @@ SYMBOL: changed-words : reset-word ( word -- ) { "unannotated-def" - "parsing" "inline" "foldable" + "parsing" "inline" "foldable" "flushable" "predicating" "reading" "writing" "constructing" From 1f2e4c88ed8a24a4127483ee0d39e5dc1aef2440 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Mon, 21 Jan 2008 17:30:19 -0500 Subject: [PATCH 059/216] Fix obsolete docs --- core/parser/parser-docs.factor | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/parser/parser-docs.factor b/core/parser/parser-docs.factor index de56dc55db..30e259c033 100755 --- a/core/parser/parser-docs.factor +++ b/core/parser/parser-docs.factor @@ -44,8 +44,7 @@ ARTICLE: "vocabulary-search-errors" "Word lookup errors" "If the parser cannot not find a word in the current vocabulary search path, it attempts to look for the word in all loaded vocabularies. Then, one of three things happen:" { $list { "If there are no words having this name at all, an error is thrown and parsing stops." } - { "If there is exactly one vocabulary having a word with this name, the vocabulary is automatically added to the search path. This behavior is intended for interactive use and exploratory programming only, and production code should contain full " { $link POSTPONE: USING: } " declarations." } - { "If there is more than one vocabulary which contains a word with this name, a restartable error is thrown, with a restart for each vocabulary in question. The restarts add the vocabulary to the search path and continue parsing." } + { "If there are vocabularies which contain words with this name, a restartable error is thrown, with a restart for each vocabulary in question. The restarts add the vocabulary to the search path and continue parsing." } } "When writing a new vocabulary, one approach is to ignore " { $link POSTPONE: USING: } " declarations altogether, then to load the vocabulary and observe any parser notes and restarts and use this information to write the correct " { $link POSTPONE: USING: } " declaration." ; From e2ebe78915389fcff6eb54715ee66c3354b900ff Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Mon, 21 Jan 2008 20:39:44 -0500 Subject: [PATCH 060/216] Faster bootstrap --- core/bootstrap/stage2.factor | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/bootstrap/stage2.factor b/core/bootstrap/stage2.factor index f9c738a8d0..d035744cd0 100755 --- a/core/bootstrap/stage2.factor +++ b/core/bootstrap/stage2.factor @@ -48,7 +48,11 @@ IN: bootstrap.stage2 "Compiling remaining words..." print flush - all-words [ compiled? not ] subset recompile-hook get call + "bootstrap.compiler" vocab [ + vocabs [ + words "compile" "compiler" lookup execute + ] each + ] when ] with-compiler-errors f error set-global From cc9646c80d0611d860e8cdcc60f4be9837a23bb5 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Mon, 21 Jan 2008 20:39:49 -0500 Subject: [PATCH 061/216] Fix typo --- extra/io/nonblocking/nonblocking-docs.factor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extra/io/nonblocking/nonblocking-docs.factor b/extra/io/nonblocking/nonblocking-docs.factor index d0d5818bee..d6d619229f 100644 --- a/extra/io/nonblocking/nonblocking-docs.factor +++ b/extra/io/nonblocking/nonblocking-docs.factor @@ -1,5 +1,5 @@ USING: io io.buffers io.backend help.markup help.syntax kernel -strings sbufs ; +strings sbufs words ; IN: io.nonblocking ARTICLE: "io.nonblocking" "Non-blocking I/O implementation" From 62415768cad61332ea1768e3bb6ee6a1405807dc Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Mon, 21 Jan 2008 22:36:20 -0500 Subject: [PATCH 062/216] Minor tweak to math.text.english --- extra/math/text/english/english.factor | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/extra/math/text/english/english.factor b/extra/math/text/english/english.factor index a6179382bd..645d7e2054 100644 --- a/extra/math/text/english/english.factor +++ b/extra/math/text/english/english.factor @@ -12,10 +12,10 @@ IN: math.text.english "Seventeen" "Eighteen" "Nineteen" } nth ; : tens ( n -- str ) - { "" "" "Twenty" "Thirty" "Forty" "Fifty" "Sixty" "Seventy" "Eighty" "Ninety" } nth ; + { f f "Twenty" "Thirty" "Forty" "Fifty" "Sixty" "Seventy" "Eighty" "Ninety" } nth ; : scale-numbers ( n -- str ) ! up to 10^99 - { "" "Thousand" "Million" "Billion" "Trillion" "Quadrillion" "Quintillion" + { f "Thousand" "Million" "Billion" "Trillion" "Quadrillion" "Quintillion" "Sextillion" "Septillion" "Octillion" "Nonillion" "Decillion" "Undecillion" "Duodecillion" "Tredecillion" "Quattuordecillion" "Quindecillion" "Sexdecillion" "Septendecillion" "Octodecillion" "Novemdecillion" @@ -45,7 +45,7 @@ SYMBOL: and-needed? : tens-place ( n -- str ) 100 mod dup 20 >= [ - 10 /mod >r tens r> + 10 /mod [ tens ] dip dup zero? [ drop ] [ "-" swap small-numbers 3append ] if ] [ dup zero? [ drop "" ] [ small-numbers ] if @@ -97,3 +97,4 @@ PRIVATE> ] [ [ (number>text) ] with-scope ] if ; + From 7fbee3e810fc8598f899ca74c198461270f91450 Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Tue, 22 Jan 2008 00:08:27 -0500 Subject: [PATCH 063/216] Solutions to Project Euler problem 32 --- extra/project-euler/032/032.factor | 81 ++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 extra/project-euler/032/032.factor diff --git a/extra/project-euler/032/032.factor b/extra/project-euler/032/032.factor new file mode 100644 index 0000000000..f4d5704e21 --- /dev/null +++ b/extra/project-euler/032/032.factor @@ -0,0 +1,81 @@ +! Copyright (c) 2007 Aaron Schaefer. +! See http://factorcode.org/license.txt for BSD license. +USING: combinators.lib hashtables kernel math math.combinatorics math.parser + math.ranges project-euler.common project-euler.024 sequences sorting ; +IN: project-euler.032 + +! http://projecteuler.net/index.php?section=problems&id=32 + +! DESCRIPTION +! ----------- + +! The product 7254 is unusual, as the identity, 39 × 186 = 7254, containing +! multiplicand, multiplier, and product is 1 through 9 pandigital. + +! Find the sum of all products whose multiplicand/multiplier/product identity +! can be written as a 1 through 9 pandigital. + +! HINT: Some products can be obtained in more than one way so be sure to only +! include it once in your sum. + + +! SOLUTION +! -------- + +! Generate all pandigital numbers and then check if they fit the identity + +integer ] map ; + +: 1and4 ( n -- ? ) + number>string 1 cut-slice 4 cut-slice + [ 10 string>integer ] 3apply [ * ] dip = ; + +: 2and3 ( n -- ? ) + number>string 2 cut-slice 3 cut-slice + [ 10 string>integer ] 3apply [ * ] dip = ; + +: valid? ( n -- ? ) + dup 1and4 swap 2and3 or ; + +: products ( seq -- m ) + [ number>string 4 tail* 10 string>integer ] map ; + +PRIVATE> + +: euler032 ( -- answer ) + source-032 [ valid? ] subset products prune sum ; + +! [ euler032 ] 10 ave-time +! 27609 ms run / 2484 ms GC ave time - 10 trials + + +! ALTERNATE SOLUTIONS +! ------------------- + +! Generate all reasonable multiplicand/multiplier pairs, then multiply and see +! if the equation is pandigital + +string natural-sort "123456789" = ; + +! multiplicand/multiplier/product +: mmp ( pair -- n ) + first2 2dup * [ number>string ] 3apply 3append 10 string>integer ; + +PRIVATE> + +: euler032a ( -- answer ) + source-032a [ mmp ] map [ pandigital? ] subset products prune sum ; + +! [ euler032a ] 100 ave-time +! 5978 ms run / 327 ms GC ave time - 100 trials + +MAIN: euler032a From cd92504288148cf80310bd553372bf9421d4a2c7 Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Tue, 22 Jan 2008 17:02:02 -0500 Subject: [PATCH 064/216] Fix copyright date on PE solutions after the new year --- extra/project-euler/023/023.factor | 2 +- extra/project-euler/024/024.factor | 2 +- extra/project-euler/025/025.factor | 2 +- extra/project-euler/026/026.factor | 2 +- extra/project-euler/027/027.factor | 2 +- extra/project-euler/028/028.factor | 2 +- extra/project-euler/029/029.factor | 2 +- extra/project-euler/030/030.factor | 2 +- extra/project-euler/031/031.factor | 2 +- extra/project-euler/032/032.factor | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/extra/project-euler/023/023.factor b/extra/project-euler/023/023.factor index 06f6555ea3..526bb4c446 100644 --- a/extra/project-euler/023/023.factor +++ b/extra/project-euler/023/023.factor @@ -1,4 +1,4 @@ -! Copyright (c) 2007 Aaron Schaefer. +! Copyright (c) 2008 Aaron Schaefer. ! See http://factorcode.org/license.txt for BSD license. USING: hashtables kernel math math.ranges project-euler.common sequences sorting ; diff --git a/extra/project-euler/024/024.factor b/extra/project-euler/024/024.factor index 44434b4a88..230aea02b9 100644 --- a/extra/project-euler/024/024.factor +++ b/extra/project-euler/024/024.factor @@ -1,4 +1,4 @@ -! Copyright (c) 2007 Aaron Schaefer. +! Copyright (c) 2008 Aaron Schaefer. ! See http://factorcode.org/license.txt for BSD license. USING: kernel math math.parser math.ranges namespaces sequences ; IN: project-euler.024 diff --git a/extra/project-euler/025/025.factor b/extra/project-euler/025/025.factor index 2819e210a7..4eed8b55cb 100644 --- a/extra/project-euler/025/025.factor +++ b/extra/project-euler/025/025.factor @@ -1,4 +1,4 @@ -! Copyright (c) 2007 Aaron Schaefer. +! Copyright (c) 2008 Aaron Schaefer. ! See http://factorcode.org/license.txt for BSD license. USING: alien.syntax kernel math math.functions math.parser math.ranges memoize project-euler.common sequences ; diff --git a/extra/project-euler/026/026.factor b/extra/project-euler/026/026.factor index d79effed02..3ad1908aa6 100644 --- a/extra/project-euler/026/026.factor +++ b/extra/project-euler/026/026.factor @@ -1,4 +1,4 @@ -! Copyright (c) 2007 Aaron Schaefer. +! Copyright (c) 2008 Aaron Schaefer. ! See http://factorcode.org/license.txt for BSD license. USING: kernel math math.functions math.primes math.ranges sequences ; IN: project-euler.026 diff --git a/extra/project-euler/027/027.factor b/extra/project-euler/027/027.factor index c208caaf9e..2bc7894684 100644 --- a/extra/project-euler/027/027.factor +++ b/extra/project-euler/027/027.factor @@ -1,4 +1,4 @@ -! Copyright (c) 2007 Aaron Schaefer. +! Copyright (c) 2008 Aaron Schaefer. ! See http://factorcode.org/license.txt for BSD license. USING: kernel math math.primes project-euler.common sequences ; IN: project-euler.027 diff --git a/extra/project-euler/028/028.factor b/extra/project-euler/028/028.factor index 5d20032ea9..c8ac19ef82 100644 --- a/extra/project-euler/028/028.factor +++ b/extra/project-euler/028/028.factor @@ -1,4 +1,4 @@ -! Copyright (c) 2007 Aaron Schaefer. +! Copyright (c) 2008 Aaron Schaefer. ! See http://factorcode.org/license.txt for BSD license. USING: combinators.lib kernel math math.ranges ; IN: project-euler.028 diff --git a/extra/project-euler/029/029.factor b/extra/project-euler/029/029.factor index 47855c0bf1..459a3a4bd6 100644 --- a/extra/project-euler/029/029.factor +++ b/extra/project-euler/029/029.factor @@ -1,4 +1,4 @@ -! Copyright (c) 2007 Aaron Schaefer. +! Copyright (c) 2008 Aaron Schaefer. ! See http://factorcode.org/license.txt for BSD license. USING: hashtables kernel math.functions math.ranges project-euler.common sequences ; diff --git a/extra/project-euler/030/030.factor b/extra/project-euler/030/030.factor index 854b7ca5ca..22d05524b2 100644 --- a/extra/project-euler/030/030.factor +++ b/extra/project-euler/030/030.factor @@ -1,4 +1,4 @@ -! Copyright (c) 2007 Aaron Schaefer. +! Copyright (c) 2008 Aaron Schaefer. ! See http://factorcode.org/license.txt for BSD license. USING: combinators.lib kernel math math.functions project-euler.common sequences ; IN: project-euler.030 diff --git a/extra/project-euler/031/031.factor b/extra/project-euler/031/031.factor index b4402d8904..4be866dc03 100644 --- a/extra/project-euler/031/031.factor +++ b/extra/project-euler/031/031.factor @@ -1,4 +1,4 @@ -! Copyright (c) 2007 Aaron Schaefer. +! Copyright (c) 2008 Aaron Schaefer. ! See http://factorcode.org/license.txt for BSD license. USING: kernel math ; IN: project-euler.031 diff --git a/extra/project-euler/032/032.factor b/extra/project-euler/032/032.factor index f4d5704e21..67a8befb0a 100644 --- a/extra/project-euler/032/032.factor +++ b/extra/project-euler/032/032.factor @@ -1,4 +1,4 @@ -! Copyright (c) 2007 Aaron Schaefer. +! Copyright (c) 2008 Aaron Schaefer. ! See http://factorcode.org/license.txt for BSD license. USING: combinators.lib hashtables kernel math math.combinatorics math.parser math.ranges project-euler.common project-euler.024 sequences sorting ; From 817dfbfbbe18e67da2ee361fc1045e862b1aa34b Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Tue, 22 Jan 2008 17:17:04 -0500 Subject: [PATCH 065/216] Add summary for Miller-Rabin vocab, and cleanup tests --- extra/math/miller-rabin/miller-rabin-tests.factor | 4 ++-- extra/math/miller-rabin/summary.txt | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 extra/math/miller-rabin/summary.txt diff --git a/extra/math/miller-rabin/miller-rabin-tests.factor b/extra/math/miller-rabin/miller-rabin-tests.factor index 42e4164ef3..f8bc9d4970 100644 --- a/extra/math/miller-rabin/miller-rabin-tests.factor +++ b/extra/math/miller-rabin/miller-rabin-tests.factor @@ -1,4 +1,5 @@ -USING: math.miller-rabin kernel math namespaces tools.test ; +USING: math.miller-rabin tools.test ; +IN: temporary [ f ] [ 473155932665450549999756893736999469773678960651272093993257221235459777950185377130233556540099119926369437865330559863 miller-rabin ] unit-test [ t ] [ 2 miller-rabin ] unit-test @@ -7,4 +8,3 @@ USING: math.miller-rabin kernel math namespaces tools.test ; [ t ] [ 37 miller-rabin ] unit-test [ 101 ] [ 100 next-prime ] unit-test [ 100000000000031 ] [ 100000000000000 next-prime ] unit-test - diff --git a/extra/math/miller-rabin/summary.txt b/extra/math/miller-rabin/summary.txt new file mode 100644 index 0000000000..b2591a3182 --- /dev/null +++ b/extra/math/miller-rabin/summary.txt @@ -0,0 +1 @@ +Miller-Rabin probabilistic primality test From cf670bd2348fa84cdd51d94de9b67e54a514a0b1 Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Tue, 22 Jan 2008 17:37:54 -0500 Subject: [PATCH 066/216] Add summary for math.text --- extra/math/text/summary.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 extra/math/text/summary.txt diff --git a/extra/math/text/summary.txt b/extra/math/text/summary.txt new file mode 100644 index 0000000000..95dc6939e2 --- /dev/null +++ b/extra/math/text/summary.txt @@ -0,0 +1 @@ +Convert integers to text in multiple languages From 157043ad199b75d5b09b98fd56bf7519e95a2572 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Wed, 23 Jan 2008 02:45:55 -0400 Subject: [PATCH 067/216] Minor I/O backend tweak --- core/io/backend/backend.factor | 3 +++ extra/bootstrap/io/io.factor | 3 --- extra/io/unix/bsd/bsd.factor | 2 +- extra/io/unix/linux/linux.factor | 2 +- extra/io/windows/ce/ce.factor | 2 +- extra/io/windows/nt/nt.factor | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) mode change 100644 => 100755 core/io/backend/backend.factor mode change 100644 => 100755 extra/io/unix/bsd/bsd.factor mode change 100644 => 100755 extra/io/unix/linux/linux.factor diff --git a/core/io/backend/backend.factor b/core/io/backend/backend.factor old mode 100644 new mode 100755 index a7736ae47e..6d0a6d5ec5 --- a/core/io/backend/backend.factor +++ b/core/io/backend/backend.factor @@ -21,3 +21,6 @@ M: object normalize-pathname ; [ init-io embedded? [ init-stdio ] unless ] "io.backend" add-init-hook + +: set-io-backend ( backend -- ) + io-backend set-global init-io init-stdio ; diff --git a/extra/bootstrap/io/io.factor b/extra/bootstrap/io/io.factor index 238a971e67..065f7dd5c4 100755 --- a/extra/bootstrap/io/io.factor +++ b/extra/bootstrap/io/io.factor @@ -10,6 +10,3 @@ IN: bootstrap.io { [ wince? ] [ "windows.ce" ] } } cond append require ] when - -init-io -init-stdio diff --git a/extra/io/unix/bsd/bsd.factor b/extra/io/unix/bsd/bsd.factor old mode 100644 new mode 100755 index 8ed84dc305..39eb8b6fb9 --- a/extra/io/unix/bsd/bsd.factor +++ b/extra/io/unix/bsd/bsd.factor @@ -26,4 +26,4 @@ M: bsd-io init-io ( -- ) M: bsd-io wait-for-process ( pid -- status ) [ kqueue-mx get-global add-pid-task stop ] curry callcc1 ; -T{ bsd-io } io-backend set-global +T{ bsd-io } set-io-backend diff --git a/extra/io/unix/linux/linux.factor b/extra/io/unix/linux/linux.factor old mode 100644 new mode 100755 index 180e81e30a..34afc16246 --- a/extra/io/unix/linux/linux.factor +++ b/extra/io/unix/linux/linux.factor @@ -14,4 +14,4 @@ M: linux-io init-io ( -- ) M: linux-io wait-for-pid ( pid -- status ) [ kqueue-mx get-global add-pid-task stop ] curry callcc1 ; -T{ linux-io } io-backend set-global +T{ linux-io } set-io-backend diff --git a/extra/io/windows/ce/ce.factor b/extra/io/windows/ce/ce.factor index 9fb0d700d9..a5e0cb6b4a 100755 --- a/extra/io/windows/ce/ce.factor +++ b/extra/io/windows/ce/ce.factor @@ -3,4 +3,4 @@ io.windows.ce.files io.windows.ce.sockets io.windows.ce.launcher namespaces io.windows.mmap ; IN: io.windows.ce -T{ windows-ce-io } io-backend set-global +T{ windows-ce-io } set-io-backend diff --git a/extra/io/windows/nt/nt.factor b/extra/io/windows/nt/nt.factor index 9ec97b33c6..000d1362b6 100755 --- a/extra/io/windows/nt/nt.factor +++ b/extra/io/windows/nt/nt.factor @@ -9,4 +9,4 @@ USE: io.windows.mmap USE: io.backend USE: namespaces -T{ windows-nt-io } io-backend set-global +T{ windows-nt-io } set-io-backend From 81c5b413f489337abf9ea4255d21d4a0ccf23328 Mon Sep 17 00:00:00 2001 From: Slava Date: Wed, 23 Jan 2008 01:49:01 -0500 Subject: [PATCH 068/216] Working on epoll --- extra/io/unix/epoll/epoll.factor | 23 +++++++++++++---------- extra/io/unix/linux/linux.factor | 11 ++++++----- extra/io/unix/unix.factor | 4 ++-- extra/unix/linux/epoll/epoll.factor | 2 +- 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/extra/io/unix/epoll/epoll.factor b/extra/io/unix/epoll/epoll.factor index f2230f6e81..f0280aac78 100644 --- a/extra/io/unix/epoll/epoll.factor +++ b/extra/io/unix/epoll/epoll.factor @@ -1,7 +1,8 @@ ! Copyright (C) 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: alien.c-types kernel io.nonblocking io.unix.backend -bit-arrays sequences assocs unix math namespaces structs ; +bit-arrays sequences assocs unix unix.linux.epoll math +namespaces structs ; IN: io.unix.epoll TUPLE: epoll-mx events ; @@ -18,17 +19,17 @@ TUPLE: epoll-mx events ; GENERIC: io-task-events ( task -- n ) -M: input-task drop EPOLLIN ; +M: input-task io-task-events drop EPOLLIN ; -M: output-task drop EPOLLOUT ; +M: output-task io-task-events drop EPOLLOUT ; : make-event ( task -- event ) "epoll-event" over io-task-events over set-epoll-event-events - over io-task-fd over set-epoll-fd ; + swap io-task-fd over set-epoll-event-fd ; : do-epoll-ctl ( task mx what -- ) - >r >r make-event r> mx-fd r> pick event-data *int roll + >r >r make-event r> mx-fd r> pick epoll-event-fd roll epoll_ctl io-error ; M: epoll-mx register-io-task ( task mx -- ) @@ -37,9 +38,9 @@ M: epoll-mx register-io-task ( task mx -- ) M: epoll-mx unregister-io-task ( task mx -- ) EPOLL_CTL_DEL do-epoll-ctl ; -: wait-kevent ( mx timeout -- n ) - >r mx-fd epoll-mx-events max-events r> epoll_wait - dup multiplexer-error ; +: wait-event ( mx timeout -- n ) + >r { mx-fd epoll-mx-events } get-slots max-events + r> epoll_wait dup multiplexer-error ; : epoll-read-task ( mx fd -- ) over mx-reads at* [ handle-io-task ] [ 2drop ] if ; @@ -51,7 +52,9 @@ M: epoll-mx unregister-io-task ( task mx -- ) epoll-event-fd 2dup epoll-read-task epoll-write-task ; : handle-events ( mx n -- ) - [ over epoll-mx-events kevent-nth handle-kevent ] with each ; + [ + over epoll-mx-events epoll-event-nth handle-event + ] with each ; M: epoll-mx wait-for-events ( ms mx -- ) - dup rot wait-kevent handle-kevents ; + dup rot wait-event handle-events ; diff --git a/extra/io/unix/linux/linux.factor b/extra/io/unix/linux/linux.factor index 180e81e30a..919fba8d5d 100644 --- a/extra/io/unix/linux/linux.factor +++ b/extra/io/unix/linux/linux.factor @@ -1,17 +1,18 @@ ! Copyright (C) 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. IN: io.unix.linux -USING: io.unix.backend io.unix.select namespaces kernel assocs ; +USING: io.backend io.unix.backend io.unix.launcher io.unix.epoll +namespaces kernel assocs unix.process ; TUPLE: linux-io ; INSTANCE: linux-io unix-io M: linux-io init-io ( -- ) - start-wait-loop - mx set-global ; + mx set-global + start-wait-loop ; -M: linux-io wait-for-pid ( pid -- status ) - [ kqueue-mx get-global add-pid-task stop ] curry callcc1 ; +M: linux-io wait-for-process ( pid -- status ) + wait-for-pid ; T{ linux-io } io-backend set-global diff --git a/extra/io/unix/unix.factor b/extra/io/unix/unix.factor index d6d0a9cc22..7dc66a05ad 100755 --- a/extra/io/unix/unix.factor +++ b/extra/io/unix/unix.factor @@ -5,6 +5,6 @@ system vocabs.loader ; { { [ bsd? ] [ "io.unix.bsd" ] } { [ macosx? ] [ "io.unix.bsd" ] } - { [ linux? ] [ "io.unix.backend.linux" ] } - { [ solaris? ] [ "io.unix.backend.solaris" ] } + { [ linux? ] [ "io.unix.linux" ] } + { [ solaris? ] [ "io.unix.solaris" ] } } cond require diff --git a/extra/unix/linux/epoll/epoll.factor b/extra/unix/linux/epoll/epoll.factor index 946c387acc..6606c11568 100644 --- a/extra/unix/linux/epoll/epoll.factor +++ b/extra/unix/linux/epoll/epoll.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. IN: unix.linux.epoll -USING: alien.syntax ; +USING: alien.syntax math ; FUNCTION: int epoll_create ( int size ) ; From 09eb56d0c2975a1f5182d721f200536f402f48fd Mon Sep 17 00:00:00 2001 From: Slava Date: Wed, 23 Jan 2008 03:07:15 -0500 Subject: [PATCH 069/216] epoll almost works --- core/io/backend/backend.factor | 4 ++-- extra/io/unix/epoll/epoll.factor | 8 +++++--- extra/io/unix/linux/linux.factor | 2 +- extra/unix/linux/epoll/epoll.factor | 3 ++- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/core/io/backend/backend.factor b/core/io/backend/backend.factor index 6d0a6d5ec5..9aa1299871 100755 --- a/core/io/backend/backend.factor +++ b/core/io/backend/backend.factor @@ -1,6 +1,6 @@ -! Copyright (C) 2007 Slava Pestov. +! Copyright (C) 2007, 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: init kernel system ; +USING: init kernel system namespaces ; IN: io.backend SYMBOL: io-backend diff --git a/extra/io/unix/epoll/epoll.factor b/extra/io/unix/epoll/epoll.factor index f0280aac78..1459549f9e 100644 --- a/extra/io/unix/epoll/epoll.factor +++ b/extra/io/unix/epoll/epoll.factor @@ -29,13 +29,15 @@ M: output-task io-task-events drop EPOLLOUT ; swap io-task-fd over set-epoll-event-fd ; : do-epoll-ctl ( task mx what -- ) - >r >r make-event r> mx-fd r> pick epoll-event-fd roll + >r mx-fd r> rot dup io-task-fd swap make-event epoll_ctl io-error ; M: epoll-mx register-io-task ( task mx -- ) - EPOLL_CTL_ADD do-epoll-ctl ; + 2dup EPOLL_CTL_ADD do-epoll-ctl + delegate register-io-task ; M: epoll-mx unregister-io-task ( task mx -- ) + 2dup delegate unregister-io-task EPOLL_CTL_DEL do-epoll-ctl ; : wait-event ( mx timeout -- n ) @@ -46,7 +48,7 @@ M: epoll-mx unregister-io-task ( task mx -- ) over mx-reads at* [ handle-io-task ] [ 2drop ] if ; : epoll-write-task ( mx fd -- ) - over mx-reads at* [ handle-io-task ] [ 2drop ] if ; + over mx-writes at* [ handle-io-task ] [ 2drop ] if ; : handle-event ( mx kevent -- ) epoll-event-fd 2dup epoll-read-task epoll-write-task ; diff --git a/extra/io/unix/linux/linux.factor b/extra/io/unix/linux/linux.factor index bd1d166252..56032ad019 100755 --- a/extra/io/unix/linux/linux.factor +++ b/extra/io/unix/linux/linux.factor @@ -15,4 +15,4 @@ M: linux-io init-io ( -- ) M: linux-io wait-for-process ( pid -- status ) wait-for-pid ; -T{ linux-io } set-io-backend +T{ linux-io } io-backend set-global ! set-io-backend diff --git a/extra/unix/linux/epoll/epoll.factor b/extra/unix/linux/epoll/epoll.factor index 6606c11568..c18fa2ee6c 100644 --- a/extra/unix/linux/epoll/epoll.factor +++ b/extra/unix/linux/epoll/epoll.factor @@ -9,7 +9,8 @@ FUNCTION: int epoll_ctl ( int epfd, int op, int fd, epoll_event* event ) ; C-STRUCT: epoll-event { "uint" "events" } - { "uint" "fd" } ; + { "uint" "fd" } + { "uint" "padding" } ; FUNCTION: int epoll_wait ( int epfd, epoll_event* events, int maxevents, int timeout ) ; From 42e97d4629fef0610c6fed0198ea6295f168962f Mon Sep 17 00:00:00 2001 From: Slava Date: Wed, 23 Jan 2008 03:30:16 -0500 Subject: [PATCH 070/216] epoll works but not for files; disable it for now --- extra/io/unix/linux/linux.factor | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extra/io/unix/linux/linux.factor b/extra/io/unix/linux/linux.factor index 56032ad019..06380c7e1e 100755 --- a/extra/io/unix/linux/linux.factor +++ b/extra/io/unix/linux/linux.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. IN: io.unix.linux -USING: io.backend io.unix.backend io.unix.launcher io.unix.epoll +USING: io.backend io.unix.backend io.unix.launcher io.unix.select namespaces kernel assocs unix.process ; TUPLE: linux-io ; @@ -9,10 +9,10 @@ TUPLE: linux-io ; INSTANCE: linux-io unix-io M: linux-io init-io ( -- ) - mx set-global + mx set-global start-wait-loop ; M: linux-io wait-for-process ( pid -- status ) wait-for-pid ; -T{ linux-io } io-backend set-global ! set-io-backend +T{ linux-io } set-io-backend From bc5bc22072f8c1833e82f4631c8ef601e972a183 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Wed, 23 Jan 2008 06:31:30 -0400 Subject: [PATCH 071/216] Better dlists behavior --- core/dlists/dlists.factor | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/core/dlists/dlists.factor b/core/dlists/dlists.factor index a3c869efaf..84d68b28aa 100755 --- a/core/dlists/dlists.factor +++ b/core/dlists/dlists.factor @@ -78,7 +78,8 @@ PRIVATE> : pop-front ( dlist -- obj ) dup dlist-front [ - dlist-node-next + dup dlist-node-next + f rot set-dlist-node-next f over set-prev-when swap set-dlist-front ] 2keep dlist-node-obj @@ -87,13 +88,13 @@ PRIVATE> : pop-front* ( dlist -- ) pop-front drop ; : pop-back ( dlist -- obj ) - [ - dlist-back dup dlist-node-prev f over set-next-when - ] keep - [ set-dlist-back ] keep - [ normalize-front ] keep - dec-length - dlist-node-obj ; + dup dlist-back [ + dup dlist-node-prev + f rot set-dlist-node-prev + f over set-next-when + swap set-dlist-back + ] 2keep dlist-node-obj + swap [ normalize-front ] keep dec-length ; : pop-back* ( dlist -- ) pop-back drop ; From 83d6e10ac030d98f65284b71b373f04ae0d867ed Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Wed, 23 Jan 2008 06:32:51 -0400 Subject: [PATCH 072/216] Fix resolver on FreeBSD --- extra/io/sockets/impl/impl.factor | 33 ++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/extra/io/sockets/impl/impl.factor b/extra/io/sockets/impl/impl.factor index e490b9312b..e8ab957482 100755 --- a/extra/io/sockets/impl/impl.factor +++ b/extra/io/sockets/impl/impl.factor @@ -51,10 +51,13 @@ M: inet4 make-sockaddr ( inet -- sockaddr ) "0.0.0.0" or rot inet-pton *uint over set-sockaddr-in-addr ; +SYMBOL: port-override + +: (port) port-override get [ ] [ ] ?if ; + M: inet4 parse-sockaddr >r dup sockaddr-in-addr r> inet-ntop - swap sockaddr-in-port ntohs ; - + swap sockaddr-in-port ntohs (port) ; M: inet6 inet-ntop ( data addrspec -- str ) drop 16 memory>string 2 [ be> >hex ] map ":" join ; @@ -80,7 +83,7 @@ M: inet6 make-sockaddr ( inet -- sockaddr ) M: inet6 parse-sockaddr >r dup sockaddr-in6-addr r> inet-ntop - swap sockaddr-in6-port ntohs ; + swap sockaddr-in6-port ntohs (port) ; : addrspec-of-family ( af -- addrspec ) { @@ -102,15 +105,23 @@ M: f parse-sockaddr nip ; [ dup addrinfo-next swap addrinfo>addrspec ] [ ] unfold nip [ ] subset ; +: prepare-resolve-host ( host serv passive? -- host' serv' flags ) + >r + >r string>char-alien r> + dup integer? [ port-override set f ] [ string>char-alien ] if + r> AI_PASSIVE 0 ? ; + M: object resolve-host ( host serv passive? -- seq ) - >r dup integer? [ number>string ] when - "addrinfo" - r> [ AI_PASSIVE over set-addrinfo-flags ] when - PF_UNSPEC over set-addrinfo-family - IPPROTO_TCP over set-addrinfo-protocol - f [ getaddrinfo addrinfo-error ] keep *void* - [ parse-addrinfo-list ] keep - freeaddrinfo ; + [ + prepare-resolve-host + "addrinfo" + [ set-addrinfo-flags ] keep + PF_UNSPEC over set-addrinfo-family + IPPROTO_TCP over set-addrinfo-protocol + f [ getaddrinfo addrinfo-error ] keep *void* + [ parse-addrinfo-list ] keep + freeaddrinfo + ] with-scope ; M: object host-name ( -- name ) 256 dup dup length gethostname From ecc0170afab550777f005235e24a8d2deeb1f878 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Thu, 24 Jan 2008 03:20:05 -0400 Subject: [PATCH 073/216] Forgetting a word clears compiled usage --- core/compiler/compiler.factor | 17 +---------------- core/compiler/test/redefine.factor | 11 ++++++++++- core/words/words.factor | 20 ++++++++++++++++++++ 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/core/compiler/compiler.factor b/core/compiler/compiler.factor index 784104d57f..8d9f004270 100755 --- a/core/compiler/compiler.factor +++ b/core/compiler/compiler.factor @@ -7,21 +7,6 @@ optimizer definitions math compiler.errors threads graphs generic ; IN: compiler -SYMBOL: compiled-crossref - -compiled-crossref global [ H{ } assoc-like ] change-at - -: compiled-xref ( word dependencies -- ) - 2dup "compiled-uses" set-word-prop - compiled-crossref get add-vertex* ; - -: compiled-unxref ( word -- ) - dup "compiled-uses" word-prop - compiled-crossref get remove-vertex* ; - -: compiled-usage ( word -- assoc ) - compiled-crossref get at ; - : compiled-usages ( words -- seq ) [ [ dup ] H{ } map>assoc dup ] keep [ compiled-usage [ nip +inlined+ eq? ] assoc-subset update @@ -41,7 +26,7 @@ compiled-crossref global [ H{ } assoc-like ] change-at >r dupd save-effect r> f pick compiler-error over compiled-unxref - compiled-xref ; + over word-vocabulary [ compiled-xref ] [ 2drop ] if ; : compile-succeeded ( word -- effect dependencies ) [ diff --git a/core/compiler/test/redefine.factor b/core/compiler/test/redefine.factor index 718e98c9c2..266b331ffc 100755 --- a/core/compiler/test/redefine.factor +++ b/core/compiler/test/redefine.factor @@ -1,6 +1,6 @@ USING: compiler definitions generic assocs inference math namespaces parser tools.test words kernel sequences arrays io -effects tools.test.inference compiler.units ; +effects tools.test.inference compiler.units inference.state ; IN: temporary DEFER: x-1 @@ -206,12 +206,15 @@ DEFER: generic-then-not-generic-test-2 [ 4 ] [ generic-then-not-generic-test-2 ] unit-test +DEFER: foldable-test-1 DEFER: foldable-test-2 [ ] [ "IN: temporary : foldable-test-1 3 ; foldable" eval ] unit-test [ ] [ "IN: temporary : foldable-test-2 foldable-test-1 ;" eval ] unit-test +[ +inlined+ ] [ \ foldable-test-2 \ foldable-test-1 compiled-usage at ] unit-test + [ 3 ] [ foldable-test-2 ] unit-test [ ] [ "IN: temporary : foldable-test-1 4 ; foldable" eval ] unit-test @@ -229,3 +232,9 @@ DEFER: flushable-test-2 [ ] [ "IN: temporary USING: kernel sequences ; : flushable-test-1 3 over push ;" eval ] unit-test [ V{ 3 } ] [ flushable-test-2 ] unit-test + +: ax ; +: bx ax ; +[ \ bx forget ] with-compilation-unit + +[ t ] [ \ ax compiled-usage [ drop interned? ] assoc-all? ] unit-test diff --git a/core/words/words.factor b/core/words/words.factor index 6d8bad4f9e..5dc89212a8 100755 --- a/core/words/words.factor +++ b/core/words/words.factor @@ -87,6 +87,25 @@ M: wrapper (quot-uses) >r wrapped r> (quot-uses) ; M: word uses ( word -- seq ) word-def quot-uses keys ; +SYMBOL: compiled-crossref + +compiled-crossref global [ H{ } assoc-like ] change-at + +: compiled-xref ( word dependencies -- ) + 2dup "compiled-uses" set-word-prop + compiled-crossref get add-vertex* ; + +: compiled-unxref ( word -- ) + dup "compiled-uses" word-prop + compiled-crossref get remove-vertex* ; + +: delete-compiled-xref ( word -- ) + dup compiled-unxref + compiled-crossref get delete-at ; + +: compiled-usage ( word -- assoc ) + compiled-crossref get at ; + M: word redefined* ( word -- ) { "inferred-effect" "base-case" "no-effect" } reset-props ; @@ -187,6 +206,7 @@ M: word (forget-word) : forget-word ( word -- ) dup delete-xref + dup delete-compiled-xref (forget-word) ; M: word forget* forget-word ; From af915caaa358ba74282f1f42997b206517723864 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Thu, 24 Jan 2008 03:27:15 -0400 Subject: [PATCH 074/216] Add wait-for-process word to io.launcher; run-process and run-detached now return process tuples --- extra/io/launcher/launcher-docs.factor | 40 +++++++++--- extra/io/launcher/launcher.factor | 43 ++++++++++--- extra/io/windows/launcher/launcher.factor | 66 +++++++++++++++----- extra/io/windows/nt/launcher/launcher.factor | 2 +- extra/windows/kernel32/kernel32.factor | 4 +- 5 files changed, 118 insertions(+), 37 deletions(-) diff --git a/extra/io/launcher/launcher-docs.factor b/extra/io/launcher/launcher-docs.factor index 7ad5e064bf..2c30431714 100755 --- a/extra/io/launcher/launcher-docs.factor +++ b/extra/io/launcher/launcher-docs.factor @@ -1,6 +1,6 @@ -! Copyright (C) 2007 Slava Pestov. +! Copyright (C) 2007, 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: help.markup help.syntax quotations kernel ; +USING: help.markup help.syntax quotations kernel io math ; IN: io.launcher HELP: +command+ @@ -58,7 +58,7 @@ HELP: get-environment { $description "Combines the current environment with the value of " { $link +environment+ } " using " { $link +environment-mode+ } "." } ; HELP: run-process* -{ $values { "desc" "a launch descriptor" } } +{ $values { "desc" "a launch descriptor" } { "handle" "a process handle" } } { $contract "Launches a process using the launch descriptor." } { $notes "User code should call " { $link run-process } " instead." } ; @@ -73,22 +73,41 @@ HELP: >descriptor } ; HELP: run-process -{ $values { "obj" object } } -{ $contract "Launches a process. The object can either be a string, a sequence of strings or a launch descriptor. See " { $link >descriptor } " for details." } ; +{ $values { "obj" object } { "process" process } } +{ $description "Launches a process. The object can either be a string, a sequence of strings or a launch descriptor. See " { $link >descriptor } " for details." } +{ $notes "The output value can be passed to " { $link wait-for-process } " to get an exit code." } ; HELP: run-detached -{ $values { "obj" object } } +{ $values { "obj" object } { "process" process } } { $contract "Launches a process without waiting for it to complete. The object can either be a string, a sequence of strings or a launch descriptor. See " { $link >descriptor } " for details." } { $notes "This word is functionally identical to passing a launch descriptor to " { $link run-process } " having the " { $link +detached+ } " key set." + $nl + "The output value can be passed to " { $link wait-for-process } " to get an exit code." } ; +HELP: process +{ $class-description "A class representing an active or finished process." +$nl +"Processes are output by " { $link run-process } " and " { $link run-detached } ", and are stored in the " { $link process-stream-process } " slot of " { $link process-stream } " instances." +$nl +"Processes can be passed to " { $link wait-for-process } "." } ; + +HELP: process-stream +{ $class-description "A bidirectional stream for interacting with a running process. Instances are created by calling " { $link } ". The " { $link process-stream-process } " slot holds a " { $link process } " instance." } ; + HELP: { $values { "obj" object } { "stream" "a bidirectional stream" } } { $description "Launches a process and redirects its input and output via a pair of pipes which may be read and written as a stream." } { $notes "Closing the stream will block until the process exits." } ; -{ run-process run-detached } related-words +HELP: with-process-stream +{ $values { "obj" object } { "quot" quotation } { "process" process } } +{ $description "Calls " { $snippet "quot" } " in a dynamic scope where " { $link stdio } " is rebound to a " { $link process-stream } ". When the quotation returns, the " { $link process } " instance is output." } ; + +HELP: wait-for-process +{ $values { "process" process } { "status" integer } } +{ $description "If the process is still running, waits for it to exit, otherwise outputs the exit code immediately. Can be called multiple times on the same process." } ; ARTICLE: "io.launcher" "Launching OS processes" "The " { $vocab-link "io.launcher" } " vocabulary implements cross-platform process launching." @@ -108,6 +127,11 @@ $nl "The following words are used to launch processes:" { $subsection run-process } { $subsection run-detached } -{ $subsection } ; +{ $subsection } +{ $subsection with-process-stream } +"A class representing an active or finished process:" +{ $subsection process } +"Waiting for a process to end, or getting the exit code of a finished process:" +{ $subsection wait-for-process } ; ABOUT: "io.launcher" diff --git a/extra/io/launcher/launcher.factor b/extra/io/launcher/launcher.factor index 806b56a092..decf4f3434 100755 --- a/extra/io/launcher/launcher.factor +++ b/extra/io/launcher/launcher.factor @@ -1,9 +1,17 @@ -! Copyright (C) 2007 Slava Pestov. +! Copyright (C) 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: io.backend system kernel namespaces strings hashtables +USING: io io.backend system kernel namespaces strings hashtables sequences assocs combinators vocabs.loader ; IN: io.launcher +TUPLE: process handle status ; + +: ( handle -- process ) f process construct-boa ; + +M: process equal? 2drop f ; + +M: process hashcode* process-handle hashcode* ; + SYMBOL: +command+ SYMBOL: +arguments+ SYMBOL: +detached+ @@ -44,15 +52,32 @@ M: string >descriptor +command+ associate ; M: sequence >descriptor +arguments+ associate ; M: assoc >descriptor ; -HOOK: run-process* io-backend ( desc -- ) +HOOK: run-process* io-backend ( desc -- handle ) -: run-process ( obj -- ) - >descriptor run-process* ; +HOOK: wait-for-process* io-backend ( process -- ) -: run-detached ( obj -- ) - >descriptor H{ { +detached+ t } } union run-process* ; +: wait-for-process ( process -- status ) + dup process-handle [ dup wait-for-process* ] when + process-status ; -HOOK: process-stream* io-backend ( desc -- stream ) +: run-process ( obj -- process ) + >descriptor + dup run-process* + +detached+ rot at [ dup wait-for-process drop ] unless ; + +: run-detached ( obj -- process ) + >descriptor H{ { +detached+ t } } union run-process ; + +HOOK: process-stream* io-backend ( desc -- stream process ) + +TUPLE: process-stream process ; : ( obj -- stream ) - >descriptor process-stream* ; + >descriptor process-stream* + { set-delegate set-process-stream-process } + process-stream construct ; + +: with-process-stream ( obj quot -- process ) + swap + [ swap with-stream ] keep + process-stream-process ; inline diff --git a/extra/io/windows/launcher/launcher.factor b/extra/io/windows/launcher/launcher.factor index 136c8197fc..603fa2a638 100755 --- a/extra/io/windows/launcher/launcher.factor +++ b/extra/io/windows/launcher/launcher.factor @@ -1,11 +1,19 @@ -! Copyright (C) 2007 Doug Coleman, Slava Pestov. +! Copyright (C) 2007, 2008 Doug Coleman, Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: alien alien.c-types arrays continuations destructors io io.windows libc io.nonblocking io.streams.duplex windows.types math windows.kernel32 windows namespaces io.launcher kernel -sequences windows.errors assocs splitting system ; +sequences windows.errors assocs splitting system threads init ; IN: io.windows.launcher +SYMBOL: processes + +[ H{ } clone processes set-global ] +"io.windows.launcher" add-init-hook + +: ( handle -- process ) + V{ } clone over processes get set-at ; + TUPLE: CreateProcess-args lpApplicationName lpCommandLine @@ -19,13 +27,6 @@ TUPLE: CreateProcess-args lpProcessInformation stdout-pipe stdin-pipe ; -: dispose-CreateProcess-args ( args -- ) - #! From MSDN: "Handles in PROCESS_INFORMATION must be closed - #! with CloseHandle when they are no longer needed." - CreateProcess-args-lpProcessInformation dup - PROCESS_INFORMATION-hProcess [ CloseHandle drop ] when* - PROCESS_INFORMATION-hThread [ CloseHandle drop ] when* ; - : default-CreateProcess-args ( -- obj ) 0 0 @@ -93,21 +94,52 @@ TUPLE: CreateProcess-args over set-CreateProcess-args-lpEnvironment ] when ; -: wait-for-process ( args -- ) - CreateProcess-args-lpProcessInformation - PROCESS_INFORMATION-hProcess INFINITE - WaitForSingleObject drop ; - : make-CreateProcess-args ( -- args ) default-CreateProcess-args wince? [ fill-lpApplicationName ] [ fill-lpCommandLine ] if fill-dwCreateFlags fill-lpEnvironment ; -M: windows-io run-process* ( desc -- ) +M: windows-io run-process* ( desc -- handle ) [ make-CreateProcess-args dup call-CreateProcess - +detached+ get [ dup wait-for-process ] unless - dispose-CreateProcess-args + CreateProcess-args-lpProcessInformation ] with-descriptor ; + +M: windows-io wait-for-process* + [ processes get at push stop ] curry callcc0 ; + +: dispose-process ( process-information -- ) + #! From MSDN: "Handles in PROCESS_INFORMATION must be closed + #! with CloseHandle when they are no longer needed." + dup PROCESS_INFORMATION-hProcess [ CloseHandle drop ] when* + PROCESS_INFORMATION-hThread [ CloseHandle drop ] when* ; + +: exit-code ( process -- n ) + PROCESS_INFORMATION-hProcess + 0 [ GetExitCodeProcess ] keep *ulong + swap win32-error=0/f ; + +: notify-exit ( process -- ) + dup process-handle exit-code over set-process-status + dup process-handle dispose-process + dup processes get delete-at* drop [ schedule-thread ] each + f swap set-process-handle ; + +: wait-for-processes ( processes -- ? ) + keys dup + [ process-handle PROCESS_INFORMATION-hProcess ] map + dup length swap >c-void*-array 0 0 + WaitForMultipleObjects + dup HEX: ffffffff = [ win32-error ] when + dup WAIT_TIMEOUT = [ 2drop t ] [ swap nth notify-exit f ] if ; + +: wait-loop ( -- ) + processes get dup assoc-empty? + [ drop t ] [ wait-for-processes ] if + [ 250 sleep ] when + wait-loop ; + +: start-wait-thread ( -- ) + [ wait-loop ] in-thread ; diff --git a/extra/io/windows/nt/launcher/launcher.factor b/extra/io/windows/nt/launcher/launcher.factor index 3ee0e05e32..6e788003ea 100755 --- a/extra/io/windows/nt/launcher/launcher.factor +++ b/extra/io/windows/nt/launcher/launcher.factor @@ -59,6 +59,6 @@ M: windows-io process-stream* dup CreateProcess-args-stdout-pipe pipe-in over CreateProcess-args-stdin-pipe pipe-out - swap dispose-CreateProcess-args + swap CreateProcess-args-lpProcessInformation ] with-destructors ] with-descriptor ; diff --git a/extra/windows/kernel32/kernel32.factor b/extra/windows/kernel32/kernel32.factor index 5e0f4ddc65..1c75e33698 100755 --- a/extra/windows/kernel32/kernel32.factor +++ b/extra/windows/kernel32/kernel32.factor @@ -898,7 +898,7 @@ FUNCTION: HANDLE GetCurrentThread ( ) ; ! FUNCTION: GetEnvironmentStringsW ! FUNCTION: GetEnvironmentVariableA ! FUNCTION: GetEnvironmentVariableW -! FUNCTION: GetExitCodeProcess +FUNCTION: BOOL GetExitCodeProcess ( HANDLE hProcess, LPDWORD lpExitCode ) ; ! FUNCTION: GetExitCodeThread ! FUNCTION: GetExpandedNameA ! FUNCTION: GetExpandedNameW @@ -1496,7 +1496,7 @@ FUNCTION: BOOL VirtualQueryEx ( HANDLE hProcess, void* lpAddress, MEMORY_BASIC_I ! FUNCTION: VirtualUnlock ! FUNCTION: WaitCommEvent ! FUNCTION: WaitForDebugEvent -! FUNCTION: WaitForMultipleObjects +FUNCTION: DWORD WaitForMultipleObjects ( DWORD nCount, HANDLE* lpHandles, BOOL bWaitAll, DWORD dwMilliseconds ) ; ! FUNCTION: WaitForMultipleObjectsEx FUNCTION: BOOL WaitForSingleObject ( HANDLE hHandle, DWORD dwMilliseconds ) ; ! FUNCTION: WaitForSingleObjectEx From d621b9852eb6ab3c2127da859f3ef4875c525942 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Thu, 24 Jan 2008 03:50:40 -0400 Subject: [PATCH 075/216] Updating extra/ for launcher changes --- extra/editors/editpadpro/editpadpro.factor | 4 +++- extra/editors/editplus/editplus.factor | 4 ++-- extra/editors/emacs/emacs.factor | 7 +++++-- extra/editors/emeditor/emeditor.factor | 5 ++--- extra/editors/notepadpp/notepadpp.factor | 5 +++-- extra/editors/scite/scite.factor | 13 ++++++------- extra/editors/ted-notepad/ted-notepad.factor | 5 ++--- extra/editors/textmate/textmate.factor | 3 ++- extra/editors/ultraedit/ultraedit.factor | 4 ++-- extra/editors/vim/vim.factor | 8 +++++--- extra/editors/wordpad/wordpad.factor | 4 +--- extra/tools/deploy/macosx/macosx.factor | 4 ++-- 12 files changed, 35 insertions(+), 31 deletions(-) mode change 100644 => 100755 extra/editors/editpadpro/editpadpro.factor mode change 100644 => 100755 extra/editors/emacs/emacs.factor mode change 100644 => 100755 extra/editors/notepadpp/notepadpp.factor mode change 100644 => 100755 extra/editors/scite/scite.factor mode change 100644 => 100755 extra/editors/ted-notepad/ted-notepad.factor mode change 100644 => 100755 extra/editors/textmate/textmate.factor mode change 100644 => 100755 extra/editors/ultraedit/ultraedit.factor mode change 100644 => 100755 extra/editors/vim/vim.factor mode change 100644 => 100755 extra/editors/wordpad/wordpad.factor diff --git a/extra/editors/editpadpro/editpadpro.factor b/extra/editors/editpadpro/editpadpro.factor old mode 100644 new mode 100755 index 69a9e2badd..885349e27b --- a/extra/editors/editpadpro/editpadpro.factor +++ b/extra/editors/editpadpro/editpadpro.factor @@ -10,6 +10,8 @@ IN: editors.editpadpro ] unless* ; : editpadpro ( file line -- ) - [ editpadpro-path % " /l" % # " \"" % % "\"" % ] "" make run-detached ; + [ + editpadpro-path , "/l" swap number>string append , , + ] { } make run-detached drop ; [ editpadpro ] edit-hook set-global diff --git a/extra/editors/editplus/editplus.factor b/extra/editors/editplus/editplus.factor index bff523b50d..feaa177954 100755 --- a/extra/editors/editplus/editplus.factor +++ b/extra/editors/editplus/editplus.factor @@ -9,7 +9,7 @@ IN: editors.editplus : editplus ( file line -- ) [ - editplus-path % " -cursor " % # " " % % - ] "" make run-detached ; + editplus-path , "-cursor" , number>string , , + ] { } make run-detached drop ; [ editplus ] edit-hook set-global diff --git a/extra/editors/emacs/emacs.factor b/extra/editors/emacs/emacs.factor old mode 100644 new mode 100755 index e131179755..31e0761043 --- a/extra/editors/emacs/emacs.factor +++ b/extra/editors/emacs/emacs.factor @@ -4,8 +4,11 @@ IN: editors.emacs : emacsclient ( file line -- ) [ - "emacsclient --no-wait +" % # " " % % - ] "" make run-process ; + "emacsclient" , + "--no-wait" , + "+" swap number>string append , + , + ] { } make run-process drop ; : emacs ( word -- ) where first2 emacsclient ; diff --git a/extra/editors/emeditor/emeditor.factor b/extra/editors/emeditor/emeditor.factor index 2caa42b480..bed333694c 100755 --- a/extra/editors/emeditor/emeditor.factor +++ b/extra/editors/emeditor/emeditor.factor @@ -9,8 +9,7 @@ IN: editors.emeditor : emeditor ( file line -- ) [ - emeditor-path % " /l " % # - " " % "\"" % % "\"" % - ] "" make run-detached ; + emeditor-path , "/l" , number>string , , + ] { } make run-detached drop ; [ emeditor ] edit-hook set-global diff --git a/extra/editors/notepadpp/notepadpp.factor b/extra/editors/notepadpp/notepadpp.factor old mode 100644 new mode 100755 index 4f3fde917d..f9fa95f175 --- a/extra/editors/notepadpp/notepadpp.factor +++ b/extra/editors/notepadpp/notepadpp.factor @@ -9,7 +9,8 @@ IN: editors.notepadpp : notepadpp ( file line -- ) [ - notepadpp-path % " -n" % # " " % % - ] "" make run-detached ; + notepadpp-path , + "-n" swap number>string append , , + ] "" make run-detached drop ; [ notepadpp ] edit-hook set-global diff --git a/extra/editors/scite/scite.factor b/extra/editors/scite/scite.factor old mode 100644 new mode 100755 index 529d11b722..bc9a98a051 --- a/extra/editors/scite/scite.factor +++ b/extra/editors/scite/scite.factor @@ -18,14 +18,13 @@ SYMBOL: scite-path : scite-command ( file line -- cmd ) swap - [ scite-path get % - " \"" % - % - "\" -goto:" % - # - ] "" make ; + [ + scite-path get , + , + "-goto:" swap number>string append , + ] { } make ; : scite-location ( file line -- ) - scite-command run-detached ; + scite-command run-detached drop ; [ scite-location ] edit-hook set-global diff --git a/extra/editors/ted-notepad/ted-notepad.factor b/extra/editors/ted-notepad/ted-notepad.factor old mode 100644 new mode 100755 index b56ee0a08b..5d58e182a3 --- a/extra/editors/ted-notepad/ted-notepad.factor +++ b/extra/editors/ted-notepad/ted-notepad.factor @@ -9,8 +9,7 @@ IN: editors.ted-notepad : ted-notepad ( file line -- ) [ - ted-notepad-path % " /l" % # - " " % % - ] "" make run-detached ; + ted-notepad-path , "/l" swap number>string append , , + ] { } make run-detached drop ; [ ted-notepad ] edit-hook set-global diff --git a/extra/editors/textmate/textmate.factor b/extra/editors/textmate/textmate.factor old mode 100644 new mode 100755 index 18c7dbd07e..0145ccae81 --- a/extra/editors/textmate/textmate.factor +++ b/extra/editors/textmate/textmate.factor @@ -4,6 +4,7 @@ namespaces prettyprint editors ; IN: editors.textmate : textmate-location ( file line -- ) - [ "mate -a -l " % # " " % unparse % ] "" make run-process ; + [ "mate" , "-a" , "-l" , number>string , , ] { } make + run-process drop ; [ textmate-location ] edit-hook set-global diff --git a/extra/editors/ultraedit/ultraedit.factor b/extra/editors/ultraedit/ultraedit.factor old mode 100644 new mode 100755 index 50c241daea..7da4b807ce --- a/extra/editors/ultraedit/ultraedit.factor +++ b/extra/editors/ultraedit/ultraedit.factor @@ -10,8 +10,8 @@ IN: editors.ultraedit : ultraedit ( file line -- ) [ - ultraedit-path % " " % swap % "/" % # "/1" % - ] "" make run-detached ; + ultraedit-path , [ % "/" % # "/1" % ] "" make , + ] { } make run-detached drop ; [ ultraedit ] edit-hook set-global diff --git a/extra/editors/vim/vim.factor b/extra/editors/vim/vim.factor old mode 100644 new mode 100755 index 040e3fb4b4..8d60942d67 --- a/extra/editors/vim/vim.factor +++ b/extra/editors/vim/vim.factor @@ -10,13 +10,15 @@ HOOK: vim-command vim-editor TUPLE: vim ; -M: vim vim-command ( file line -- string ) - [ "\"" % vim-path get % "\" \"" % swap % "\" +" % # ] "" make ; +M: vim vim-command ( file line -- array ) + [ + vim-path get , swap , "+" swap number>string append , + ] { } make ; : vim-location ( file line -- ) vim-command vim-detach get-global - [ run-detached ] [ run-process ] if ; + [ run-detached ] [ run-process ] if drop ; "vim" vim-path set-global [ vim-location ] edit-hook set-global diff --git a/extra/editors/wordpad/wordpad.factor b/extra/editors/wordpad/wordpad.factor old mode 100644 new mode 100755 index eb882a9e38..0a86250a92 --- a/extra/editors/wordpad/wordpad.factor +++ b/extra/editors/wordpad/wordpad.factor @@ -8,8 +8,6 @@ IN: editors.wordpad ] unless* ; : wordpad ( file line -- ) - [ - wordpad-path % drop " " % "\"" % % "\"" % - ] "" make run-detached ; + drop wordpad-path swap 2array run-detached drop ; [ wordpad ] edit-hook set-global diff --git a/extra/tools/deploy/macosx/macosx.factor b/extra/tools/deploy/macosx/macosx.factor index 7b44703013..7efb34a6ae 100755 --- a/extra/tools/deploy/macosx/macosx.factor +++ b/extra/tools/deploy/macosx/macosx.factor @@ -8,10 +8,10 @@ QUALIFIED: unix IN: tools.deploy.macosx : touch ( path -- ) - { "touch" } swap add run-process ; + { "touch" } swap add run-process drop ; : rm ( path -- ) - { "rm" "-rf" } swap add run-process ; + { "rm" "-rf" } swap add run-process drop ; : bundle-dir ( -- dir ) vm parent-directory parent-directory ; From 6afa4119c8e3519e182b2163bd0402c79ba5cec4 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Thu, 24 Jan 2008 04:19:15 -0400 Subject: [PATCH 076/216] Clean up non-blocking wait-for-process support, implement on Unix (untested) --- extra/io/launcher/launcher.factor | 29 +++++++-- extra/io/unix/bsd/bsd.factor | 4 +- extra/io/unix/kqueue/kqueue.factor | 18 ++---- extra/io/unix/launcher/launcher.factor | 63 ++++++++++---------- extra/io/unix/linux/linux.factor | 5 +- extra/io/windows/launcher/launcher.factor | 26 +++----- extra/io/windows/nt/launcher/launcher.factor | 2 +- extra/unix/process/process.factor | 22 +------ 8 files changed, 72 insertions(+), 97 deletions(-) mode change 100644 => 100755 extra/io/unix/kqueue/kqueue.factor mode change 100644 => 100755 extra/unix/process/process.factor diff --git a/extra/io/launcher/launcher.factor b/extra/io/launcher/launcher.factor index decf4f3434..c646358b2e 100755 --- a/extra/io/launcher/launcher.factor +++ b/extra/io/launcher/launcher.factor @@ -1,12 +1,25 @@ ! Copyright (C) 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: io io.backend system kernel namespaces strings hashtables -sequences assocs combinators vocabs.loader ; +sequences assocs combinators vocabs.loader init threads +continuations ; IN: io.launcher +! Non-blocking process exit notification facility +SYMBOL: processes + +[ H{ } clone processes set-global ] "io.launcher" add-init-hook + TUPLE: process handle status ; -: ( handle -- process ) f process construct-boa ; +HOOK: register-process io-backend ( process -- ) + +M: object register-process drop ; + +: ( handle -- process ) + f process construct-boa + V{ } clone over processes get set-at + dup register-process ; M: process equal? 2drop f ; @@ -54,11 +67,10 @@ M: assoc >descriptor ; HOOK: run-process* io-backend ( desc -- handle ) -HOOK: wait-for-process* io-backend ( process -- ) - : wait-for-process ( process -- status ) - dup process-handle [ dup wait-for-process* ] when - process-status ; + dup process-handle [ + dup [ processes get at push stop ] curry callcc0 + ] when process-status ; : run-process ( obj -- process ) >descriptor @@ -81,3 +93,8 @@ TUPLE: process-stream process ; swap [ swap with-stream ] keep process-stream-process ; inline + +: notify-exit ( status process -- ) + [ set-process-status ] keep + [ processes get delete-at* drop [ schedule-thread ] each ] keep + f swap set-process-handle ; diff --git a/extra/io/unix/bsd/bsd.factor b/extra/io/unix/bsd/bsd.factor index 39eb8b6fb9..3319324c3d 100755 --- a/extra/io/unix/bsd/bsd.factor +++ b/extra/io/unix/bsd/bsd.factor @@ -23,7 +23,7 @@ M: bsd-io init-io ( -- ) 2dup mx get-global mx-reads set-at mx get-global mx-writes set-at ; -M: bsd-io wait-for-process ( pid -- status ) - [ kqueue-mx get-global add-pid-task stop ] curry callcc1 ; +M: bsd-io register-process ( process -- ) + process-handle kqueue-mx get-global add-pid-task ; T{ bsd-io } set-io-backend diff --git a/extra/io/unix/kqueue/kqueue.factor b/extra/io/unix/kqueue/kqueue.factor old mode 100644 new mode 100755 index 4fbfbcaaf0..3df2d7cd57 --- a/extra/io/unix/kqueue/kqueue.factor +++ b/extra/io/unix/kqueue/kqueue.factor @@ -5,7 +5,7 @@ sequences assocs unix unix.kqueue unix.process math namespaces combinators threads vectors ; IN: io.unix.kqueue -TUPLE: kqueue-mx events processes ; +TUPLE: kqueue-mx events ; : max-events ( -- n ) #! We read up to 256 events at a time. This is an arbitrary @@ -15,7 +15,6 @@ TUPLE: kqueue-mx events processes ; : ( -- mx ) kqueue-mx construct-mx kqueue dup io-error over set-mx-fd - H{ } clone over set-kqueue-mx-processes max-events "kevent" over set-kqueue-mx-events ; GENERIC: io-task-filter ( task -- n ) @@ -52,9 +51,8 @@ M: kqueue-mx unregister-io-task ( task mx -- ) over mx-reads at handle-io-task ; : kevent-proc-task ( mx pid -- ) - dup (wait-for-pid) spin kqueue-mx-processes delete-at* [ - [ schedule-thread-with ] with each - ] [ 2drop ] if ; + dup (wait-for-pid) swap find-process + dup [ notify-exit ] [ 2drop ] if ; : handle-kevent ( mx kevent -- ) dup kevent-ident swap kevent-filter { @@ -76,11 +74,5 @@ M: kqueue-mx wait-for-events ( ms mx -- ) EVFILT_PROC over set-kevent-filter NOTE_EXIT over set-kevent-fflags ; -: add-pid-task ( continuation pid mx -- ) - 2dup kqueue-mx-processes at* [ - 2nip push - ] [ - drop - over make-proc-kevent over register-kevent - >r >r 1vector r> r> kqueue-mx-processes set-at - ] if ; +: add-pid-task ( pid mx -- ) + swap make-proc-kevent swap register-kevent ; diff --git a/extra/io/unix/launcher/launcher.factor b/extra/io/unix/launcher/launcher.factor index adf571a8b7..3cd21e6c51 100755 --- a/extra/io/unix/launcher/launcher.factor +++ b/extra/io/unix/launcher/launcher.factor @@ -9,10 +9,6 @@ IN: io.unix.launcher ! Search unix first USE: unix -HOOK: wait-for-process io-backend ( pid -- status ) - -M: unix-io wait-for-process ( pid -- status ) wait-for-pid ; - ! Our command line parser. Supported syntax: ! foo bar baz -- simple tokens ! foo\ bar -- escaping the space @@ -46,7 +42,7 @@ MEMO: 'arguments' ( -- parser ) : assoc>env ( assoc -- env ) [ "=" swap 3append ] { } assoc>map ; -: (spawn-process) ( -- ) +: spawn-process ( -- ) [ get-arguments pass-environment? @@ -55,20 +51,9 @@ MEMO: 'arguments' ( -- parser ) io-error ] [ error. :c flush ] recover 1 exit ; -: spawn-process ( -- pid ) - [ (spawn-process) ] [ ] with-fork ; - -: spawn-detached ( -- ) - [ spawn-process 0 exit ] [ ] with-fork - wait-for-process drop ; - -M: unix-io run-process* ( desc -- ) +M: unix-io run-process* ( desc -- pid ) [ - +detached+ get [ - spawn-detached - ] [ - spawn-process wait-for-process drop - ] if + [ spawn-process ] [ ] with-fork ] with-descriptor ; : open-pipe ( -- pair ) @@ -82,21 +67,35 @@ M: unix-io run-process* ( desc -- ) : spawn-process-stream ( -- in out pid ) open-pipe open-pipe [ setup-stdio-pipe - (spawn-process) + spawn-process ] [ -rot 2dup second close first close - ] with-fork first swap second rot ; - -TUPLE: pipe-stream pid status ; - -: ( in out pid -- stream ) - f pipe-stream construct-boa - -rot handle>duplex-stream over set-delegate ; - -M: pipe-stream stream-close - dup delegate stream-close - dup pipe-stream-pid wait-for-process - swap set-pipe-stream-status ; + ] with-fork first swap second rot ; M: unix-io process-stream* - [ spawn-process-stream ] with-descriptor ; + [ + spawn-process-stream >r handle>duplex-stream r> + ] with-descriptor ; + +: find-process ( handle -- process ) + f process construct-boa processes get at ; + +! Inefficient process wait polling, used on Linux and Solaris. +! On BSD and Mac OS X, we use kqueue() which scales better. +: wait-for-processes ( -- ? ) + -1 0 tuck WNOHANG waitpid + dup zero? [ + 2drop t + ] [ + find-process dup [ + >r *uint r> notify-exit f + ] [ + 2drop f + ] if + ] if ; + +: wait-loop ( -- ) + wait-for-processes [ 250 sleep ] when wait-loop ; + +: start-wait-thread ( -- ) + [ wait-loop ] in-thread ; diff --git a/extra/io/unix/linux/linux.factor b/extra/io/unix/linux/linux.factor index 06380c7e1e..fcb48dd577 100755 --- a/extra/io/unix/linux/linux.factor +++ b/extra/io/unix/linux/linux.factor @@ -10,9 +10,6 @@ INSTANCE: linux-io unix-io M: linux-io init-io ( -- ) mx set-global - start-wait-loop ; - -M: linux-io wait-for-process ( pid -- status ) - wait-for-pid ; + start-wait-thread ; T{ linux-io } set-io-backend diff --git a/extra/io/windows/launcher/launcher.factor b/extra/io/windows/launcher/launcher.factor index 603fa2a638..79284b265b 100755 --- a/extra/io/windows/launcher/launcher.factor +++ b/extra/io/windows/launcher/launcher.factor @@ -6,14 +6,6 @@ math windows.kernel32 windows namespaces io.launcher kernel sequences windows.errors assocs splitting system threads init ; IN: io.windows.launcher -SYMBOL: processes - -[ H{ } clone processes set-global ] -"io.windows.launcher" add-init-hook - -: ( handle -- process ) - V{ } clone over processes get set-at ; - TUPLE: CreateProcess-args lpApplicationName lpCommandLine @@ -104,12 +96,9 @@ M: windows-io run-process* ( desc -- handle ) [ make-CreateProcess-args dup call-CreateProcess - CreateProcess-args-lpProcessInformation + CreateProcess-args-lpProcessInformation ] with-descriptor ; -M: windows-io wait-for-process* - [ processes get at push stop ] curry callcc0 ; - : dispose-process ( process-information -- ) #! From MSDN: "Handles in PROCESS_INFORMATION must be closed #! with CloseHandle when they are no longer needed." @@ -121,11 +110,10 @@ M: windows-io wait-for-process* 0 [ GetExitCodeProcess ] keep *ulong swap win32-error=0/f ; -: notify-exit ( process -- ) - dup process-handle exit-code over set-process-status - dup process-handle dispose-process - dup processes get delete-at* drop [ schedule-thread ] each - f swap set-process-handle ; +: process-exited ( process -- ) + dup process-handle exit-code + over process-handle dispose-process + swap notify-exit ; : wait-for-processes ( processes -- ? ) keys dup @@ -133,7 +121,7 @@ M: windows-io wait-for-process* dup length swap >c-void*-array 0 0 WaitForMultipleObjects dup HEX: ffffffff = [ win32-error ] when - dup WAIT_TIMEOUT = [ 2drop t ] [ swap nth notify-exit f ] if ; + dup WAIT_TIMEOUT = [ 2drop t ] [ swap nth process-exited f ] if ; : wait-loop ( -- ) processes get dup assoc-empty? @@ -143,3 +131,5 @@ M: windows-io wait-for-process* : start-wait-thread ( -- ) [ wait-loop ] in-thread ; + +[ start-wait-thread ] "io.windows.launcher" add-init-hook diff --git a/extra/io/windows/nt/launcher/launcher.factor b/extra/io/windows/nt/launcher/launcher.factor index 6e788003ea..bfce92e17d 100755 --- a/extra/io/windows/nt/launcher/launcher.factor +++ b/extra/io/windows/nt/launcher/launcher.factor @@ -59,6 +59,6 @@ M: windows-io process-stream* dup CreateProcess-args-stdout-pipe pipe-in over CreateProcess-args-stdin-pipe pipe-out - swap CreateProcess-args-lpProcessInformation + swap CreateProcess-args-lpProcessInformation ] with-destructors ] with-descriptor ; diff --git a/extra/unix/process/process.factor b/extra/unix/process/process.factor old mode 100644 new mode 100755 index b2877dc4a1..fb4271ea23 --- a/extra/unix/process/process.factor +++ b/extra/unix/process/process.factor @@ -31,25 +31,5 @@ IN: unix.process : with-fork ( child parent -- ) fork dup zero? -roll swap curry if ; inline -! Lame polling strategy for getting process exit codes. On -! BSD, we use kqueue which is more efficient. - -SYMBOL: pid-wait - -: (wait-for-pid) ( pid -- status ) - 0 [ 0 waitpid drop ] keep *int ; - : wait-for-pid ( pid -- status ) - [ pid-wait get-global [ ?push ] change-at stop ] curry - callcc1 ; - -: wait-loop ( -- ) - -1 0 tuck WNOHANG waitpid ! &status return - [ *int ] [ pid-wait get delete-at* drop ] bi* ! status ? - [ schedule-thread-with ] with each - 250 sleep - wait-loop ; - -: start-wait-loop ( -- ) - H{ } clone pid-wait set-global - [ wait-loop ] in-thread ; \ No newline at end of file + 0 [ 0 waitpid drop ] keep *int ; \ No newline at end of file From 6d5c1bf1d2ce420da8b9ceafe4a396e6acfec361 Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Thu, 24 Jan 2008 18:12:39 -0500 Subject: [PATCH 077/216] Add more math.constants --- extra/math/constants/constants-docs.factor | 9 +++++++++ extra/math/constants/constants.factor | 2 ++ 2 files changed, 11 insertions(+) diff --git a/extra/math/constants/constants-docs.factor b/extra/math/constants/constants-docs.factor index 92c96985c3..653444376a 100755 --- a/extra/math/constants/constants-docs.factor +++ b/extra/math/constants/constants-docs.factor @@ -4,6 +4,8 @@ IN: math.constants ARTICLE: "math-constants" "Constants" "Standard mathematical constants:" { $subsection e } +{ $subsection gamma } +{ $subsection phi } { $subsection pi } "Various limits:" { $subsection most-positive-fixnum } @@ -15,6 +17,13 @@ ABOUT: "math-constants" HELP: e { $values { "e" "base of natural logarithm" } } ; +HELP: gamma +{ $values { "gamma" "Euler-Mascheroni constant" } } +{ $description "The Euler-Mascheroni constant, also called \"Euler's constant\" or \"the Euler constant\"." } ; + +HELP: phi +{ $values { "phi" "golden ratio" } } ; + HELP: pi { $values { "pi" "circumference of circle with diameter 1" } } ; diff --git a/extra/math/constants/constants.factor b/extra/math/constants/constants.factor index e2d7c4f433..7e2b8842ad 100755 --- a/extra/math/constants/constants.factor +++ b/extra/math/constants/constants.factor @@ -3,5 +3,7 @@ IN: math.constants : e ( -- e ) 2.7182818284590452354 ; inline +: gamma ( -- gamma ) 0.57721566490153286060 ; inline : pi ( -- pi ) 3.14159265358979323846 ; inline +: phi ( -- phi ) 1.61803398874989484820 ; inline : epsilon ( -- epsilon ) 2.2204460492503131e-16 ; inline From 6df78419b9930e3d3a95a39a8abb533c333a63e8 Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Thu, 24 Jan 2008 18:18:12 -0500 Subject: [PATCH 078/216] Fix uses of new math constants --- extra/golden-section/golden-section.factor | 53 ++++++++++------------ extra/project-euler/025/025.factor | 7 +-- 2 files changed, 27 insertions(+), 33 deletions(-) diff --git a/extra/golden-section/golden-section.factor b/extra/golden-section/golden-section.factor index 9dd3a747ed..ef6f1ca4c2 100644 --- a/extra/golden-section/golden-section.factor +++ b/extra/golden-section/golden-section.factor @@ -1,28 +1,25 @@ -USING: kernel namespaces math math.constants math.functions -arrays sequences opengl opengl.gl opengl.glu ui ui.render -ui.gadgets ui.gadgets.theme ui.gadgets.slate colors ; +USING: kernel namespaces math math.constants math.functions arrays sequences + opengl opengl.gl opengl.glu ui ui.render ui.gadgets ui.gadgets.theme + ui.gadgets.slate colors ; IN: golden-section ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! To run: -! -! "demos.golden-section" run +! "golden-section" run ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : disk ( quadric radius center -- ) -glPushMatrix -gl-translate -dup 0 glScalef -0 1 10 10 gluDisk -glPopMatrix ; + glPushMatrix + gl-translate + dup 0 glScalef + 0 1 10 10 gluDisk + glPopMatrix ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -: phi ( -- phi ) 5 sqrt 1 + 2 / 1 - ; - -: omega ( i -- omega ) phi * 2 * pi * ; +: omega ( i -- omega ) phi 1- * 2 * pi * ; : x ( i -- x ) dup omega cos * 0.5 * ; @@ -35,10 +32,10 @@ glPopMatrix ; : color ( i -- color ) 360.0 / dup 0.25 1 4array ; : rim ( quadric i -- ) -black gl-color dup radius 1.5 * swap center disk ; + black gl-color dup radius 1.5 * swap center disk ; : inner ( quadric i -- ) -dup color gl-color dup radius swap center disk ; + dup color gl-color dup radius swap center disk ; : dot ( quadric i -- ) 2dup rim inner ; @@ -47,21 +44,21 @@ dup color gl-color dup radius swap center disk ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : with-quadric ( quot -- ) -gluNewQuadric [ swap call ] keep gluDeleteQuadric ; inline + gluNewQuadric [ swap call ] keep gluDeleteQuadric ; inline : display ( -- ) -GL_PROJECTION glMatrixMode -glLoadIdentity --400 400 -400 400 -1 1 glOrtho -GL_MODELVIEW glMatrixMode -glLoadIdentity -[ golden-section ] with-quadric ; + GL_PROJECTION glMatrixMode + glLoadIdentity + -400 400 -400 400 -1 1 glOrtho + GL_MODELVIEW glMatrixMode + glLoadIdentity + [ golden-section ] with-quadric ; : golden-section-window ( -- ) -[ - [ display ] - { 600 600 } over set-slate-dim - "Golden Section" open-window -] with-ui ; + [ + [ display ] + { 600 600 } over set-slate-dim + "Golden Section" open-window + ] with-ui ; -MAIN: golden-section-window \ No newline at end of file +MAIN: golden-section-window diff --git a/extra/project-euler/025/025.factor b/extra/project-euler/025/025.factor index 4eed8b55cb..2786d9f0e6 100644 --- a/extra/project-euler/025/025.factor +++ b/extra/project-euler/025/025.factor @@ -1,7 +1,7 @@ ! Copyright (c) 2008 Aaron Schaefer. ! See http://factorcode.org/license.txt for BSD license. -USING: alien.syntax kernel math math.functions math.parser math.ranges memoize - project-euler.common sequences ; +USING: alien.syntax kernel math math.constants math.functions math.parser + math.ranges memoize project-euler.common sequences ; IN: project-euler.025 ! http://projecteuler.net/index.php?section=problems&id=25 @@ -67,9 +67,6 @@ PRIVATE> integer ; From 42a710e96531576b94011b77aff9a57111b9f3a3 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Thu, 24 Jan 2008 19:19:45 -0400 Subject: [PATCH 079/216] Update calendar for Windows --- extra/calendar/windows/windows.factor | 38 +----------------- .../time/time-tests.factor} | 0 extra/windows/time/time.factor | 39 +++++++++++++++++++ 3 files changed, 41 insertions(+), 36 deletions(-) mode change 100644 => 100755 extra/calendar/windows/windows.factor rename extra/{calendar/windows/windows-tests.factor => windows/time/time-tests.factor} (100%) create mode 100755 extra/windows/time/time.factor diff --git a/extra/calendar/windows/windows.factor b/extra/calendar/windows/windows.factor old mode 100644 new mode 100755 index 6c3a7a71e7..320400822c --- a/extra/calendar/windows/windows.factor +++ b/extra/calendar/windows/windows.factor @@ -1,5 +1,5 @@ -USING: alien alien.c-types kernel math -windows windows.kernel32 namespaces ; +USING: calendar.backend namespaces alien.c-types +windows windows.kernel32 kernel math ; IN: calendar.windows TUPLE: windows-calendar ; @@ -11,37 +11,3 @@ M: windows-calendar gmt-offset ( -- float ) [ GetTimeZoneInformation win32-error=0/f ] keep [ TIME_ZONE_INFORMATION-Bias ] keep TIME_ZONE_INFORMATION-DaylightBias + 60 /f neg ; - -: >64bit ( lo hi -- n ) - 32 shift bitor ; - -: windows-1601 ( -- timestamp ) - 1601 1 1 0 0 0 0 ; - -: FILETIME>windows-time ( FILETIME -- n ) - [ FILETIME-dwLowDateTime ] keep - FILETIME-dwHighDateTime >64bit ; - -: windows-time>timestamp ( n -- timestamp ) - 10000000 /i seconds windows-1601 swap +dt ; - -: windows-time ( -- n ) - "FILETIME" [ GetSystemTimeAsFileTime ] keep - FILETIME>windows-time ; - -: timestamp>windows-time ( timestamp -- n ) - #! 64bit number representing # of nanoseconds since Jan 1, 1601 (UTC) - >gmt windows-1601 timestamp- >bignum 10000000 * ; - -: windows-time>FILETIME ( n -- FILETIME ) - "FILETIME" - [ - [ >r HEX: ffffffff bitand r> set-FILETIME-dwLowDateTime ] 2keep - >r -32 shift r> set-FILETIME-dwHighDateTime - ] keep ; - -: timestamp>FILETIME ( timestamp -- FILETIME/f ) - [ >gmt timestamp>windows-time windows-time>FILETIME ] [ f ] if* ; - -: FILETIME>timestamp ( FILETIME -- timestamp/f ) - FILETIME>windows-time windows-time>timestamp ; diff --git a/extra/calendar/windows/windows-tests.factor b/extra/windows/time/time-tests.factor similarity index 100% rename from extra/calendar/windows/windows-tests.factor rename to extra/windows/time/time-tests.factor diff --git a/extra/windows/time/time.factor b/extra/windows/time/time.factor new file mode 100755 index 0000000000..3ccb4cfa67 --- /dev/null +++ b/extra/windows/time/time.factor @@ -0,0 +1,39 @@ +! Copyright (C) 2007 Doug Coleman. +! See http://factorcode.org/license.txt for BSD license. +USING: alien alien.c-types kernel math windows windows.kernel32 +namespaces calendar.backend ; +IN: windows.time + +: >64bit ( lo hi -- n ) + 32 shift bitor ; + +: windows-1601 ( -- timestamp ) + 1601 1 1 0 0 0 0 ; + +: FILETIME>windows-time ( FILETIME -- n ) + [ FILETIME-dwLowDateTime ] keep + FILETIME-dwHighDateTime >64bit ; + +: windows-time>timestamp ( n -- timestamp ) + 10000000 /i seconds windows-1601 swap +dt ; + +: windows-time ( -- n ) + "FILETIME" [ GetSystemTimeAsFileTime ] keep + FILETIME>windows-time ; + +: timestamp>windows-time ( timestamp -- n ) + #! 64bit number representing # of nanoseconds since Jan 1, 1601 (UTC) + >gmt windows-1601 timestamp- >bignum 10000000 * ; + +: windows-time>FILETIME ( n -- FILETIME ) + "FILETIME" + [ + [ >r HEX: ffffffff bitand r> set-FILETIME-dwLowDateTime ] 2keep + >r -32 shift r> set-FILETIME-dwHighDateTime + ] keep ; + +: timestamp>FILETIME ( timestamp -- FILETIME/f ) + [ >gmt timestamp>windows-time windows-time>FILETIME ] [ f ] if* ; + +: FILETIME>timestamp ( FILETIME -- timestamp/f ) + FILETIME>windows-time windows-time>timestamp ; From 1249e3a720bd526fb2e61f746a5df50fb480737b Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Thu, 24 Jan 2008 19:20:07 -0400 Subject: [PATCH 080/216] Move prettyprint:-> to prettyprint.private --- core/prettyprint/prettyprint-docs.factor | 4 ++-- core/prettyprint/prettyprint.factor | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) mode change 100644 => 100755 core/prettyprint/prettyprint-docs.factor diff --git a/core/prettyprint/prettyprint-docs.factor b/core/prettyprint/prettyprint-docs.factor old mode 100644 new mode 100755 index 2b01df8faa..69400d2527 --- a/core/prettyprint/prettyprint-docs.factor +++ b/core/prettyprint/prettyprint-docs.factor @@ -1,6 +1,6 @@ USING: prettyprint.backend prettyprint.config -prettyprint.sections help.markup help.syntax io kernel words -definitions quotations strings ; +prettyprint.sections prettyprint.private help.markup help.syntax +io kernel words definitions quotations strings ; IN: prettyprint ARTICLE: "prettyprint-numbers" "Prettyprinting numbers" diff --git a/core/prettyprint/prettyprint.factor b/core/prettyprint/prettyprint.factor index 45ff0c0572..ed52f0238c 100755 --- a/core/prettyprint/prettyprint.factor +++ b/core/prettyprint/prettyprint.factor @@ -86,14 +86,14 @@ combinators quotations ; : .s ( -- ) datastack stack. ; : .r ( -- ) retainstack stack. ; + \ -> { { foreground { 1 1 1 1 } } { background { 0 0 0 1 } } } "word-style" set-word-prop - Date: Thu, 24 Jan 2008 19:20:27 -0400 Subject: [PATCH 081/216] Fix erronous stack effect comment --- extra/cocoa/messages/messages.factor | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extra/cocoa/messages/messages.factor b/extra/cocoa/messages/messages.factor index 33d635c8b7..e2072f441c 100755 --- a/extra/cocoa/messages/messages.factor +++ b/extra/cocoa/messages/messages.factor @@ -79,11 +79,11 @@ MACRO: (send) ( selector super? -- quot ) super-message-senders message-senders ? get at [ slip execute ] 2curry ; -: send ( args... receiver selector -- return... ) f (send) ; inline +: send ( receiver args... selector -- return... ) f (send) ; inline \ send soft "break-after" set-word-prop -: super-send ( args... receiver selector -- return... ) t (send) ; inline +: super-send ( receiver args... selector -- return... ) t (send) ; inline \ super-send soft "break-after" set-word-prop From 783e63781f1ebdd7c3b3ebc592606c1049d00d78 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Thu, 24 Jan 2008 19:21:10 -0400 Subject: [PATCH 082/216] I/O fixes --- extra/io/sockets/impl/impl.factor | 9 +++++++-- extra/io/sockets/sockets.factor | 0 extra/io/windows/nt/backend/backend.factor | 18 ++++++++++-------- 3 files changed, 17 insertions(+), 10 deletions(-) mode change 100644 => 100755 extra/io/sockets/sockets.factor diff --git a/extra/io/sockets/impl/impl.factor b/extra/io/sockets/impl/impl.factor index e8ab957482..ce4d5ad566 100755 --- a/extra/io/sockets/impl/impl.factor +++ b/extra/io/sockets/impl/impl.factor @@ -106,9 +106,14 @@ M: f parse-sockaddr nip ; [ ] unfold nip [ ] subset ; : prepare-resolve-host ( host serv passive? -- host' serv' flags ) + #! If the port is a number, we resolve for 'http' then + #! change it later. This is a workaround for a FreeBSD + #! getaddrinfo() limitation -- on Windows, Linux and Mac, + #! we can convert a number to a string and pass that as the + #! service name, but on FreeBSD this gives us an unknown + #! service error. >r - >r string>char-alien r> - dup integer? [ port-override set f ] [ string>char-alien ] if + dup integer? [ port-override set "http" ] when r> AI_PASSIVE 0 ? ; M: object resolve-host ( host serv passive? -- seq ) diff --git a/extra/io/sockets/sockets.factor b/extra/io/sockets/sockets.factor old mode 100644 new mode 100755 diff --git a/extra/io/windows/nt/backend/backend.factor b/extra/io/windows/nt/backend/backend.factor index 0d1f2cec0b..82d609c371 100755 --- a/extra/io/windows/nt/backend/backend.factor +++ b/extra/io/windows/nt/backend/backend.factor @@ -116,25 +116,27 @@ M: windows-nt-io add-completion ( handle -- ) : lookup-callback ( GetQueuedCompletion-args -- callback ) io-hash get-global delete-at* drop ; -: wait-for-io ( timeout -- continuation/f ) +: handle-overlapped ( timeout -- ? ) wait-for-overlapped [ GetLastError dup expected-io-error? [ - 2drop f + 2drop t ] [ dup eof? [ drop lookup-callback dup io-callback-port t swap set-port-eof? - io-callback-continuation ] [ (win32-error-string) swap lookup-callback [ io-callback-port set-port-error ] keep - io-callback-continuation - ] if + ] if io-callback-continuation schedule-thread f ] if ] [ - lookup-callback io-callback-continuation + lookup-callback + io-callback-continuation schedule-thread f ] if ; +: drain-overlapped ( timeout -- ) + handle-overlapped [ 0 drain-overlapped ] unless ; + : maybe-expire ( io-callbck -- ) io-callback-port dup timeout? [ @@ -144,10 +146,10 @@ M: windows-nt-io add-completion ( handle -- ) ] if ; : cancel-timeout ( -- ) - io-hash get-global values [ maybe-expire ] each ; + io-hash get-global [ nip maybe-expire ] assoc-each ; M: windows-nt-io io-multiplex ( ms -- ) - cancel-timeout wait-for-io [ schedule-thread ] when* ; + cancel-timeout drain-overlapped ; M: windows-nt-io init-io ( -- ) master-completion-port set-global From b5a337bb2a72c6daa5a64127a78ba483dd800a68 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Thu, 24 Jan 2008 21:10:17 -0400 Subject: [PATCH 083/216] Fix Linux I/O --- extra/io/unix/launcher/launcher.factor | 2 +- extra/unix/unix.factor | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/extra/io/unix/launcher/launcher.factor b/extra/io/unix/launcher/launcher.factor index 3cd21e6c51..769e905b6e 100755 --- a/extra/io/unix/launcher/launcher.factor +++ b/extra/io/unix/launcher/launcher.factor @@ -84,7 +84,7 @@ M: unix-io process-stream* ! On BSD and Mac OS X, we use kqueue() which scales better. : wait-for-processes ( -- ? ) -1 0 tuck WNOHANG waitpid - dup zero? [ + dup 0 <= [ 2drop t ] [ find-process dup [ diff --git a/extra/unix/unix.factor b/extra/unix/unix.factor index 16b279765f..f5c484568e 100755 --- a/extra/unix/unix.factor +++ b/extra/unix/unix.factor @@ -13,7 +13,7 @@ TYPEDEF: longlong quad_t TYPEDEF: uint gid_t TYPEDEF: uint in_addr_t TYPEDEF: uint ino_t -TYPEDEF: uint pid_t +TYPEDEF: int pid_t TYPEDEF: uint socklen_t TYPEDEF: uint time_t TYPEDEF: uint uid_t From 0b4be5f0a2e30f9879e9b3106bf79fa7866700d3 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Thu, 24 Jan 2008 22:41:55 -0600 Subject: [PATCH 084/216] Fix Unix io.launcher --- extra/io/unix/bsd/bsd.factor | 4 ++-- extra/io/unix/kqueue/kqueue.factor | 8 ++++---- extra/io/unix/launcher/launcher.factor | 5 +++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/extra/io/unix/bsd/bsd.factor b/extra/io/unix/bsd/bsd.factor index 3319324c3d..a4315ce5d0 100755 --- a/extra/io/unix/bsd/bsd.factor +++ b/extra/io/unix/bsd/bsd.factor @@ -2,8 +2,8 @@ ! See http://factorcode.org/license.txt for BSD license. IN: io.unix.bsd USING: io.backend io.unix.backend io.unix.kqueue io.unix.select -io.unix.launcher namespaces kernel assocs threads continuations -; +io.launcher io.unix.launcher namespaces kernel assocs threads +continuations ; ! On *BSD and Mac OS X, we use select() for the top-level ! multiplexer, and we hang a kqueue off of it but file change diff --git a/extra/io/unix/kqueue/kqueue.factor b/extra/io/unix/kqueue/kqueue.factor index 3df2d7cd57..19005df404 100755 --- a/extra/io/unix/kqueue/kqueue.factor +++ b/extra/io/unix/kqueue/kqueue.factor @@ -2,7 +2,7 @@ ! See http://factorcode.org/license.txt for BSD license. USING: alien.c-types kernel io.nonblocking io.unix.backend sequences assocs unix unix.kqueue unix.process math namespaces -combinators threads vectors ; +combinators threads vectors io.launcher io.unix.launcher ; IN: io.unix.kqueue TUPLE: kqueue-mx events ; @@ -50,15 +50,15 @@ M: kqueue-mx unregister-io-task ( task mx -- ) : kevent-write-task ( mx fd -- ) over mx-reads at handle-io-task ; -: kevent-proc-task ( mx pid -- ) - dup (wait-for-pid) swap find-process +: kevent-proc-task ( pid -- ) + dup wait-for-pid swap find-process dup [ notify-exit ] [ 2drop ] if ; : handle-kevent ( mx kevent -- ) dup kevent-ident swap kevent-filter { { [ dup EVFILT_READ = ] [ drop kevent-read-task ] } { [ dup EVFILT_WRITE = ] [ drop kevent-write-task ] } - { [ dup EVFILT_PROC = ] [ drop kevent-proc-task ] } + { [ dup EVFILT_PROC = ] [ drop kevent-proc-task drop ] } } cond ; : handle-kevents ( mx n -- ) diff --git a/extra/io/unix/launcher/launcher.factor b/extra/io/unix/launcher/launcher.factor index 769e905b6e..50c41380d0 100755 --- a/extra/io/unix/launcher/launcher.factor +++ b/extra/io/unix/launcher/launcher.factor @@ -3,7 +3,7 @@ USING: io io.backend io.launcher io.unix.backend io.nonblocking sequences kernel namespaces math system alien.c-types debugger continuations arrays assocs combinators unix.process -parser-combinators memoize promises strings ; +parser-combinators memoize promises strings threads ; IN: io.unix.launcher ! Search unix first @@ -78,7 +78,8 @@ M: unix-io process-stream* ] with-descriptor ; : find-process ( handle -- process ) - f process construct-boa processes get at ; + processes get swap [ nip swap process-handle = ] curry + assoc-find 2drop ; ! Inefficient process wait polling, used on Linux and Solaris. ! On BSD and Mac OS X, we use kqueue() which scales better. From 9cc5f5c78ed1ed0013fab524081de5b95ce7252a Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Thu, 24 Jan 2008 23:07:14 -0600 Subject: [PATCH 085/216] Fix construct-empty transform --- core/inference/transforms/transforms.factor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/inference/transforms/transforms.factor b/core/inference/transforms/transforms.factor index eabe4b8c2a..c4eeb98145 100755 --- a/core/inference/transforms/transforms.factor +++ b/core/inference/transforms/transforms.factor @@ -74,7 +74,7 @@ M: pair (bitfield-quot) ( spec -- quot ) dup tuple-size [ ] 2curry swap infer-quot ] [ - \ construct-empty declared-infer + \ construct-empty 1 1 make-call-node ] if ] "infer" set-word-prop From 00d2122a4c3f10419a0a379e0d2861c73ce4c5e5 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Thu, 24 Jan 2008 23:45:56 -0400 Subject: [PATCH 086/216] Working on Unix io.launcher redirection --- extra/io/launcher/launcher-docs.factor | 30 ++++++++++++++++++++++++++ extra/io/launcher/launcher.factor | 4 ++++ extra/io/unix/files/files.factor | 6 ++++-- extra/io/unix/launcher/launcher.factor | 13 +++++++++++ 4 files changed, 51 insertions(+), 2 deletions(-) diff --git a/extra/io/launcher/launcher-docs.factor b/extra/io/launcher/launcher-docs.factor index 2c30431714..495894b25d 100755 --- a/extra/io/launcher/launcher-docs.factor +++ b/extra/io/launcher/launcher-docs.factor @@ -31,6 +31,36 @@ HELP: +environment-mode+ "Default value is " { $link append-environment } "." } ; +HELP: +stdin+ +{ $description "Launch descriptor key. Must equal one of the following:" + { $list + { { $link f } " - standard input is inherited" } + { { $link +closed+ } " - standard input is closed" } + { "a path name - standard input is read from the given file, which must exist" } + } +} ; + +HELP: +stdout+ +{ $description "Launch descriptor key. Must equal one of the following:" + { $list + { { $link f } " - standard output is inherited" } + { { $link +closed+ } " - standard output is closed" } + { "a path name - standard output is written to the given file, which is overwritten if it already exists" } + } +} ; + +HELP: +stderr+ +{ $description "Launch descriptor key. Must equal one of the following:" + { $list + { { $link f } " - standard error is inherited" } + { { $link +closed+ } " - standard error is closed" } + { "a path name - standard error is written to the given file, which is overwritten if it already exists" } + } +} ; + +HELP: +closed+ +{ $description "Possible value for " { $link +stdin+ } ", " { $link +stdout+ } ", and " { $link +stderr+ } " launch descriptors." } ; + HELP: prepend-environment { $description "Possible value of " { $link +environment-mode+ } " launch descriptor key. The child process environment consists of the value of the " { $link +environment+ } " key together with the current environment, with entries from the current environment taking precedence." $nl diff --git a/extra/io/launcher/launcher.factor b/extra/io/launcher/launcher.factor index c646358b2e..fe3244916d 100755 --- a/extra/io/launcher/launcher.factor +++ b/extra/io/launcher/launcher.factor @@ -30,6 +30,10 @@ SYMBOL: +arguments+ SYMBOL: +detached+ SYMBOL: +environment+ SYMBOL: +environment-mode+ +SYMBOL: +stdin+ +SYMBOL: +stdout+ +SYMBOL: +stderr+ +SYMBOL: +closed+ SYMBOL: prepend-environment SYMBOL: replace-environment diff --git a/extra/io/unix/files/files.factor b/extra/io/unix/files/files.factor index f9d642d661..b56e62d3c4 100755 --- a/extra/io/unix/files/files.factor +++ b/extra/io/unix/files/files.factor @@ -4,13 +4,15 @@ USING: io.backend io.nonblocking io.unix.backend io.files io unix kernel math continuations ; IN: io.unix.files +: read-flags O_RDONLY ; inline + : open-read ( path -- fd ) O_RDONLY file-mode open dup io-error ; M: unix-io ( path -- stream ) open-read ; -: write-flags O_WRONLY O_CREAT O_TRUNC bitor bitor ; +: write-flags O_WRONLY O_CREAT O_TRUNC bitor bitor ; inline : open-write ( path -- fd ) write-flags file-mode open dup io-error ; @@ -18,7 +20,7 @@ M: unix-io ( path -- stream ) M: unix-io ( path -- stream ) open-write ; -: append-flags O_WRONLY O_APPEND O_CREAT bitor bitor ; +: append-flags O_WRONLY O_APPEND O_CREAT bitor bitor ; inline : open-append ( path -- fd ) append-flags file-mode open dup io-error diff --git a/extra/io/unix/launcher/launcher.factor b/extra/io/unix/launcher/launcher.factor index 50c41380d0..6439fc0848 100755 --- a/extra/io/unix/launcher/launcher.factor +++ b/extra/io/unix/launcher/launcher.factor @@ -42,8 +42,21 @@ MEMO: 'arguments' ( -- parser ) : assoc>env ( assoc -- env ) [ "=" swap 3append ] { } assoc>map ; +: redirect ( obj mode fd -- ) + { + { [ pick not ] [ 3drop ] } + { [ pick +closed+ eq? ] [ close 3drop ] } + { [ t ] [ >r file-mode open dup io-error r> dup2 io-error ] } + } cond ; + +: setup-redirection ( -- ) + +stdin+ get read-flags 0 redirect + +stdout+ get write-flags 1 redirect + +stderr+ get read-flags 2 redirect ; + : spawn-process ( -- ) [ + setup-redirection get-arguments pass-environment? [ get-environment assoc>env exec-args-with-env ] From 62f076d0c3fa2fe1f880449d7473689b9e39e9a8 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Thu, 24 Jan 2008 23:48:28 -0400 Subject: [PATCH 087/216] Fix FD leak --- extra/io/unix/launcher/launcher.factor | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/extra/io/unix/launcher/launcher.factor b/extra/io/unix/launcher/launcher.factor index 6439fc0848..1e4d5fab52 100755 --- a/extra/io/unix/launcher/launcher.factor +++ b/extra/io/unix/launcher/launcher.factor @@ -42,11 +42,15 @@ MEMO: 'arguments' ( -- parser ) : assoc>env ( assoc -- env ) [ "=" swap 3append ] { } assoc>map ; +: (redirect) + >r file-mode open dup io-error dup + r> dup2 io-error close drop ; + : redirect ( obj mode fd -- ) { { [ pick not ] [ 3drop ] } { [ pick +closed+ eq? ] [ close 3drop ] } - { [ t ] [ >r file-mode open dup io-error r> dup2 io-error ] } + { [ t ] [ (redirect) ] } } cond ; : setup-redirection ( -- ) From 35f390e8ca17adaa3e277e479e03b135631b49cd Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Thu, 24 Jan 2008 23:50:00 -0400 Subject: [PATCH 088/216] Remove unnecessary word --- core/io/io-docs.factor | 5 ----- core/io/io.factor | 6 +++--- 2 files changed, 3 insertions(+), 8 deletions(-) mode change 100644 => 100755 core/io/io-docs.factor diff --git a/core/io/io-docs.factor b/core/io/io-docs.factor old mode 100644 new mode 100755 index 5c71714c64..cf867d7945 --- a/core/io/io-docs.factor +++ b/core/io/io-docs.factor @@ -29,7 +29,6 @@ ARTICLE: "stdio" "The default stream" "Various words take an implicit stream parameter from a variable to reduce stack shuffling." { $subsection stdio } "Unless rebound in a child namespace, this variable will be set to a console stream for interacting with the user." -{ $subsection close } { $subsection read1 } { $subsection read } { $subsection read-until } @@ -178,10 +177,6 @@ $io-error ; HELP: stdio { $var-description "Holds a stream, used for various implicit stream operations. Rebound using " { $link with-stream } " and " { $link with-stream* } "." } ; -HELP: close -{ $contract "Closes the " { $link stdio } " stream." } -$io-error ; - HELP: readln { $values { "str/f" "a string or " { $link f } } } { $contract "Reads a line of input from the " { $link stdio } " stream. Outputs " { $link f } " on stream exhaustion." } diff --git a/core/io/io.factor b/core/io/io.factor index 56b284eaaf..edd0fa938f 100755 --- a/core/io/io.factor +++ b/core/io/io.factor @@ -38,8 +38,6 @@ SYMBOL: stdio ! Default error stream SYMBOL: stderr -: close ( -- ) stdio get stream-close ; - : readln ( -- str/f ) stdio get stream-readln ; : read1 ( -- ch/f ) stdio get stream-read1 ; : read ( n -- str/f ) stdio get stream-read ; @@ -56,7 +54,9 @@ SYMBOL: stderr stdio swap with-variable ; inline : with-stream ( stream quot -- ) - swap [ [ close ] [ ] cleanup ] with-stream* ; inline + swap [ + [ stdio get stream-close ] [ ] cleanup + ] with-stream* ; inline : tabular-output ( style quot -- ) swap >r { } make r> stdio get stream-write-table ; inline From 034b4dcaa66a557b439ce46e2c4bfd8be8ef8afd Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Fri, 25 Jan 2008 01:49:03 -0400 Subject: [PATCH 089/216] Windows launcher work in progress --- extra/io/windows/launcher/launcher.factor | 72 +++++++++++++++++--- extra/io/windows/nt/launcher/launcher.factor | 14 +--- extra/io/windows/{nt => }/pipes/pipes.factor | 10 +-- extra/io/windows/windows.factor | 10 ++- 4 files changed, 75 insertions(+), 31 deletions(-) rename extra/io/windows/{nt => }/pipes/pipes.factor (84%) diff --git a/extra/io/windows/launcher/launcher.factor b/extra/io/windows/launcher/launcher.factor index 79284b265b..6d7a96b069 100755 --- a/extra/io/windows/launcher/launcher.factor +++ b/extra/io/windows/launcher/launcher.factor @@ -1,9 +1,10 @@ ! Copyright (C) 2007, 2008 Doug Coleman, Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: alien alien.c-types arrays continuations destructors io -io.windows libc io.nonblocking io.streams.duplex windows.types -math windows.kernel32 windows namespaces io.launcher kernel -sequences windows.errors assocs splitting system threads init ; +io.windows io.windows.pipes libc io.nonblocking +io.streams.duplex windows.types math windows.kernel32 windows +namespaces io.launcher kernel sequences windows.errors assocs +splitting system threads init strings combinators io.backend ; IN: io.windows.launcher TUPLE: CreateProcess-args @@ -86,18 +87,73 @@ TUPLE: CreateProcess-args over set-CreateProcess-args-lpEnvironment ] when ; +: (redirect) ( path access-mode create-mode -- handle ) + >r >r + normalize-pathname + r> ! access-mode + share-mode + security-attributes-inherit + r> ! create-mode + FILE_ATTRIBUTE_NORMAL ! flags and attributes + f ! template file + CreateFile dup invalid-handle? dup close-later ; + +: redirect ( obj access-mode create-mode -- handle ) + { + { [ pick not ] [ 3drop f ] } + { [ pick +closed+ eq? ] [ 3drop f ] } + { [ pick string? ] [ (redirect) ] } + } cond ; + +: inherited-stdout ( args -- handle ) + CreateProcess-args-stdout-pipe + [ pipe-out ] [ STD_OUTPUT_HANDLE GetStdHandle ] if* ; + +: redirect-stdout ( args -- handle ) + +stdout+ get GENERIC_WRITE CREATE_ALWAYS redirect + swap inherited-stdout or ; + +: inherited-stderr ( args -- handle ) + CreateProcess-args-stdout-pipe + [ pipe-out ] [ STD_ERROR_HANDLE GetStdHandle ] if* ; + +: redirect-stderr ( args -- handle ) + +stderr+ get GENERIC_WRITE CREATE_ALWAYS redirect + swap inherited-stderr or ; + +: inherited-stdin ( args -- handle ) + CreateProcess-args-stdin-pipe + [ pipe-in ] [ STD_INPUT_HANDLE GetStdHandle ] if* ; + +: redirect-stdin ( args -- handle ) + +stdin+ get GENERIC_READ OPEN_EXISTING redirect + swap inherited-stdin or ; + +: fill-startup-info + dup CreateProcess-args-lpStartupInfo + STARTF_USESTDHANDLES over set-STARTUPINFO-dwFlags + + over redirect-stdout over set-STARTUPINFO-hStdOutput + over redirect-stderr over set-STARTUPINFO-hStdError + over redirect-stdin over set-STARTUPINFO-hStdInput + + drop ; + : make-CreateProcess-args ( -- args ) default-CreateProcess-args wince? [ fill-lpApplicationName ] [ fill-lpCommandLine ] if fill-dwCreateFlags - fill-lpEnvironment ; + fill-lpEnvironment + fill-startup-info ; M: windows-io run-process* ( desc -- handle ) [ - make-CreateProcess-args - dup call-CreateProcess - CreateProcess-args-lpProcessInformation - ] with-descriptor ; + [ + make-CreateProcess-args + dup call-CreateProcess + CreateProcess-args-lpProcessInformation + ] with-descriptor + ] with-destructors ; : dispose-process ( process-information -- ) #! From MSDN: "Handles in PROCESS_INFORMATION must be closed diff --git a/extra/io/windows/nt/launcher/launcher.factor b/extra/io/windows/nt/launcher/launcher.factor index bfce92e17d..f548c5945c 100755 --- a/extra/io/windows/nt/launcher/launcher.factor +++ b/extra/io/windows/nt/launcher/launcher.factor @@ -4,7 +4,7 @@ USING: alien alien.c-types arrays continuations destructors io io.windows libc io.nonblocking io.streams.duplex windows.types math windows.kernel32 windows namespaces io.launcher kernel sequences windows.errors assocs splitting system -io.windows.launcher io.windows.nt.pipes ; +io.windows.launcher io.windows.pipes ; IN: io.windows.nt.launcher ! The below code is based on the example given in @@ -30,17 +30,6 @@ IN: io.windows.nt.launcher dup pipe-out f set-inherit over set-CreateProcess-args-stdin-pipe ; -: fill-startup-info - dup CreateProcess-args-lpStartupInfo - STARTF_USESTDHANDLES over set-STARTUPINFO-dwFlags - - over CreateProcess-args-stdout-pipe - pipe-out over set-STARTUPINFO-hStdOutput - over CreateProcess-args-stdout-pipe - pipe-out over set-STARTUPINFO-hStdError - over CreateProcess-args-stdin-pipe - pipe-in swap set-STARTUPINFO-hStdInput ; - M: windows-io process-stream* [ [ @@ -49,7 +38,6 @@ M: windows-io process-stream* fill-stdout-pipe fill-stdin-pipe - fill-startup-info dup call-CreateProcess diff --git a/extra/io/windows/nt/pipes/pipes.factor b/extra/io/windows/pipes/pipes.factor similarity index 84% rename from extra/io/windows/nt/pipes/pipes.factor rename to extra/io/windows/pipes/pipes.factor index a10a98bd30..8c2acc4009 100755 --- a/extra/io/windows/nt/pipes/pipes.factor +++ b/extra/io/windows/pipes/pipes.factor @@ -3,19 +3,11 @@ USING: alien alien.c-types arrays destructors io io.windows libc windows.types math windows.kernel32 windows namespaces kernel sequences windows.errors assocs math.parser system random ; -IN: io.windows.nt.pipes +IN: io.windows.pipes ! This code is based on ! http://twistedmatrix.com/trac/browser/trunk/twisted/internet/iocpreactor/process.py -: default-security-attributes ( -- obj ) - "SECURITY_ATTRIBUTES" - "SECURITY_ATTRIBUTES" heap-size over set-SECURITY_ATTRIBUTES-nLength ; - -: security-attributes-inherit ( -- obj ) - default-security-attributes - TRUE over set-SECURITY_ATTRIBUTES-bInheritHandle ; foldable - : create-named-pipe ( name mode -- handle ) FILE_FLAG_OVERLAPPED bitor PIPE_TYPE_BYTE diff --git a/extra/io/windows/windows.factor b/extra/io/windows/windows.factor index 8dcb138999..efac6cb1cc 100755 --- a/extra/io/windows/windows.factor +++ b/extra/io/windows/windows.factor @@ -4,7 +4,7 @@ USING: alien alien.c-types arrays destructors io io.backend io.buffers io.files io.nonblocking io.sockets io.binary io.sockets.impl windows.errors strings io.streams.duplex kernel math namespaces sequences windows windows.kernel32 -windows.shell32 windows.winsock splitting ; +windows.shell32 windows.types windows.winsock splitting ; IN: io.windows TUPLE: windows-nt-io ; @@ -34,6 +34,14 @@ M: windows-io normalize-directory ( string -- string ) FILE_SHARE_READ FILE_SHARE_WRITE bitor FILE_SHARE_DELETE bitor ; foldable +: default-security-attributes ( -- obj ) + "SECURITY_ATTRIBUTES" + "SECURITY_ATTRIBUTES" heap-size over set-SECURITY_ATTRIBUTES-nLength ; + +: security-attributes-inherit ( -- obj ) + default-security-attributes + TRUE over set-SECURITY_ATTRIBUTES-bInheritHandle ; foldable + M: win32-file init-handle ( handle -- ) drop ; From 3c50cab4c852b4a3456256e64c44eb501ce464aa Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Thu, 24 Jan 2008 22:06:36 -0800 Subject: [PATCH 090/216] Have the "Help for Word" command in the TextMate bundle use help-window rather than help --- misc/Factor.tmbundle/Commands/Help for Word.tmCommand | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/Factor.tmbundle/Commands/Help for Word.tmCommand b/misc/Factor.tmbundle/Commands/Help for Word.tmCommand index 350c01d344..0ff133c891 100644 --- a/misc/Factor.tmbundle/Commands/Help for Word.tmCommand +++ b/misc/Factor.tmbundle/Commands/Help for Word.tmCommand @@ -11,7 +11,7 @@ require "#{ENV["TM_BUNDLE_SUPPORT"]}/lib/tm_factor" doc = STDIN.read word = line_current_word(ENV["TM_CURRENT_LINE"], ENV["TM_LINE_INDEX"].to_i) -factor_run(%Q(#{doc_using_statements(doc)} USE: help\n \\ #{word} help)) +factor_run(%Q(#{doc_using_statements(doc)} USE: ui.tools.workspace\n \\ #{word} help-window)) fallbackInput word input From 3a0540555ec05c3b44733813e5d8b986db49852b Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Thu, 24 Jan 2008 22:16:36 -0800 Subject: [PATCH 091/216] Add framebuffer helper words to opengl vocabulary. Add a new "line-art" demo demonstrating OpenGL GLSL and framebuffer rendering. Push code common to line-art and cel-shading into an opengl-demo-support vocab --- extra/cel-shading/cel-shading.factor | 98 ++------ extra/line-art/authors.txt | 1 + extra/line-art/line-art.factor | 229 ++++++++++++++++++ extra/line-art/summary.txt | 1 + extra/line-art/tags.txt | 3 + extra/opengl-demo-support/authors.txt | 1 + .../opengl-demo-support.factor | 74 ++++++ extra/opengl-demo-support/summary.txt | 1 + extra/opengl-demo-support/tags.txt | 1 + extra/opengl/opengl.factor | 78 +++++- 10 files changed, 400 insertions(+), 87 deletions(-) create mode 100644 extra/line-art/authors.txt create mode 100644 extra/line-art/line-art.factor create mode 100644 extra/line-art/summary.txt create mode 100644 extra/line-art/tags.txt create mode 100644 extra/opengl-demo-support/authors.txt create mode 100644 extra/opengl-demo-support/opengl-demo-support.factor create mode 100644 extra/opengl-demo-support/summary.txt create mode 100644 extra/opengl-demo-support/tags.txt diff --git a/extra/cel-shading/cel-shading.factor b/extra/cel-shading/cel-shading.factor index 20b392195a..54664fc011 100644 --- a/extra/cel-shading/cel-shading.factor +++ b/extra/cel-shading/cel-shading.factor @@ -1,51 +1,15 @@ -USING: arrays bunny io io.files kernel - math math.functions math.vectors multiline - namespaces - opengl opengl.gl - prettyprint - sequences ui ui.gadgets ui.gestures ui.render ; +USING: arrays bunny combinators.lib io io.files kernel + math math.functions multiline + opengl opengl.gl opengl-demo-support + sequences ui ui.gadgets ui.render ; IN: cel-shading -: NEAR-PLANE 1.0 64.0 / ; inline -: FAR-PLANE 4.0 ; inline -: FOV 2.0 sqrt 1+ ; inline -: MOUSE-MOTION-SCALE 0.5 ; inline -: MOUSE-DISTANCE-SCALE 1.0 64.0 / ; inline -: KEY-ROTATE-STEP 1.0 ; inline -: KEY-DISTANCE-STEP 1.0 64.0 / ; inline -: DIMS { 640 480 } ; inline - -: FOV-RATIO ( -- fov ) DIMS dup first2 min v/n ; - -SYMBOL: last-drag-loc - -TUPLE: cel-shading-gadget yaw pitch distance model program ; +TUPLE: cel-shading-gadget model program ; : ( -- cel-shading-gadget ) - cel-shading-gadget construct-gadget - 0.0 over set-cel-shading-gadget-yaw - 0.0 over set-cel-shading-gadget-pitch - 0.375 over set-cel-shading-gadget-distance - maybe-download read-model over set-cel-shading-gadget-model ; - -: yaw-cel-shading-gadget ( yaw gadget -- ) - [ [ cel-shading-gadget-yaw + ] keep set-cel-shading-gadget-yaw ] keep relayout-1 ; - -: pitch-cel-shading-gadget ( pitch gadget -- ) - [ [ cel-shading-gadget-pitch + ] keep set-cel-shading-gadget-pitch ] keep relayout-1 ; - -: zoom-cel-shading-gadget ( distance gadget -- ) - [ [ cel-shading-gadget-distance + ] keep set-cel-shading-gadget-distance ] keep relayout-1 ; - -M: cel-shading-gadget pref-dim* ( gadget -- dim ) - drop DIMS ; - -: -+ ( x -- -x x ) - dup neg swap ; - -: cel-shading-frustum ( -- -x x -y y near far ) - FOV-RATIO NEAR-PLANE FOV / v*n - first2 [ -+ ] 2apply NEAR-PLANE FAR-PLANE ; + 0.0 0.0 0.375 + maybe-download read-model + { set-delegate set-cel-shading-gadget-model } cel-shading-gadget construct ; STRING: cel-shading-vertex-shader-source varying vec3 position, normal; @@ -90,9 +54,8 @@ main() ; : cel-shading-program ( -- program ) - cel-shading-vertex-shader-source check-gl-shader - cel-shading-fragment-shader-source check-gl-shader - 2array check-gl-program ; + cel-shading-vertex-shader-source cel-shading-fragment-shader-source + ; M: cel-shading-gadget graft* ( gadget -- ) 0.0 0.0 0.0 1.0 glClearColor @@ -104,19 +67,13 @@ M: cel-shading-gadget ungraft* ( gadget -- ) cel-shading-gadget-program delete-gl-program ; : cel-shading-draw-setup ( gadget -- gadget ) - GL_PROJECTION glMatrixMode - glLoadIdentity - cel-shading-frustum glFrustum - GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT bitor glClear - GL_MODELVIEW glMatrixMode - glLoadIdentity - [ >r 0.0 0.0 r> cel-shading-gadget-distance neg glTranslatef ] keep - [ cel-shading-gadget-pitch 1.0 0.0 0.0 glRotatef ] keep - [ cel-shading-gadget-yaw 0.0 1.0 0.0 glRotatef ] keep - [ cel-shading-gadget-program [ "light_direction" glGetUniformLocation -25.0 45.0 80.0 glUniform3f ] keep - [ "color" glGetUniformLocation 0.6 0.5 0.5 1.0 glUniform4f ] keep - [ "ambient" glGetUniformLocation 0.2 0.2 0.2 0.2 glUniform4f ] keep - "diffuse" glGetUniformLocation 0.8 0.8 0.8 0.8 glUniform4f ] keep ; + [ demo-gadget-set-matrices ] keep + [ cel-shading-gadget-program + { [ "light_direction" glGetUniformLocation -25.0 45.0 80.0 glUniform3f ] + [ "color" glGetUniformLocation 0.6 0.5 0.5 1.0 glUniform4f ] + [ "ambient" glGetUniformLocation 0.2 0.2 0.2 0.2 glUniform4f ] + [ "diffuse" glGetUniformLocation 0.8 0.8 0.8 0.8 glUniform4f ] } call-with + ] keep ; M: cel-shading-gadget draw-gadget* ( gadget -- ) dup cel-shading-gadget-program [ @@ -125,27 +82,6 @@ M: cel-shading-gadget draw-gadget* ( gadget -- ) cel-shading-gadget-model first3 draw-bunny ] with-gl-program ; -: reset-last-drag-rel ( -- ) - { 0 0 } last-drag-loc set ; -: last-drag-rel ( -- rel ) - drag-loc [ last-drag-loc get v- ] keep last-drag-loc set ; - -: drag-yaw-pitch ( -- yaw pitch ) - last-drag-rel MOUSE-MOTION-SCALE v*n first2 ; - -cel-shading-gadget H{ - { T{ key-down f f "LEFT" } [ KEY-ROTATE-STEP neg swap yaw-cel-shading-gadget ] } - { T{ key-down f f "RIGHT" } [ KEY-ROTATE-STEP swap yaw-cel-shading-gadget ] } - { T{ key-down f f "DOWN" } [ KEY-ROTATE-STEP neg swap pitch-cel-shading-gadget ] } - { T{ key-down f f "UP" } [ KEY-ROTATE-STEP swap pitch-cel-shading-gadget ] } - { T{ key-down f f "=" } [ KEY-DISTANCE-STEP neg swap zoom-cel-shading-gadget ] } - { T{ key-down f f "-" } [ KEY-DISTANCE-STEP swap zoom-cel-shading-gadget ] } - - { T{ button-down f f 1 } [ drop reset-last-drag-rel ] } - { T{ drag f 1 } [ drag-yaw-pitch rot [ pitch-cel-shading-gadget ] keep yaw-cel-shading-gadget ] } - { T{ mouse-scroll } [ scroll-direction get second MOUSE-DISTANCE-SCALE * swap zoom-cel-shading-gadget ] } -} set-gestures - : cel-shading-window ( -- ) [ "Cel Shading" open-window ] with-ui ; diff --git a/extra/line-art/authors.txt b/extra/line-art/authors.txt new file mode 100644 index 0000000000..6a0dc7293a --- /dev/null +++ b/extra/line-art/authors.txt @@ -0,0 +1 @@ +Joe Groff \ No newline at end of file diff --git a/extra/line-art/line-art.factor b/extra/line-art/line-art.factor new file mode 100644 index 0000000000..0fdbdd1321 --- /dev/null +++ b/extra/line-art/line-art.factor @@ -0,0 +1,229 @@ +USING: arrays bunny combinators.lib continuations io io.files kernel + math math.functions math.vectors multiline + namespaces + opengl opengl.gl opengl-demo-support + prettyprint + sequences ui ui.gadgets ui.gestures ui.render ; +IN: line-art + +TUPLE: line-art-gadget + model step1-program step2-program + framebuffer color-texture normal-texture depth-texture framebuffer-dim ; + +: ( -- line-art-gadget ) + 0.0 0.0 0.375 + maybe-download read-model + { set-delegate set-line-art-gadget-model } line-art-gadget construct ; + +STRING: line-art-step1-vertex-shader-source +varying vec3 normal; + +void +main() +{ + gl_Position = ftransform(); + normal = gl_Normal; +} + +; + +STRING: line-art-step1-fragment-shader-source +varying vec3 normal; +uniform vec4 color; + +void +main() +{ + gl_FragData[0] = color; + gl_FragData[1] = vec4(normal, 1); +} + +; + +STRING: line-art-step2-vertex-shader-source +varying vec2 coord; + +void +main() +{ + gl_Position = ftransform(); + coord = (gl_Vertex * vec4(0.5) + vec4(0.5)).xy; +} + +; + +STRING: line-art-step2-fragment-shader-source +uniform sampler2D colormap, normalmap, depthmap; +uniform vec4 line_color; +varying vec2 coord; + +const float DEPTH_RATIO_THRESHOLD = 2.0, NORMAL_DOT_THRESHOLD = 0.95, SAMPLE_SPREAD = 1.0/1024.0; + +bool +is_normal_border(vec3 norm1, vec3 norm2) +{ + return dot(norm1, norm2) < NORMAL_DOT_THRESHOLD; +} +bool +is_depth_border(float depth1, float depth2) +{ + float ratio = depth1/depth2; + return 1.0/DEPTH_RATIO_THRESHOLD > ratio || ratio > DEPTH_RATIO_THRESHOLD; +} + +bool +is_border(vec2 coord) +{ + vec2 coord1 = coord + vec2(-SAMPLE_SPREAD, -SAMPLE_SPREAD), + coord2 = coord + vec2( SAMPLE_SPREAD, -SAMPLE_SPREAD), + coord3 = coord + vec2(-SAMPLE_SPREAD, SAMPLE_SPREAD), + coord4 = coord + vec2( SAMPLE_SPREAD, SAMPLE_SPREAD); + + /* This border checking code is meant to be easy to follow rather than blazingly fast. + * The normal/depth checks could be easily parallelized into matrix or vector operations to + * improve performance. */ + vec3 normal1 = texture2D(normalmap, coord1).xyz, + normal2 = texture2D(normalmap, coord2).xyz, + normal3 = texture2D(normalmap, coord3).xyz, + normal4 = texture2D(normalmap, coord4).xyz; + float depth1 = texture2D(depthmap, coord1).x, + depth2 = texture2D(depthmap, coord2).x, + depth3 = texture2D(depthmap, coord3).x, + depth4 = texture2D(depthmap, coord4).x; + + return (depth1 < 1.0 || depth2 < 1.0 || depth3 < 1.0 || depth4 < 1.0) + && (is_normal_border(normal1, normal2) + || is_normal_border(normal1, normal3) + || is_normal_border(normal1, normal4) + || is_normal_border(normal2, normal3) + || is_normal_border(normal2, normal4) + || is_normal_border(normal3, normal4) + /* || is_depth_border(depth1, depth2) + || is_depth_border(depth1, depth3) + || is_depth_border(depth1, depth4) + || is_depth_border(depth2, depth3) + || is_depth_border(depth2, depth4) + || is_depth_border(depth3, depth4) */ + ); +} + +void +main() +{ + gl_FragColor = is_border(coord) + ? line_color + : texture2D(colormap, coord); +} + +; + +: (line-art-step1-program) ( -- step1 ) + line-art-step1-vertex-shader-source line-art-step1-fragment-shader-source + ; +: (line-art-step2-program) ( -- step2 ) + line-art-step2-vertex-shader-source line-art-step2-fragment-shader-source + ; + +: (line-art-framebuffer-texture) ( dim iformat xformat -- texture ) + swapd >r >r >r + GL_TEXTURE0 glActiveTexture + gen-texture GL_TEXTURE_2D over glBindTexture + GL_TEXTURE_2D GL_TEXTURE_WRAP_S GL_CLAMP glTexParameteri + GL_TEXTURE_2D GL_TEXTURE_WRAP_T GL_CLAMP glTexParameteri + GL_TEXTURE_2D GL_TEXTURE_MAG_FILTER GL_NEAREST glTexParameteri + GL_TEXTURE_2D GL_TEXTURE_MIN_FILTER GL_NEAREST glTexParameteri + GL_TEXTURE_2D 0 r> r> first2 0 r> GL_UNSIGNED_BYTE f glTexImage2D ; + +: (line-art-color-texture) ( dim -- texture ) + GL_RGBA16F_ARB GL_RGBA (line-art-framebuffer-texture) ; + +: (line-art-normal-texture) ( dim -- texture ) + GL_RGBA16F_ARB GL_RGBA (line-art-framebuffer-texture) ; + +: (line-art-depth-texture) ( dim -- texture ) + GL_DEPTH_COMPONENT32 GL_DEPTH_COMPONENT (line-art-framebuffer-texture) ; + +: (attach-framebuffer-texture) ( texture attachment -- ) + swap >r >r GL_FRAMEBUFFER_EXT r> GL_TEXTURE_2D r> 0 glFramebufferTexture2DEXT gl-error ; + +: (line-art-framebuffer) ( color-texture normal-texture depth-texture -- framebuffer ) + 3array gen-framebuffer dup [ + swap GL_COLOR_ATTACHMENT0_EXT + GL_COLOR_ATTACHMENT1_EXT + GL_DEPTH_ATTACHMENT_EXT 3array [ (attach-framebuffer-texture) ] 2each + check-framebuffer + ] with-framebuffer ; + +: line-art-remake-framebuffer-if-needed ( gadget -- ) + dup { rect-dim rect-dim line-art-gadget-framebuffer-dim } get-slots = [ 2drop ] [ + swap >r + dup (line-art-color-texture) gl-error + swap dup (line-art-normal-texture) gl-error + swap dup (line-art-depth-texture) gl-error + swap >r + [ (line-art-framebuffer) ] 3keep + r> r> { set-line-art-gadget-framebuffer + set-line-art-gadget-color-texture + set-line-art-gadget-normal-texture + set-line-art-gadget-depth-texture + set-line-art-gadget-framebuffer-dim } set-slots + ] if ; + +M: line-art-gadget graft* ( gadget -- ) + GL_CULL_FACE glEnable + GL_DEPTH_TEST glEnable + (line-art-step1-program) over set-line-art-gadget-step1-program + (line-art-step2-program) swap set-line-art-gadget-step2-program ; + +M: line-art-gadget ungraft* ( gadget -- ) + dup line-art-gadget-framebuffer [ + { [ line-art-gadget-step1-program delete-gl-program ] + [ line-art-gadget-step2-program delete-gl-program ] + [ line-art-gadget-framebuffer delete-framebuffer ] + [ line-art-gadget-color-texture delete-texture ] + [ line-art-gadget-normal-texture delete-texture ] + [ line-art-gadget-depth-texture delete-texture ] + [ f swap set-line-art-gadget-framebuffer-dim ] + [ f swap set-line-art-gadget-framebuffer ] } call-with + ] [ drop ] if ; + +: line-art-draw-setup ( gadget -- gadget ) + 0.0 0.0 0.0 1.0 glClearColor + GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT bitor glClear + dup demo-gadget-set-matrices + dup line-art-remake-framebuffer-if-needed gl-error ; + +: line-art-clear-framebuffer ( -- ) + GL_COLOR_ATTACHMENT0_EXT glDrawBuffer + 0.2 0.2 0.2 1.0 glClearColor + GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT bitor glClear + GL_COLOR_ATTACHMENT1_EXT glDrawBuffer + 0.0 0.0 0.0 0.0 glClearColor + GL_COLOR_BUFFER_BIT glClear ; + +M: line-art-gadget draw-gadget* ( gadget -- ) + line-art-draw-setup + dup line-art-gadget-framebuffer [ + line-art-clear-framebuffer + GL_COLOR_ATTACHMENT0_EXT GL_COLOR_ATTACHMENT1_EXT 2array set-draw-buffers + dup line-art-gadget-step1-program dup [ + "color" glGetUniformLocation 0.6 0.5 0.5 1.0 glUniform4f + 0.0 -0.12 0.0 glTranslatef + dup line-art-gadget-model first3 draw-bunny + ] with-gl-program + ] with-framebuffer + init-matrices + dup line-art-gadget-color-texture GL_TEXTURE_2D GL_TEXTURE0 bind-texture-unit + dup line-art-gadget-normal-texture GL_TEXTURE_2D GL_TEXTURE1 bind-texture-unit + dup line-art-gadget-depth-texture GL_TEXTURE_2D GL_TEXTURE2 bind-texture-unit + line-art-gadget-step2-program dup [ + { [ "colormap" glGetUniformLocation 0 glUniform1i ] + [ "normalmap" glGetUniformLocation 1 glUniform1i ] + [ "depthmap" glGetUniformLocation 2 glUniform1i ] } call-with + { -1.0 -1.0 } { 1.0 1.0 } draw-rectangle + ] with-gl-program ; + +: line-art-window ( -- ) + [ "Line Art" open-window ] with-ui ; + +MAIN: line-art-window diff --git a/extra/line-art/summary.txt b/extra/line-art/summary.txt new file mode 100644 index 0000000000..06d16da2bf --- /dev/null +++ b/extra/line-art/summary.txt @@ -0,0 +1 @@ +Stanford Bunny rendered with cartoon-style lines instead of shading \ No newline at end of file diff --git a/extra/line-art/tags.txt b/extra/line-art/tags.txt new file mode 100644 index 0000000000..0db7e8e629 --- /dev/null +++ b/extra/line-art/tags.txt @@ -0,0 +1,3 @@ +demos +opengl +glsl \ No newline at end of file diff --git a/extra/opengl-demo-support/authors.txt b/extra/opengl-demo-support/authors.txt new file mode 100644 index 0000000000..6a0dc7293a --- /dev/null +++ b/extra/opengl-demo-support/authors.txt @@ -0,0 +1 @@ +Joe Groff \ No newline at end of file diff --git a/extra/opengl-demo-support/opengl-demo-support.factor b/extra/opengl-demo-support/opengl-demo-support.factor new file mode 100644 index 0000000000..ecc6458d41 --- /dev/null +++ b/extra/opengl-demo-support/opengl-demo-support.factor @@ -0,0 +1,74 @@ +USING: arrays combinators.lib kernel math math.functions math.vectors namespaces + opengl opengl.gl sequences ui ui.gadgets ui.gestures ui.render ; +IN: opengl-demo-support + +: NEAR-PLANE 1.0 64.0 / ; inline +: FAR-PLANE 4.0 ; inline +: FOV 2.0 sqrt 1+ ; inline +: MOUSE-MOTION-SCALE 0.5 ; inline +: MOUSE-DISTANCE-SCALE 1.0 64.0 / ; inline +: KEY-ROTATE-STEP 1.0 ; inline +: KEY-DISTANCE-STEP 1.0 64.0 / ; inline +: DIMS { 640 480 } ; inline + +: FOV-RATIO ( -- fov ) DIMS dup first2 min v/n ; + +SYMBOL: last-drag-loc + +TUPLE: demo-gadget yaw pitch distance ; + +: ( yaw pitch distance -- gadget ) + demo-gadget construct-gadget + [ { set-demo-gadget-yaw set-demo-gadget-pitch set-demo-gadget-distance } set-slots ] keep ; + +: yaw-demo-gadget ( yaw gadget -- ) + [ [ demo-gadget-yaw + ] keep set-demo-gadget-yaw ] keep relayout-1 ; + +: pitch-demo-gadget ( pitch gadget -- ) + [ [ demo-gadget-pitch + ] keep set-demo-gadget-pitch ] keep relayout-1 ; + +: zoom-demo-gadget ( distance gadget -- ) + [ [ demo-gadget-distance + ] keep set-demo-gadget-distance ] keep relayout-1 ; + +M: demo-gadget pref-dim* ( gadget -- dim ) + drop DIMS ; + +: -+ ( x -- -x x ) + dup neg swap ; + +: demo-gadget-frustum ( -- -x x -y y near far ) + FOV-RATIO NEAR-PLANE FOV / v*n + first2 [ -+ ] 2apply NEAR-PLANE FAR-PLANE ; + +: demo-gadget-set-matrices ( gadget -- ) + GL_PROJECTION glMatrixMode + glLoadIdentity + demo-gadget-frustum glFrustum + GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT bitor glClear + GL_MODELVIEW glMatrixMode + glLoadIdentity + { [ >r 0.0 0.0 r> demo-gadget-distance neg glTranslatef ] + [ demo-gadget-pitch 1.0 0.0 0.0 glRotatef ] + [ demo-gadget-yaw 0.0 1.0 0.0 glRotatef ] } call-with ; + +: reset-last-drag-rel ( -- ) + { 0 0 } last-drag-loc set ; +: last-drag-rel ( -- rel ) + drag-loc [ last-drag-loc get v- ] keep last-drag-loc set ; + +: drag-yaw-pitch ( -- yaw pitch ) + last-drag-rel MOUSE-MOTION-SCALE v*n first2 ; + +demo-gadget H{ + { T{ key-down f f "LEFT" } [ KEY-ROTATE-STEP neg swap yaw-demo-gadget ] } + { T{ key-down f f "RIGHT" } [ KEY-ROTATE-STEP swap yaw-demo-gadget ] } + { T{ key-down f f "DOWN" } [ KEY-ROTATE-STEP neg swap pitch-demo-gadget ] } + { T{ key-down f f "UP" } [ KEY-ROTATE-STEP swap pitch-demo-gadget ] } + { T{ key-down f f "=" } [ KEY-DISTANCE-STEP neg swap zoom-demo-gadget ] } + { T{ key-down f f "-" } [ KEY-DISTANCE-STEP swap zoom-demo-gadget ] } + + { T{ button-down f f 1 } [ drop reset-last-drag-rel ] } + { T{ drag f 1 } [ drag-yaw-pitch rot [ pitch-demo-gadget ] keep yaw-demo-gadget ] } + { T{ mouse-scroll } [ scroll-direction get second MOUSE-DISTANCE-SCALE * swap zoom-demo-gadget ] } +} set-gestures + diff --git a/extra/opengl-demo-support/summary.txt b/extra/opengl-demo-support/summary.txt new file mode 100644 index 0000000000..eca681450f --- /dev/null +++ b/extra/opengl-demo-support/summary.txt @@ -0,0 +1 @@ +Common support for OpenGL demos \ No newline at end of file diff --git a/extra/opengl-demo-support/tags.txt b/extra/opengl-demo-support/tags.txt new file mode 100644 index 0000000000..a6797bf627 --- /dev/null +++ b/extra/opengl-demo-support/tags.txt @@ -0,0 +1 @@ +opengl diff --git a/extra/opengl/opengl.factor b/extra/opengl/opengl.factor index 80c9b80ea7..9566ffd1e6 100644 --- a/extra/opengl/opengl.factor +++ b/extra/opengl/opengl.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2005, 2007 Slava Pestov. ! Portions copyright (C) 2007 Eduardo Cavazos. ! See http://factorcode.org/license.txt for BSD license. -USING: alien alien.c-types kernel libc math namespaces sequences +USING: alien alien.c-types continuations kernel libc math namespaces sequences math.vectors math.constants math.functions opengl.gl opengl.glu combinators arrays ; IN: opengl @@ -93,8 +93,60 @@ IN: opengl ] 2each 2drop ] do-state ; +: (gen-gl-object) ( quot -- id ) + >r 1 0 r> keep *uint ; inline : gen-texture ( -- id ) - 1 0 [ glGenTextures ] keep *uint ; + [ glGenTextures ] (gen-gl-object) ; +: gen-framebuffer ( -- id ) + [ glGenFramebuffersEXT ] (gen-gl-object) ; +: gen-renderbuffer ( -- id ) + [ glGenRenderbuffersEXT ] (gen-gl-object) ; +: gen-buffer ( -- id ) + [ glGenBuffers ] (gen-gl-object) ; + +: (delete-gl-object) ( id quot -- ) + >r 1 swap r> call ; inline +: delete-texture ( id -- ) + [ glDeleteTextures ] (delete-gl-object) ; +: delete-framebuffer ( id -- ) + [ glDeleteFramebuffersEXT ] (delete-gl-object) ; +: delete-renderbuffer ( id -- ) + [ glDeleteRenderbuffersEXT ] (delete-gl-object) ; +: delete-buffer ( id -- ) + [ glDeleteBuffers ] (delete-gl-object) ; + +: framebuffer-incomplete? ( -- ? ) + GL_FRAMEBUFFER_EXT glCheckFramebufferStatusEXT + dup GL_FRAMEBUFFER_COMPLETE_EXT = f rot ? ; + +: framebuffer-error ( status -- * ) + { { GL_FRAMEBUFFER_COMPLETE_EXT [ "framebuffer complete" ] } + { GL_FRAMEBUFFER_UNSUPPORTED_EXT [ "framebuffer configuration unsupported" ] } + { GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT [ "framebuffer incomplete (incomplete attachment)" ] } + { GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT [ "framebuffer incomplete (missing attachment)" ] } + { GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT [ "framebuffer incomplete (dimension mismatch)" ] } + { GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT [ "framebuffer incomplete (format mismatch)" ] } + { GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT [ "framebuffer incomplete (draw buffer(s) have no attachment)" ] } + { GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT [ "framebuffer incomplete (read buffer has no attachment)" ] } + [ drop gl-error "unknown framebuffer error" ] } case throw ; + +: check-framebuffer ( -- ) + framebuffer-incomplete? [ framebuffer-error ] when* ; + +: with-framebuffer ( id quot -- ) + GL_FRAMEBUFFER_EXT rot glBindFramebufferEXT + call + GL_FRAMEBUFFER_EXT 0 glBindFramebufferEXT ; inline + +: bind-texture-unit ( id target unit -- ) + glActiveTexture swap glBindTexture gl-error ; + +: framebuffer-attachment ( attachment -- id ) + GL_FRAMEBUFFER_EXT swap GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT + 0 [ glGetFramebufferAttachmentParameterivEXT ] keep *uint ; + +: set-draw-buffers ( buffers -- ) + dup length swap >c-uint-array glDrawBuffers ; : do-attribs ( bits quot -- ) swap glPushAttrib call glPopAttrib ; inline @@ -120,7 +172,7 @@ TUPLE: sprite loc dim dim2 dlist texture ; GL_UNSIGNED_BYTE r> glTexImage2D ] do-attribs ] keep ; - + : gen-dlist ( -- id ) 1 glGenLists ; : make-dlist ( type quot -- id ) @@ -154,6 +206,14 @@ TUPLE: sprite loc dim dim2 dlist texture ; swap sprite-loc v- gl-translate GL_TEXTURE_2D 0 glBindTexture ; +: draw-rectangle ( lower-left upper-right -- ) + GL_QUADS [ + over first2 glVertex2d + dup first pick second glVertex2d + dup first2 glVertex2d + swap first swap second glVertex2d + ] do-state ; + : make-sprite-dlist ( sprite -- id ) GL_MODELVIEW [ GL_COMPILE [ draw-sprite ] make-dlist @@ -167,7 +227,7 @@ TUPLE: sprite loc dim dim2 dlist texture ; : free-sprite ( sprite -- ) dup sprite-dlist delete-dlist - sprite-texture 1 swap glDeleteTextures ; + sprite-texture delete-texture ; : free-sprites ( sprites -- ) [ [ free-sprite ] when* ] each ; @@ -241,7 +301,7 @@ PREDICATE: gl-shader fragment-shader (fragment-shader?) ; [ dupd glAttachShader ] each [ glLinkProgram ] keep gl-error ; - + : (gl-program?) ( object -- ? ) dup integer? [ glIsProgram c-true? ] [ drop f ] if ; @@ -279,6 +339,12 @@ PREDICATE: gl-shader fragment-shader (fragment-shader?) ; delete-gl-program-only ; : with-gl-program ( program quot -- ) - swap glUseProgram call 0 glUseProgram ; inline + swap glUseProgram [ call ] [ 0 glUseProgram ] [ ] cleanup ; inline PREDICATE: integer gl-program (gl-program?) ; + +: ( vertex-shader-source fragment-shader-source -- program ) + >r check-gl-shader + r> check-gl-shader + 2array check-gl-program ; + From 993684ebb001b01521dd472809b54e4e4d9ddc8a Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Fri, 25 Jan 2008 02:21:27 -0400 Subject: [PATCH 092/216] More work in progress --- extra/io/windows/launcher/launcher.factor | 7 ++++--- extra/io/windows/nt/launcher/launcher.factor | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/extra/io/windows/launcher/launcher.factor b/extra/io/windows/launcher/launcher.factor index 6d7a96b069..bd2a4adb6e 100755 --- a/extra/io/windows/launcher/launcher.factor +++ b/extra/io/windows/launcher/launcher.factor @@ -26,11 +26,13 @@ TUPLE: CreateProcess-args "STARTUPINFO" "STARTUPINFO" heap-size over set-STARTUPINFO-cb "PROCESS_INFORMATION" + TRUE { set-CreateProcess-args-bInheritHandles set-CreateProcess-args-dwCreateFlags set-CreateProcess-args-lpStartupInfo set-CreateProcess-args-lpProcessInformation + set-CreateProcess-args-bInheritHandles } \ CreateProcess-args construct ; : call-CreateProcess ( CreateProcess-args -- ) @@ -143,13 +145,12 @@ TUPLE: CreateProcess-args default-CreateProcess-args wince? [ fill-lpApplicationName ] [ fill-lpCommandLine ] if fill-dwCreateFlags - fill-lpEnvironment - fill-startup-info ; + fill-lpEnvironment ; M: windows-io run-process* ( desc -- handle ) [ [ - make-CreateProcess-args + make-CreateProcess-args fill-startup-info dup call-CreateProcess CreateProcess-args-lpProcessInformation ] with-descriptor diff --git a/extra/io/windows/nt/launcher/launcher.factor b/extra/io/windows/nt/launcher/launcher.factor index f548c5945c..c2f14c21bb 100755 --- a/extra/io/windows/nt/launcher/launcher.factor +++ b/extra/io/windows/nt/launcher/launcher.factor @@ -34,10 +34,10 @@ M: windows-io process-stream* [ [ make-CreateProcess-args - TRUE over set-CreateProcess-args-bInheritHandles fill-stdout-pipe fill-stdin-pipe + fill-startup-info dup call-CreateProcess From d09bc942ac96acbeb1287dd4e143176c4e7f2b56 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Fri, 25 Jan 2008 00:21:49 -0600 Subject: [PATCH 093/216] Get file redirection working in Unix io.launcher --- extra/io/launcher/launcher.factor | 2 +- extra/io/unix/launcher/launcher.factor | 19 ++++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/extra/io/launcher/launcher.factor b/extra/io/launcher/launcher.factor index fe3244916d..7cf9d51ed0 100755 --- a/extra/io/launcher/launcher.factor +++ b/extra/io/launcher/launcher.factor @@ -67,7 +67,7 @@ GENERIC: >descriptor ( obj -- desc ) M: string >descriptor +command+ associate ; M: sequence >descriptor +arguments+ associate ; -M: assoc >descriptor ; +M: assoc >descriptor >hashtable ; HOOK: run-process* io-backend ( desc -- handle ) diff --git a/extra/io/unix/launcher/launcher.factor b/extra/io/unix/launcher/launcher.factor index 1e4d5fab52..0135b55a7e 100755 --- a/extra/io/unix/launcher/launcher.factor +++ b/extra/io/unix/launcher/launcher.factor @@ -1,9 +1,10 @@ ! Copyright (C) 2007, 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: io io.backend io.launcher io.unix.backend io.nonblocking -sequences kernel namespaces math system alien.c-types debugger -continuations arrays assocs combinators unix.process -parser-combinators memoize promises strings threads ; +USING: io io.backend io.launcher io.unix.backend io.unix.files +io.nonblocking sequences kernel namespaces math system + alien.c-types debugger continuations arrays assocs +combinators unix.process parser-combinators memoize +promises strings threads ; IN: io.unix.launcher ! Search unix first @@ -42,21 +43,21 @@ MEMO: 'arguments' ( -- parser ) : assoc>env ( assoc -- env ) [ "=" swap 3append ] { } assoc>map ; -: (redirect) +: (redirect) ( path mode fd -- ) >r file-mode open dup io-error dup - r> dup2 io-error close drop ; + r> dup2 io-error close ; : redirect ( obj mode fd -- ) { { [ pick not ] [ 3drop ] } - { [ pick +closed+ eq? ] [ close 3drop ] } - { [ t ] [ (redirect) ] } + { [ pick +closed+ eq? ] [ close 2drop ] } + { [ pick string? ] [ (redirect) ] } } cond ; : setup-redirection ( -- ) +stdin+ get read-flags 0 redirect +stdout+ get write-flags 1 redirect - +stderr+ get read-flags 2 redirect ; + +stderr+ get write-flags 2 redirect ; : spawn-process ( -- ) [ From 76e4702f38b04f23be87671a7d0539a769406708 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Fri, 25 Jan 2008 02:37:37 -0400 Subject: [PATCH 094/216] Got Windows launcher redirection working --- extra/io/launcher/launcher-docs.factor | 5 +++++ extra/io/windows/launcher/launcher.factor | 15 +++++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/extra/io/launcher/launcher-docs.factor b/extra/io/launcher/launcher-docs.factor index 495894b25d..28063bae0d 100755 --- a/extra/io/launcher/launcher-docs.factor +++ b/extra/io/launcher/launcher-docs.factor @@ -154,9 +154,14 @@ $nl { $subsection +detached+ } { $subsection +environment+ } { $subsection +environment-mode+ } +"Redirecting standard input and output to files:" +{ $subsection +stdin+ } +{ $subsection +stdout+ } +{ $subsection +stderr+ } "The following words are used to launch processes:" { $subsection run-process } { $subsection run-detached } +"Redirecting standard input and output to a pipe:" { $subsection } { $subsection with-process-stream } "A class representing an active or finished process:" diff --git a/extra/io/windows/launcher/launcher.factor b/extra/io/windows/launcher/launcher.factor index bd2a4adb6e..7b793ef74d 100755 --- a/extra/io/windows/launcher/launcher.factor +++ b/extra/io/windows/launcher/launcher.factor @@ -21,14 +21,12 @@ TUPLE: CreateProcess-args stdout-pipe stdin-pipe ; : default-CreateProcess-args ( -- obj ) - 0 0 "STARTUPINFO" "STARTUPINFO" heap-size over set-STARTUPINFO-cb "PROCESS_INFORMATION" TRUE { - set-CreateProcess-args-bInheritHandles set-CreateProcess-args-dwCreateFlags set-CreateProcess-args-lpStartupInfo set-CreateProcess-args-lpProcessInformation @@ -103,25 +101,26 @@ TUPLE: CreateProcess-args : redirect ( obj access-mode create-mode -- handle ) { { [ pick not ] [ 3drop f ] } - { [ pick +closed+ eq? ] [ 3drop f ] } + { [ pick +closed+ eq? ] [ 3drop t ] } { [ pick string? ] [ (redirect) ] } } cond ; +: ?closed or dup t eq? [ drop f ] when ; + : inherited-stdout ( args -- handle ) CreateProcess-args-stdout-pipe [ pipe-out ] [ STD_OUTPUT_HANDLE GetStdHandle ] if* ; : redirect-stdout ( args -- handle ) +stdout+ get GENERIC_WRITE CREATE_ALWAYS redirect - swap inherited-stdout or ; + swap inherited-stdout ?closed ; : inherited-stderr ( args -- handle ) - CreateProcess-args-stdout-pipe - [ pipe-out ] [ STD_ERROR_HANDLE GetStdHandle ] if* ; + drop STD_ERROR_HANDLE GetStdHandle ; : redirect-stderr ( args -- handle ) +stderr+ get GENERIC_WRITE CREATE_ALWAYS redirect - swap inherited-stderr or ; + swap inherited-stderr ?closed ; : inherited-stdin ( args -- handle ) CreateProcess-args-stdin-pipe @@ -129,7 +128,7 @@ TUPLE: CreateProcess-args : redirect-stdin ( args -- handle ) +stdin+ get GENERIC_READ OPEN_EXISTING redirect - swap inherited-stdin or ; + swap inherited-stdin ?closed ; : fill-startup-info dup CreateProcess-args-lpStartupInfo From d5ac6de191b6d627a9783c8abb4a82a814b98cc2 Mon Sep 17 00:00:00 2001 From: Eduardo Cavazos Date: Fri, 25 Jan 2008 01:44:43 -0600 Subject: [PATCH 095/216] Add 'compiler' tag to some vocabs --- core/cpu/architecture/tags.txt | 1 + core/cpu/arm/tags.txt | 1 + core/cpu/ppc/tags.txt | 1 + core/cpu/x86/32/tags.txt | 1 + core/cpu/x86/64/tags.txt | 1 + 5 files changed, 5 insertions(+) create mode 100644 core/cpu/architecture/tags.txt create mode 100644 core/cpu/arm/tags.txt create mode 100644 core/cpu/ppc/tags.txt create mode 100644 core/cpu/x86/32/tags.txt create mode 100644 core/cpu/x86/64/tags.txt diff --git a/core/cpu/architecture/tags.txt b/core/cpu/architecture/tags.txt new file mode 100644 index 0000000000..86a7c8e637 --- /dev/null +++ b/core/cpu/architecture/tags.txt @@ -0,0 +1 @@ +compiler diff --git a/core/cpu/arm/tags.txt b/core/cpu/arm/tags.txt new file mode 100644 index 0000000000..86a7c8e637 --- /dev/null +++ b/core/cpu/arm/tags.txt @@ -0,0 +1 @@ +compiler diff --git a/core/cpu/ppc/tags.txt b/core/cpu/ppc/tags.txt new file mode 100644 index 0000000000..86a7c8e637 --- /dev/null +++ b/core/cpu/ppc/tags.txt @@ -0,0 +1 @@ +compiler diff --git a/core/cpu/x86/32/tags.txt b/core/cpu/x86/32/tags.txt new file mode 100644 index 0000000000..86a7c8e637 --- /dev/null +++ b/core/cpu/x86/32/tags.txt @@ -0,0 +1 @@ +compiler diff --git a/core/cpu/x86/64/tags.txt b/core/cpu/x86/64/tags.txt new file mode 100644 index 0000000000..86a7c8e637 --- /dev/null +++ b/core/cpu/x86/64/tags.txt @@ -0,0 +1 @@ +compiler From 62ded50c8bc9f9864803574c31df1d472b4d2786 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sat, 26 Jan 2008 03:40:09 -0400 Subject: [PATCH 096/216] Directory change notification work in progress. Only on Windows right now, blocking --- core/assocs/assocs.factor | 3 + core/compiler/compiler.factor | 3 - extra/io/monitor/monitor.factor | 11 +++ extra/io/windows/directory/directory.factor | 34 ---------- extra/io/windows/nt/monitor/monitor.factor | 74 +++++++++++++++++++++ extra/windows/kernel32/kernel32.factor | 2 +- 6 files changed, 89 insertions(+), 38 deletions(-) mode change 100644 => 100755 core/assocs/assocs.factor create mode 100755 extra/io/monitor/monitor.factor delete mode 100644 extra/io/windows/directory/directory.factor create mode 100755 extra/io/windows/nt/monitor/monitor.factor diff --git a/core/assocs/assocs.factor b/core/assocs/assocs.factor old mode 100644 new mode 100755 index 799a6eb367..1983608624 --- a/core/assocs/assocs.factor +++ b/core/assocs/assocs.factor @@ -77,6 +77,9 @@ M: assoc assoc-clone-like ( assoc exemplar -- newassoc ) : rename-at ( newkey key assoc -- ) tuck delete-at* [ -rot set-at ] [ 3drop ] if ; +: delete-any ( assoc -- element ) + [ [ 2drop t ] assoc-find 2drop dup ] keep delete-at ; + : assoc-empty? ( assoc -- ? ) assoc-size zero? ; diff --git a/core/compiler/compiler.factor b/core/compiler/compiler.factor index 8d9f004270..9378642951 100755 --- a/core/compiler/compiler.factor +++ b/core/compiler/compiler.factor @@ -42,9 +42,6 @@ IN: compiler [ dupd compile-failed f save-effect ] recover ; -: delete-any ( assoc -- element ) - [ [ 2drop t ] assoc-find 2drop dup ] keep delete-at ; - : compile-loop ( assoc -- ) dup assoc-empty? [ drop ] [ dup delete-any (compile) diff --git a/extra/io/monitor/monitor.factor b/extra/io/monitor/monitor.factor new file mode 100755 index 0000000000..c74a449181 --- /dev/null +++ b/extra/io/monitor/monitor.factor @@ -0,0 +1,11 @@ +! Copyright (C) 2008 Slava Pestov. +! See http://factorcode.org/license.txt for BSD license. +USING: io.backend ; +IN: io.monitor + +HOOK: io-backend ( path -- monitor ) + +HOOK: next-change io-backend ( monitor -- path ) + +: with-monitor ( directory quot -- ) + >r r> over [ close-monitor ] curry [ ] cleanup ; diff --git a/extra/io/windows/directory/directory.factor b/extra/io/windows/directory/directory.factor deleted file mode 100644 index 4728a063a0..0000000000 --- a/extra/io/windows/directory/directory.factor +++ /dev/null @@ -1,34 +0,0 @@ -USING: alien.c-types destructors io.windows -io.windows.nt.backend kernel math windows -windows.kernel32 windows.types libc ; -IN: io.windows.directory - -: open-directory ( path -- handle ) - [ - FILE_LIST_DIRECTORY - share-mode - f - OPEN_EXISTING - FILE_FLAG_BACKUP_SEMANTICS FILE_FLAG_OVERLAPPED bitor - f - CreateFile - dup invalid-handle? dup close-later - dup add-completion - ] with-destructors ; - -: directory-notifications ( -- n ) - FILE_NOTIFY_CHANGE_FILE_NAME FILE_NOTIFY_CHANGE_DIR_NAME bitor ; - -: read-directory-changes ( handle -- ) - [ - 65536 dup malloc - swap - TRUE - directory-notifications - 0 - (make-overlapped) - ! f works here, blocking - f - ReadDirectoryChangesW win32-error=0/f - ] with-destructors ; - diff --git a/extra/io/windows/nt/monitor/monitor.factor b/extra/io/windows/nt/monitor/monitor.factor new file mode 100755 index 0000000000..2b3b87b2bd --- /dev/null +++ b/extra/io/windows/nt/monitor/monitor.factor @@ -0,0 +1,74 @@ +! Copyright (C) 2008 Doug Coleman, Slava Pestov. +! See http://factorcode.org/license.txt for BSD license. +USING: alien.c-types destructors io.windows kernel math windows +windows.kernel32 windows.types libc assocs alien namespaces +continuations io.monitor ; +IN: io.windows.nt.monitor + +TUPLE: monitor handle buffer queue closed? ; + +: open-directory ( path -- handle ) + [ + FILE_LIST_DIRECTORY + share-mode + f + OPEN_EXISTING + FILE_FLAG_BACKUP_SEMANTICS FILE_FLAG_OVERLAPPED bitor + f + CreateFile dup invalid-handle? dup close-later + ] with-destructors ; + +: buffer-size 65536 ; inline + +M: windows-nt-io ( path -- monitor ) + [ + open-directory + buffer-size malloc dup free-later f + ] with-destructors + f monitor construct-boa ; + +: check-closed ( monitor -- ) + monitor-closed? [ "Monitor closed" throw ] when ; + +: close-monitor ( monitor -- ) + dup check-closed + dup monitor-buffer free + dup monitor-handle CloseHandle drop + t swap set-monitor-closed? ; + +: fill-buffer ( monitor -- bytes ) + [ + dup monitor-handle + swap monitor-buffer + buffer-size + TRUE + FILE_NOTIFY_CHANGE_ALL + 0 [ + f + f + ReadDirectoryChangesW win32-error=0/f + ] keep *uint + ] with-destructors ; + +: (changed-files) ( buffer -- ) + dup { + FILE_NOTIFY_INFORMATION-NextEntryOffset + FILE_NOTIFY_INFORMATION-FileName + FILE_NOTIFY_INFORMATION-FileNameLength + } get-slots memory>string dup set + dup zero? [ 2drop ] [ + swap (changed-files) + ] if ; + +: changed-files ( buffer len -- assoc ) + [ zero? [ drop ] [ (changed-files) ] if ] H{ } make-assoc ; + +: fill-queue ( monitor -- ) + dup monitor-buffer + over fill-buffer changed-files + swap set-monitor-queue ; + +M: windows-nt-io next-change ( monitor -- path ) + dup check-closed + dup monitor-queue dup assoc-empty? + [ drop dup fill-queue next-change ] [ nip delete-any ] if ; diff --git a/extra/windows/kernel32/kernel32.factor b/extra/windows/kernel32/kernel32.factor index 1c75e33698..15bdcd3e37 100755 --- a/extra/windows/kernel32/kernel32.factor +++ b/extra/windows/kernel32/kernel32.factor @@ -87,7 +87,7 @@ C-STRUCT: FILE_NOTIFY_INFORMATION { "DWORD" "NextEntryOffset" } { "DWORD" "Action" } { "DWORD" "FileNameLength" } - { "WCHAR*" "FileName" } ; + { "WCHAR[1]" "FileName" } ; TYPEDEF: FILE_NOTIFY_INFORMATION* PFILE_NOTIFY_INFORMATION : STD_INPUT_HANDLE -10 ; inline From ca6247f3b3e7956bb8e76773bf7534654730e333 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sat, 26 Jan 2008 16:59:53 -0800 Subject: [PATCH 097/216] Catch exceptions thrown by graft* and ungraft* in the notify loop so that the gadgets' graft states remain consistent --- extra/ui/ui.factor | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/extra/ui/ui.factor b/extra/ui/ui.factor index febb56e10f..4daadd2765 100755 --- a/extra/ui/ui.factor +++ b/extra/ui/ui.factor @@ -120,12 +120,12 @@ SYMBOL: ui-hook [ dup update-hand draw-world ] each ; : notify ( gadget -- ) - dup gadget-graft-state { - { { f t } [ dup activate-control dup graft* ] } - { { t f } [ dup activate-control dup ungraft* ] } - } case - dup gadget-graft-state first { f f } { t t } ? - swap set-gadget-graft-state ; + dup gadget-graft-state [ dup { + { { f t } [ over activate-control over graft* ] } + { { t f } [ over activate-control over ungraft* ] } + } case ] + [ first { f f } { t t } ? + swap set-gadget-graft-state ] [ ] cleanup ; : notify-queued ( -- ) graft-queue [ notify ] dlist-slurp ; From 1dbc1c1f9bfee0ef016bbe28f381d388cc099f91 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sat, 26 Jan 2008 17:15:09 -0800 Subject: [PATCH 098/216] Improve the line-art demo. Put cleanup guards on libc:with-malloc and opengl:with-framebuffer . --- core/libc/libc.factor | 4 +- extra/line-art/line-art.factor | 103 +++++++++++++++++++-------------- extra/opengl/opengl.factor | 4 +- 3 files changed, 65 insertions(+), 46 deletions(-) diff --git a/core/libc/libc.factor b/core/libc/libc.factor index 88c5070d1f..2006850839 100644 --- a/core/libc/libc.factor +++ b/core/libc/libc.factor @@ -2,7 +2,7 @@ ! Copyright (C) 2007 Slava Pestov ! Copyright (C) 2007 Doug Coleman ! See http://factorcode.org/license.txt for BSD license. -USING: alien assocs init inspector kernel namespaces ; +USING: alien assocs continuations init inspector kernel namespaces ; IN: libc "void" "libc" "memcpy" { "void*" "void*" "ulong" } alien-invoke ; : with-malloc ( size quot -- ) - swap 1 calloc swap keep free ; inline + swap 1 calloc [ swap keep ] [ free ] [ ] cleanup ; inline diff --git a/extra/line-art/line-art.factor b/extra/line-art/line-art.factor index 0fdbdd1321..83f2a6a975 100644 --- a/extra/line-art/line-art.factor +++ b/extra/line-art/line-art.factor @@ -11,7 +11,7 @@ TUPLE: line-art-gadget framebuffer color-texture normal-texture depth-texture framebuffer-dim ; : ( -- line-art-gadget ) - 0.0 0.0 0.375 + 40.0 -5.0 0.275 maybe-download read-model { set-delegate set-line-art-gadget-model } line-art-gadget construct ; @@ -57,62 +57,79 @@ uniform sampler2D colormap, normalmap, depthmap; uniform vec4 line_color; varying vec2 coord; -const float DEPTH_RATIO_THRESHOLD = 2.0, NORMAL_DOT_THRESHOLD = 0.95, SAMPLE_SPREAD = 1.0/1024.0; +const float DEPTH_RATIO_THRESHOLD = 1.001, NORMAL_DOT_THRESHOLD = 1.0, SAMPLE_SPREAD = 1.0/512.0; bool is_normal_border(vec3 norm1, vec3 norm2) { return dot(norm1, norm2) < NORMAL_DOT_THRESHOLD; } -bool -is_depth_border(float depth1, float depth2) + +float +depth_sample(vec2 c) { - float ratio = depth1/depth2; - return 1.0/DEPTH_RATIO_THRESHOLD > ratio || ratio > DEPTH_RATIO_THRESHOLD; + return texture2D(depthmap, c).x; +} +bool +are_depths_border(vec3 depths) +{ + return any(lessThan(depths, vec3(1.0/DEPTH_RATIO_THRESHOLD))) + || any(greaterThan(depths, vec3(DEPTH_RATIO_THRESHOLD))); } -bool -is_border(vec2 coord) +vec3 +normal_sample(vec2 c) { - vec2 coord1 = coord + vec2(-SAMPLE_SPREAD, -SAMPLE_SPREAD), - coord2 = coord + vec2( SAMPLE_SPREAD, -SAMPLE_SPREAD), - coord3 = coord + vec2(-SAMPLE_SPREAD, SAMPLE_SPREAD), - coord4 = coord + vec2( SAMPLE_SPREAD, SAMPLE_SPREAD); + return texture2D(normalmap, c).xyz; +} + +float +min6(float a, float b, float c, float d, float e, float f) +{ + return min(min(min(min(min(a, b), c), d), e), f); +} + +float +border_factor(vec2 c) +{ + vec2 coord1 = c + vec2(-SAMPLE_SPREAD, -SAMPLE_SPREAD), + coord2 = c + vec2( SAMPLE_SPREAD, -SAMPLE_SPREAD), + coord3 = c + vec2(-SAMPLE_SPREAD, SAMPLE_SPREAD), + coord4 = c + vec2( SAMPLE_SPREAD, SAMPLE_SPREAD); - /* This border checking code is meant to be easy to follow rather than blazingly fast. - * The normal/depth checks could be easily parallelized into matrix or vector operations to - * improve performance. */ - vec3 normal1 = texture2D(normalmap, coord1).xyz, - normal2 = texture2D(normalmap, coord2).xyz, - normal3 = texture2D(normalmap, coord3).xyz, - normal4 = texture2D(normalmap, coord4).xyz; - float depth1 = texture2D(depthmap, coord1).x, - depth2 = texture2D(depthmap, coord2).x, - depth3 = texture2D(depthmap, coord3).x, - depth4 = texture2D(depthmap, coord4).x; + vec4 depths = vec4(depth_sample(coord1), + depth_sample(coord2), + depth_sample(coord3), + depth_sample(coord4)); + if (depths == vec4(1, 1, 1, 1)) + return 0.0; - return (depth1 < 1.0 || depth2 < 1.0 || depth3 < 1.0 || depth4 < 1.0) - && (is_normal_border(normal1, normal2) - || is_normal_border(normal1, normal3) - || is_normal_border(normal1, normal4) - || is_normal_border(normal2, normal3) - || is_normal_border(normal2, normal4) - || is_normal_border(normal3, normal4) - /* || is_depth_border(depth1, depth2) - || is_depth_border(depth1, depth3) - || is_depth_border(depth1, depth4) - || is_depth_border(depth2, depth3) - || is_depth_border(depth2, depth4) - || is_depth_border(depth3, depth4) */ - ); + vec3 ratios1 = depths.xxx/depths.yzw, ratios2 = depths.yyz/depths.zww; + + if (are_depths_border(ratios1) || are_depths_border(ratios2)) + return 1.0; + + vec3 normal1 = normal_sample(coord1), + normal2 = normal_sample(coord2), + normal3 = normal_sample(coord3), + normal4 = normal_sample(coord4); + + float normal_border = 1.0 - min6( + dot(normal1, normal2), + dot(normal1, normal3), + dot(normal1, normal4), + dot(normal2, normal3), + dot(normal2, normal4), + dot(normal3, normal4) + ); + + return normal_border; } void main() { - gl_FragColor = is_border(coord) - ? line_color - : texture2D(colormap, coord); + gl_FragColor = mix(texture2D(colormap, coord), line_color, border_factor(coord)); } ; @@ -191,7 +208,8 @@ M: line-art-gadget ungraft* ( gadget -- ) 0.0 0.0 0.0 1.0 glClearColor GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT bitor glClear dup demo-gadget-set-matrices - dup line-art-remake-framebuffer-if-needed gl-error ; + dup line-art-remake-framebuffer-if-needed + gl-error ; : line-art-clear-framebuffer ( -- ) GL_COLOR_ATTACHMENT0_EXT glDrawBuffer @@ -219,7 +237,8 @@ M: line-art-gadget draw-gadget* ( gadget -- ) line-art-gadget-step2-program dup [ { [ "colormap" glGetUniformLocation 0 glUniform1i ] [ "normalmap" glGetUniformLocation 1 glUniform1i ] - [ "depthmap" glGetUniformLocation 2 glUniform1i ] } call-with + [ "depthmap" glGetUniformLocation 2 glUniform1i ] + [ "line_color" glGetUniformLocation 0.2 0.0 0.0 1.0 glUniform4f ] } call-with { -1.0 -1.0 } { 1.0 1.0 } draw-rectangle ] with-gl-program ; diff --git a/extra/opengl/opengl.factor b/extra/opengl/opengl.factor index 9566ffd1e6..737303c16d 100644 --- a/extra/opengl/opengl.factor +++ b/extra/opengl/opengl.factor @@ -135,8 +135,8 @@ IN: opengl : with-framebuffer ( id quot -- ) GL_FRAMEBUFFER_EXT rot glBindFramebufferEXT - call - GL_FRAMEBUFFER_EXT 0 glBindFramebufferEXT ; inline + [ call ] + [ GL_FRAMEBUFFER_EXT 0 glBindFramebufferEXT ] [ ] cleanup ; inline : bind-texture-unit ( id target unit -- ) glActiveTexture swap glBindTexture gl-error ; From e396023d517f1f00c2205886c7ce94fd4c0d854b Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sat, 26 Jan 2008 17:32:12 -0800 Subject: [PATCH 099/216] Use [NSString UTF8String] instead of [NSString cString] in os-macosx.m to suppress deprecation warnings --- vm/os-macosx.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vm/os-macosx.m b/vm/os-macosx.m index 07695b77fb..d14e6ceb23 100644 --- a/vm/os-macosx.m +++ b/vm/os-macosx.m @@ -30,7 +30,7 @@ void early_init(void) const char *vm_executable_path(void) { - return [[[NSBundle mainBundle] executablePath] cString]; + return [[[NSBundle mainBundle] executablePath] UTF8String]; } const char *default_image_path(void) @@ -55,7 +55,7 @@ const char *default_image_path(void) else returnVal = [path stringByAppendingPathComponent:image]; - return [returnVal cString]; + return [returnVal UTF8String]; } void init_signals(void) From a09e2165823a892064ce94b715bd646117938c59 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sat, 26 Jan 2008 23:38:30 -0400 Subject: [PATCH 100/216] Replace memory>string and string>memory with four primitives and update io.windows.nt.monitor --- core/alien/alien-docs.factor | 237 +-------------------- core/alien/arrays/arrays-docs.factor | 73 +++++++ core/alien/c-types/c-types-docs.factor | 182 +++++++++++++++- core/alien/c-types/c-types.factor | 22 ++ core/alien/structs/structs-docs.factor | 35 ++- core/assocs/assocs-docs.factor | 7 + core/assocs/assocs.factor | 7 +- core/bootstrap/primitives.factor | 22 +- core/hashtables/hashtables-docs.factor | 13 +- core/hashtables/hashtables-tests.factor | 3 + core/hashtables/hashtables.factor | 3 + extra/io/buffers/buffers-tests.factor | 4 +- extra/io/buffers/buffers.factor | 12 +- extra/io/monitor/monitor.factor | 16 +- extra/io/sockets/headers/bsd/bsd.factor | 2 +- extra/io/sockets/headers/headers.factor | 4 + extra/io/sockets/impl/impl.factor | 9 +- extra/io/windows/ce/sockets/sockets.factor | 2 +- extra/io/windows/nt/monitor/monitor.factor | 57 +++-- extra/io/windows/nt/nt.factor | 7 +- extra/io/windows/nt/sockets/sockets.factor | 2 +- extra/opengl/opengl.factor | 2 +- vm/primitives.c | 2 - vm/types.c | 6 - vm/types.h | 4 - 25 files changed, 421 insertions(+), 312 deletions(-) create mode 100755 core/alien/arrays/arrays-docs.factor mode change 100644 => 100755 core/alien/c-types/c-types-docs.factor mode change 100644 => 100755 core/alien/structs/structs-docs.factor mode change 100644 => 100755 core/assocs/assocs-docs.factor mode change 100644 => 100755 core/hashtables/hashtables-docs.factor mode change 100644 => 100755 core/hashtables/hashtables.factor mode change 100644 => 100755 extra/io/buffers/buffers-tests.factor mode change 100644 => 100755 extra/io/buffers/buffers.factor mode change 100644 => 100755 extra/io/sockets/headers/bsd/bsd.factor mode change 100644 => 100755 extra/io/sockets/headers/headers.factor mode change 100644 => 100755 extra/opengl/opengl.factor diff --git a/core/alien/alien-docs.factor b/core/alien/alien-docs.factor index 089091bec5..8fee0e8c3e 100755 --- a/core/alien/alien-docs.factor +++ b/core/alien/alien-docs.factor @@ -1,5 +1,5 @@ USING: byte-arrays arrays help.syntax help.markup -alien.syntax alien.c-types compiler definitions math libc +alien.syntax compiler definitions math libc debugger parser io io.backend system bit-arrays float-arrays ; IN: alien @@ -156,36 +156,6 @@ ARTICLE: "aliens" "Alien addresses" $nl "Usually alien objects do not have to created and dereferenced directly; instead declaring C function parameters and return values as having a pointer type such as " { $snippet "void*" } " takes care of the details. See " { $link "c-types-specs" } "." ; -ARTICLE: "c-structs" "C structure types" -"A " { $snippet "struct" } " in C is essentially a block of memory with the value of each structure field stored at a fixed offset from the start of the block. The C library interface provides some utilities to define words which read and write structure fields given a base address." -{ $subsection POSTPONE: C-STRUCT: } -"Great care must be taken when working with C structures since no type or bounds checking is possible." -$nl -"An example:" -{ $code - "C-STRUCT: XVisualInfo" - " { \"Visual*\" \"visual\" }" - " { \"VisualID\" \"visualid\" }" - " { \"int\" \"screen\" }" - " { \"uint\" \"depth\" }" - " { \"int\" \"class\" }" - " { \"ulong\" \"red_mask\" }" - " { \"ulong\" \"green_mask\" }" - " { \"ulong\" \"blue_mask\" }" - " { \"int\" \"colormap_size\" }" - " { \"int\" \"bits_per_rgb\" } ;" -} -"C structure objects can be allocated by calling " { $link } " or " { $link malloc-object } "." -$nl -"Arrays of C structures can be created by calling " { $link } " or " { $link malloc-array } ". Elements can be read and written using words named " { $snippet { $emphasis "type" } "-nth" } " and " { $snippet "set-" { $emphasis "type" } "-nth" } "; these words are automatically generated by " { $link POSTPONE: C-STRUCT: } "." ; - -ARTICLE: "c-unions" "C unions" -"A " { $snippet "union" } " in C defines a type large enough to hold its largest member. This is usually used to allocate a block of memory which can hold one of several types of values." -{ $subsection POSTPONE: C-UNION: } -"C structure objects can be allocated by calling " { $link } " or " { $link malloc-object } "." -$nl -"Arrays of C unions can be created by calling " { $link } " or " { $link malloc-array } ". Elements can be read and written using words named " { $snippet { $emphasis "type" } "-nth" } " and " { $snippet "set-" { $emphasis "type" } "-nth" } "; these words are automatically generated by " { $link POSTPONE: C-UNION: } "." ; - ARTICLE: "reading-writing-memory" "Reading and writing memory directly" "Numerical values can be read from memory addresses and converted to Factor objects using the various typed memory accessor words:" { $subsection alien-signed-1 } @@ -253,211 +223,6 @@ $nl { $subsection dlsym } { $subsection dlclose } ; -ARTICLE: "c-types-specs" "C type specifiers" -"C types are identified by strings, and type names occur as parameters to the " { $link alien-invoke } ", " { $link alien-indirect } " and " { $link alien-callback } " words, as well as " { $link POSTPONE: C-STRUCT: } ", " { $link POSTPONE: C-UNION: } " and " { $link POSTPONE: TYPEDEF: } "." -$nl -"The following numerical types are available; a " { $snippet "u" } " prefix denotes an unsigned type:" -{ $table - { "C type" "Notes" } - { { $snippet "char" } "always 1 byte" } - { { $snippet "uchar" } { } } - { { $snippet "short" } "always 2 bytes" } - { { $snippet "ushort" } { } } - { { $snippet "int" } "always 4 bytes" } - { { $snippet "uint" } { } } - { { $snippet "long" } { "same size as CPU word size and " { $snippet "void*" } ", except on 64-bit Windows, where it is 4 bytes" } } - { { $snippet "ulong" } { } } - { { $snippet "longlong" } "always 8 bytes" } - { { $snippet "ulonglong" } { } } - { { $snippet "float" } { } } - { { $snippet "double" } { "same format as " { $link float } " objects" } } -} -"When making alien calls, Factor numbers are converted to and from the above types in a canonical way. Converting a Factor number to a C value may result in a loss of precision." -$nl -"Pointer types are specified by suffixing a C type with " { $snippet "*" } ", for example " { $snippet "float*" } ". One special case is " { $snippet "void*" } ", which denotes a generic pointer; " { $snippet "void" } " by itself is not a valid C type specifier. With the exception of strings (see " { $link "c-strings" } "), all pointer types are identical to " { $snippet "void*" } " as far as the C library interface is concerned." -$nl -"Fixed-size array types are supported; the syntax consists of a C type name followed by dimension sizes in brackets; the following denotes a 3 by 4 array of integers:" -{ $code "int[3][4]" } -"Fixed-size arrays differ from pointers in that they are allocated inside structures and unions; however when used as function parameters they behave exactly like pointers and thus the dimensions only serve as documentation." -$nl -"Structure and union types are specified by the name of the structure or union." ; - -ARTICLE: "c-byte-arrays" "Passing data in byte arrays" -"Instances of the " { $link byte-array } ", " { $link bit-array } " and " { $link float-array } " class can be passed to C functions; the C function receives a pointer to the first element of the array." -$nl -"Byte arrays can be allocated directly with a byte count using the " { $link } " word. However in most cases, instead of computing a size in bytes directly, it is easier to use a higher-level word which expects C type and outputs a byte array large enough to hold that type:" -{ $subsection } -{ $subsection } -{ $warning -"The Factor garbage collector can move byte arrays around, and it is only safe to pass byte arrays to C functions if the function does not store a pointer to the byte array in some global structure, or retain it in any way after returning." -$nl -"Long-lived data for use by C libraries can be allocated manually, just as when programming in C. See " { $link "malloc" } "." } -{ $see-also "c-arrays" } ; - -ARTICLE: "malloc" "Manual memory management" -"Sometimes data passed to C functions must be allocated at a fixed address, and so garbage collector managed byte arrays cannot be used. See the warning at the bottom of " { $link "c-byte-arrays" } " for a description of when this is the case." -$nl -"Allocating a C datum with a fixed address:" -{ $subsection malloc-object } -{ $subsection malloc-array } -{ $subsection malloc-byte-array } -"There is a set of words in the " { $vocab-link "libc" } " vocabulary which directly call C standard library memory management functions:" -{ $subsection malloc } -{ $subsection calloc } -{ $subsection realloc } -"The return value of the above three words must always be checked for a memory allocation failure:" -{ $subsection check-ptr } -"You must always free pointers returned by any of the above words when the block of memory is no longer in use:" -{ $subsection free } -"You can unsafely copy a range of bytes from one memory location to another:" -{ $subsection memcpy } -"A wrapper for temporarily allocating a block of memory:" -{ $subsection with-malloc } ; - -ARTICLE: "c-strings" "C strings" -"The C library interface defines two types of C strings:" -{ $table - { "C type" "Notes" } - { { $snippet "char*" } "8-bit per character null-terminated ASCII" } - { { $snippet "ushort*" } "16-bit per character null-terminated UCS-2" } -} -"Passing a Factor string to a C function expecting a C string allocates a " { $link byte-array } " in the Factor heap; the string is then converted to the requested format and a raw pointer is passed to the function. If the conversion fails, for example if the string contains null bytes or characters with values higher than 255, a " { $link c-string-error. } " is thrown." -"Sometimes a C function has a parameter type of " { $snippet "void*" } ", and various data types, among them strings, can be passed in. In this case, strings are not automatically converted to aliens, and instead you must call one of these words:" -{ $subsection string>char-alien } -{ $subsection string>u16-alien } -{ $subsection malloc-char-string } -{ $subsection malloc-u16-string } -"The first two allocate " { $link byte-array } "s, and the latter allocates manually-managed memory which is not moved by the garbage collector and has to be explicitly freed by calling " { $link free } "." -$nl -"Finally, a set of words can be used to read and write " { $snippet "char*" } " and " { $snippet "ushort*" } " strings at arbitrary addresses:" -{ $subsection alien>char-string } -{ $subsection alien>u16-string } -{ $subsection memory>string } -{ $subsection string>memory } ; - -ARTICLE: "c-arrays-factor" "Converting C arrays to and from Factor arrays" -"Each primitive C type has a pair of words, " { $snippet ">" { $emphasis "type" } "-array" } " and " { $snippet { $emphasis "type" } "-array>" } ", for converting an array of Factor objects to and from a " { $link byte-array } " of C values. This set of words consists of:" -{ $subsection >c-bool-array } -{ $subsection >c-char-array } -{ $subsection >c-double-array } -{ $subsection >c-float-array } -{ $subsection >c-int-array } -{ $subsection >c-long-array } -{ $subsection >c-longlong-array } -{ $subsection >c-short-array } -{ $subsection >c-uchar-array } -{ $subsection >c-uint-array } -{ $subsection >c-ulong-array } -{ $subsection >c-ulonglong-array } -{ $subsection >c-ushort-array } -{ $subsection >c-void*-array } -{ $subsection c-bool-array> } -{ $subsection c-char*-array> } -{ $subsection c-char-array> } -{ $subsection c-double-array> } -{ $subsection c-float-array> } -{ $subsection c-int-array> } -{ $subsection c-long-array> } -{ $subsection c-longlong-array> } -{ $subsection c-short-array> } -{ $subsection c-uchar-array> } -{ $subsection c-uint-array> } -{ $subsection c-ulong-array> } -{ $subsection c-ulonglong-array> } -{ $subsection c-ushort*-array> } -{ $subsection c-ushort-array> } -{ $subsection c-void*-array> } ; - -ARTICLE: "c-arrays-get/set" "Reading and writing elements in C arrays" -"Each C type has a pair of words, " { $snippet { $emphasis "type" } "-nth" } " and " { $snippet "set-" { $emphasis "type" } "-nth" } ", for reading and writing values of this type stored in an array. This set of words includes but is not limited to:" -{ $subsection char-nth } -{ $subsection set-char-nth } -{ $subsection uchar-nth } -{ $subsection set-uchar-nth } -{ $subsection short-nth } -{ $subsection set-short-nth } -{ $subsection ushort-nth } -{ $subsection set-ushort-nth } -{ $subsection int-nth } -{ $subsection set-int-nth } -{ $subsection uint-nth } -{ $subsection set-uint-nth } -{ $subsection long-nth } -{ $subsection set-long-nth } -{ $subsection ulong-nth } -{ $subsection set-ulong-nth } -{ $subsection longlong-nth } -{ $subsection set-longlong-nth } -{ $subsection ulonglong-nth } -{ $subsection set-ulonglong-nth } -{ $subsection float-nth } -{ $subsection set-float-nth } -{ $subsection double-nth } -{ $subsection set-double-nth } -{ $subsection void*-nth } -{ $subsection set-void*-nth } -{ $subsection char*-nth } -{ $subsection ushort*-nth } ; - -ARTICLE: "c-arrays" "C arrays" -"C arrays are allocated in the same manner as other C data; see " { $link "c-byte-arrays" } " and " { $link "malloc" } "." -$nl -"C type specifiers for array types are documented in " { $link "c-types-specs" } "." -{ $subsection "c-arrays-factor" } -{ $subsection "c-arrays-get/set" } ; - -ARTICLE: "c-out-params" "Output parameters in C" -"A frequently-occurring idiom in C code is the \"out parameter\". If a C function returns more than one value, the caller passes pointers of the correct type, and the C function writes its return values to those locations." -$nl -"Each numerical C type, together with " { $snippet "void*" } ", has an associated " { $emphasis "out parameter constructor" } " word which takes a Factor object as input, constructs a byte array of the correct size, and converts the Factor object to a C value stored into the byte array:" -{ $subsection } -{ $subsection } -{ $subsection } -{ $subsection } -{ $subsection } -{ $subsection } -{ $subsection } -{ $subsection } -{ $subsection } -{ $subsection } -{ $subsection } -{ $subsection } -{ $subsection } -"You call the out parameter constructor with the required initial value, then pass the byte array to the C function, which receives a pointer to the start of the byte array's data area. The C function then returns, leaving the result in the byte array; you read it back using the next set of words:" -{ $subsection *char } -{ $subsection *uchar } -{ $subsection *short } -{ $subsection *ushort } -{ $subsection *int } -{ $subsection *uint } -{ $subsection *long } -{ $subsection *ulong } -{ $subsection *longlong } -{ $subsection *ulonglong } -{ $subsection *float } -{ $subsection *double } -{ $subsection *void* } -{ $subsection *char* } -{ $subsection *ushort* } -"Note that while structure and union types do not get these words defined for them, there is no loss of generality since " { $link } " and " { $link *void* } " may be used." ; - -ARTICLE: "c-data" "Passing data between Factor and C" -"Two defining characteristics of Factor are dynamic typing and automatic memory management, which are somewhat incompatible with the machine-level data model exposed by C. Factor's C library interface defines its own set of C data types, distinct from Factor language types, together with automatic conversion between Factor values and C types. For example, C integer types must be declared and are fixed-width, whereas Factor supports arbitrary-precision integers. Also Factor's garbage collector can move objects in memory, which means that special support has to be provided for passing blocks of memory to C code." -{ $subsection "c-types-specs" } -{ $subsection "c-byte-arrays" } -{ $subsection "malloc" } -{ $subsection "c-strings" } -{ $subsection "c-arrays" } -{ $subsection "c-out-params" } -"C-style enumerated types are supported:" -{ $subsection POSTPONE: C-ENUM: } -"C types can be aliased for convenience and consitency with native library documentation:" -{ $subsection POSTPONE: TYPEDEF: } -"New C types can be defined:" -{ $subsection "c-structs" } -{ $subsection "c-unions" } -{ $subsection "reading-writing-memory" } ; - ARTICLE: "embedding-api" "Factor embedding API" "The Factor embedding API is defined in " { $snippet "vm/master.h" } "." $nl diff --git a/core/alien/arrays/arrays-docs.factor b/core/alien/arrays/arrays-docs.factor new file mode 100755 index 0000000000..f3f27d0739 --- /dev/null +++ b/core/alien/arrays/arrays-docs.factor @@ -0,0 +1,73 @@ +IN: alien.arrays +USING: help.syntax help.markup byte-arrays alien.c-types ; + +ARTICLE: "c-arrays-factor" "Converting C arrays to and from Factor arrays" +"Each primitive C type has a pair of words, " { $snippet ">" { $emphasis "type" } "-array" } " and " { $snippet { $emphasis "type" } "-array>" } ", for converting an array of Factor objects to and from a " { $link byte-array } " of C values. This set of words consists of:" +{ $subsection >c-bool-array } +{ $subsection >c-char-array } +{ $subsection >c-double-array } +{ $subsection >c-float-array } +{ $subsection >c-int-array } +{ $subsection >c-long-array } +{ $subsection >c-longlong-array } +{ $subsection >c-short-array } +{ $subsection >c-uchar-array } +{ $subsection >c-uint-array } +{ $subsection >c-ulong-array } +{ $subsection >c-ulonglong-array } +{ $subsection >c-ushort-array } +{ $subsection >c-void*-array } +{ $subsection c-bool-array> } +{ $subsection c-char*-array> } +{ $subsection c-char-array> } +{ $subsection c-double-array> } +{ $subsection c-float-array> } +{ $subsection c-int-array> } +{ $subsection c-long-array> } +{ $subsection c-longlong-array> } +{ $subsection c-short-array> } +{ $subsection c-uchar-array> } +{ $subsection c-uint-array> } +{ $subsection c-ulong-array> } +{ $subsection c-ulonglong-array> } +{ $subsection c-ushort*-array> } +{ $subsection c-ushort-array> } +{ $subsection c-void*-array> } ; + +ARTICLE: "c-arrays-get/set" "Reading and writing elements in C arrays" +"Each C type has a pair of words, " { $snippet { $emphasis "type" } "-nth" } " and " { $snippet "set-" { $emphasis "type" } "-nth" } ", for reading and writing values of this type stored in an array. This set of words includes but is not limited to:" +{ $subsection char-nth } +{ $subsection set-char-nth } +{ $subsection uchar-nth } +{ $subsection set-uchar-nth } +{ $subsection short-nth } +{ $subsection set-short-nth } +{ $subsection ushort-nth } +{ $subsection set-ushort-nth } +{ $subsection int-nth } +{ $subsection set-int-nth } +{ $subsection uint-nth } +{ $subsection set-uint-nth } +{ $subsection long-nth } +{ $subsection set-long-nth } +{ $subsection ulong-nth } +{ $subsection set-ulong-nth } +{ $subsection longlong-nth } +{ $subsection set-longlong-nth } +{ $subsection ulonglong-nth } +{ $subsection set-ulonglong-nth } +{ $subsection float-nth } +{ $subsection set-float-nth } +{ $subsection double-nth } +{ $subsection set-double-nth } +{ $subsection void*-nth } +{ $subsection set-void*-nth } +{ $subsection char*-nth } +{ $subsection ushort*-nth } ; + +ARTICLE: "c-arrays" "C arrays" +"C arrays are allocated in the same manner as other C data; see " { $link "c-byte-arrays" } " and " { $link "malloc" } "." +$nl +"C type specifiers for array types are documented in " { $link "c-types-specs" } "." +{ $subsection "c-arrays-factor" } +{ $subsection "c-arrays-get/set" } ; diff --git a/core/alien/c-types/c-types-docs.factor b/core/alien/c-types/c-types-docs.factor old mode 100644 new mode 100755 index 55b788d5e3..f6418295f7 --- a/core/alien/c-types/c-types-docs.factor +++ b/core/alien/c-types/c-types-docs.factor @@ -1,8 +1,10 @@ -USING: alien alien.c-types help.syntax help.markup libc -kernel.private byte-arrays math strings ; +IN: alien.c-types +USING: alien help.syntax help.markup libc kernel.private +byte-arrays math strings hashtables alien.syntax +bit-arrays float-arrays debugger ; HELP: -{ $values { "type" "a hashtable" } } +{ $values { "type" hashtable } } { $description "Creates a prototypical C type. User code should use higher-level facilities to define C types; see " { $link "c-data" } "." } ; HELP: no-c-type @@ -14,12 +16,12 @@ HELP: c-types { $var-description "Global variable holding a hashtable mapping C type names to C types. Use the " { $link c-type } " word to look up C types." } ; HELP: c-type -{ $values { "name" string } { "type" "a hashtable" } } +{ $values { "name" string } { "type" hashtable } } { $description "Looks up a C type by name." } { $errors "Throws a " { $link no-c-type } " error if the type does not exist." } ; HELP: heap-size -{ $values { "type" string } { "size" "an integer" } } +{ $values { "type" string } { "size" integer } } { $description "Outputs the number of bytes needed for a heap-allocated value of this C type." } { $examples "On a 32-bit system, you will get the following output:" @@ -28,7 +30,7 @@ HELP: heap-size { $errors "Throws a " { $link no-c-type } " error if the type does not exist." } ; HELP: stack-size -{ $values { "type" string } { "size" "an integer" } } +{ $values { "type" string } { "size" integer } } { $description "Outputs the number of bytes to reserve on the C stack by a value of this C type. In most cases this is equal to " { $link heap-size } ", except on some platforms where C structs are passed by invisible reference, in which case a C struct type only uses as much space as a pointer on the C stack." } { $errors "Throws a " { $link no-c-type } " error if the type does not exist." } ; @@ -78,13 +80,31 @@ HELP: alien>u16-string ( c-ptr -- string ) { $values { "c-ptr" c-ptr } { "string" string } } { $description "Reads a null-terminated UCS-2 string from the specified address." } ; -HELP: memory>string ( base len -- string ) -{ $values { "base" c-ptr } { "len" "a non-negative integer" } { "string" string } } -{ $description "Reads " { $snippet "len" } " bytes starting from " { $snippet "base" } " and stores them in a new Factor string." } ; +HELP: memory>byte-array ( base len -- string ) +{ $values { "base" c-ptr } { "len" "a non-negative integer" } { "byte-array" byte-array } } +{ $description "Reads " { $snippet "len" } " bytes starting from " { $snippet "base" } " and stores them in a new byte array." } ; -HELP: string>memory ( string base -- ) +HELP: memory>char-string ( base len -- string ) +{ $values { "base" c-ptr } { "len" "a non-negative integer" } { "string" string } } +{ $description "Reads " { $snippet "len" } " bytes starting from " { $snippet "base" } " and stores them in a new string." } ; + +HELP: memory>u16-string ( base len -- string ) +{ $values { "base" c-ptr } { "len" "a non-negative integer" } { "string" string } } +{ $description "Reads " { $snippet "len" } " UCS2 characters starting from " { $snippet "base" } " and stores them in a new string." } ; + +HELP: byte-array>memory ( string base -- ) +{ $values { "byte-array" byte-array } { "base" c-ptr } } +{ $description "Writes a byte array to memory starting from the " { $snippet "base" } " address." } +{ $warning "This word is unsafe. Improper use can corrupt memory." } ; + +HELP: string>char-memory ( string base -- ) { $values { "string" string } { "base" c-ptr } } -{ $description "Writes the string to memory starting from the " { $snippet "base" } " address." } +{ $description "Writes a string to memory starting from the " { $snippet "base" } " address." } +{ $warning "This word is unsafe. Improper use can corrupt memory." } ; + +HELP: string>u16-memory ( string base -- ) +{ $values { "string" string } { "base" c-ptr } } +{ $description "Writes a string to memory starting from the " { $snippet "base" } " address." } { $warning "This word is unsafe. Improper use can corrupt memory." } ; HELP: malloc-array @@ -151,3 +171,143 @@ HELP: define-out { $values { "name" "a word name" } { "vocab" "a vocabulary name" } } { $description "Defines a word " { $snippet "<" { $emphasis "name" } ">" } " with stack effect " { $snippet "( value -- array )" } ". This word allocates a byte array large enough to hold a value with C type " { $snippet "name" } ", and writes the value at the top of the stack to the array." } { $notes "This is an internal word called when defining C types, there is no need to call it on your own." } ; + +ARTICLE: "c-out-params" "Output parameters in C" +"A frequently-occurring idiom in C code is the \"out parameter\". If a C function returns more than one value, the caller passes pointers of the correct type, and the C function writes its return values to those locations." +$nl +"Each numerical C type, together with " { $snippet "void*" } ", has an associated " { $emphasis "out parameter constructor" } " word which takes a Factor object as input, constructs a byte array of the correct size, and converts the Factor object to a C value stored into the byte array:" +{ $subsection } +{ $subsection } +{ $subsection } +{ $subsection } +{ $subsection } +{ $subsection } +{ $subsection } +{ $subsection } +{ $subsection } +{ $subsection } +{ $subsection } +{ $subsection } +{ $subsection } +"You call the out parameter constructor with the required initial value, then pass the byte array to the C function, which receives a pointer to the start of the byte array's data area. The C function then returns, leaving the result in the byte array; you read it back using the next set of words:" +{ $subsection *char } +{ $subsection *uchar } +{ $subsection *short } +{ $subsection *ushort } +{ $subsection *int } +{ $subsection *uint } +{ $subsection *long } +{ $subsection *ulong } +{ $subsection *longlong } +{ $subsection *ulonglong } +{ $subsection *float } +{ $subsection *double } +{ $subsection *void* } +{ $subsection *char* } +{ $subsection *ushort* } +"Note that while structure and union types do not get these words defined for them, there is no loss of generality since " { $link } " and " { $link *void* } " may be used." ; + +ARTICLE: "c-types-specs" "C type specifiers" +"C types are identified by strings, and type names occur as parameters to the " { $link alien-invoke } ", " { $link alien-indirect } " and " { $link alien-callback } " words, as well as " { $link POSTPONE: C-STRUCT: } ", " { $link POSTPONE: C-UNION: } " and " { $link POSTPONE: TYPEDEF: } "." +$nl +"The following numerical types are available; a " { $snippet "u" } " prefix denotes an unsigned type:" +{ $table + { "C type" "Notes" } + { { $snippet "char" } "always 1 byte" } + { { $snippet "uchar" } { } } + { { $snippet "short" } "always 2 bytes" } + { { $snippet "ushort" } { } } + { { $snippet "int" } "always 4 bytes" } + { { $snippet "uint" } { } } + { { $snippet "long" } { "same size as CPU word size and " { $snippet "void*" } ", except on 64-bit Windows, where it is 4 bytes" } } + { { $snippet "ulong" } { } } + { { $snippet "longlong" } "always 8 bytes" } + { { $snippet "ulonglong" } { } } + { { $snippet "float" } { } } + { { $snippet "double" } { "same format as " { $link float } " objects" } } +} +"When making alien calls, Factor numbers are converted to and from the above types in a canonical way. Converting a Factor number to a C value may result in a loss of precision." +$nl +"Pointer types are specified by suffixing a C type with " { $snippet "*" } ", for example " { $snippet "float*" } ". One special case is " { $snippet "void*" } ", which denotes a generic pointer; " { $snippet "void" } " by itself is not a valid C type specifier. With the exception of strings (see " { $link "c-strings" } "), all pointer types are identical to " { $snippet "void*" } " as far as the C library interface is concerned." +$nl +"Fixed-size array types are supported; the syntax consists of a C type name followed by dimension sizes in brackets; the following denotes a 3 by 4 array of integers:" +{ $code "int[3][4]" } +"Fixed-size arrays differ from pointers in that they are allocated inside structures and unions; however when used as function parameters they behave exactly like pointers and thus the dimensions only serve as documentation." +$nl +"Structure and union types are specified by the name of the structure or union." ; + +ARTICLE: "c-byte-arrays" "Passing data in byte arrays" +"Instances of the " { $link byte-array } ", " { $link bit-array } " and " { $link float-array } " class can be passed to C functions; the C function receives a pointer to the first element of the array." +$nl +"Byte arrays can be allocated directly with a byte count using the " { $link } " word. However in most cases, instead of computing a size in bytes directly, it is easier to use a higher-level word which expects C type and outputs a byte array large enough to hold that type:" +{ $subsection } +{ $subsection } +{ $warning +"The Factor garbage collector can move byte arrays around, and it is only safe to pass byte arrays to C functions if the function does not store a pointer to the byte array in some global structure, or retain it in any way after returning." +$nl +"Long-lived data for use by C libraries can be allocated manually, just as when programming in C. See " { $link "malloc" } "." } +{ $see-also "c-arrays" } ; + +ARTICLE: "malloc" "Manual memory management" +"Sometimes data passed to C functions must be allocated at a fixed address, and so garbage collector managed byte arrays cannot be used. See the warning at the bottom of " { $link "c-byte-arrays" } " for a description of when this is the case." +$nl +"Allocating a C datum with a fixed address:" +{ $subsection malloc-object } +{ $subsection malloc-array } +{ $subsection malloc-byte-array } +"There is a set of words in the " { $vocab-link "libc" } " vocabulary which directly call C standard library memory management functions:" +{ $subsection malloc } +{ $subsection calloc } +{ $subsection realloc } +"The return value of the above three words must always be checked for a memory allocation failure:" +{ $subsection check-ptr } +"You must always free pointers returned by any of the above words when the block of memory is no longer in use:" +{ $subsection free } +"You can unsafely copy a range of bytes from one memory location to another:" +{ $subsection memcpy } +"You can copy a range of bytes from memory into a byte array:" +{ $subsection memory>byte-array } +"You can copy a byte array to memory unsafely:" +{ $subsection byte-array>memory } +"A wrapper for temporarily allocating a block of memory:" +{ $subsection with-malloc } ; + +ARTICLE: "c-strings" "C strings" +"The C library interface defines two types of C strings:" +{ $table + { "C type" "Notes" } + { { $snippet "char*" } "8-bit per character null-terminated ASCII" } + { { $snippet "ushort*" } "16-bit per character null-terminated UCS-2" } +} +"Passing a Factor string to a C function expecting a C string allocates a " { $link byte-array } " in the Factor heap; the string is then converted to the requested format and a raw pointer is passed to the function. If the conversion fails, for example if the string contains null bytes or characters with values higher than 255, a " { $link c-string-error. } " is thrown." +"Sometimes a C function has a parameter type of " { $snippet "void*" } ", and various data types, among them strings, can be passed in. In this case, strings are not automatically converted to aliens, and instead you must call one of these words:" +{ $subsection string>char-alien } +{ $subsection string>u16-alien } +{ $subsection malloc-char-string } +{ $subsection malloc-u16-string } +"The first two allocate " { $link byte-array } "s, and the latter allocates manually-managed memory which is not moved by the garbage collector and has to be explicitly freed by calling " { $link free } "." +$nl +"Finally, a set of words can be used to read and write " { $snippet "char*" } " and " { $snippet "ushort*" } " strings at arbitrary addresses:" +{ $subsection alien>char-string } +{ $subsection alien>u16-string } +{ $subsection memory>char-string } +{ $subsection memory>u16-string } +{ $subsection string>char-memory } +{ $subsection string>u16-memory } ; + +ARTICLE: "c-data" "Passing data between Factor and C" +"Two defining characteristics of Factor are dynamic typing and automatic memory management, which are somewhat incompatible with the machine-level data model exposed by C. Factor's C library interface defines its own set of C data types, distinct from Factor language types, together with automatic conversion between Factor values and C types. For example, C integer types must be declared and are fixed-width, whereas Factor supports arbitrary-precision integers. Also Factor's garbage collector can move objects in memory, which means that special support has to be provided for passing blocks of memory to C code." +{ $subsection "c-types-specs" } +{ $subsection "c-byte-arrays" } +{ $subsection "malloc" } +{ $subsection "c-strings" } +{ $subsection "c-arrays" } +{ $subsection "c-out-params" } +"C-style enumerated types are supported:" +{ $subsection POSTPONE: C-ENUM: } +"C types can be aliased for convenience and consitency with native library documentation:" +{ $subsection POSTPONE: TYPEDEF: } +"New C types can be defined:" +{ $subsection "c-structs" } +{ $subsection "c-unions" } +{ $subsection "reading-writing-memory" } ; diff --git a/core/alien/c-types/c-types.factor b/core/alien/c-types/c-types.factor index 6d9c2cec14..1ecfa37ee6 100755 --- a/core/alien/c-types/c-types.factor +++ b/core/alien/c-types/c-types.factor @@ -138,6 +138,28 @@ M: c-type stack-size c-type-size ; : malloc-u16-string ( string -- alien ) string>u16-alien malloc-byte-array ; +: memory>byte-array ( alien len -- byte-array ) + dup [ -rot memcpy ] keep ; + +: memory>char-string ( alien len -- string ) + memory>byte-array >string ; + +DEFER: c-ushort-array> + +: memory>u16-string ( alien len -- string ) + [ memory>byte-array ] keep 2/ c-ushort-array> >string ; + +: byte-array>memory ( byte-array base -- ) + swap dup length memcpy ; + +: string>char-memory ( string base -- ) + >r >byte-array r> byte-array>memory ; + +DEFER: >c-ushort-array + +: string>u16-memory ( string base -- ) + >r >c-ushort-array r> byte-array>memory ; + : (define-nth) ( word type quot -- ) >r heap-size [ rot * ] swap add* r> append define-inline ; diff --git a/core/alien/structs/structs-docs.factor b/core/alien/structs/structs-docs.factor old mode 100644 new mode 100755 index 704a260825..fe19f29766 --- a/core/alien/structs/structs-docs.factor +++ b/core/alien/structs/structs-docs.factor @@ -1,6 +1,37 @@ -USING: alien.structs alien.c-types strings help.markup -sequences io arrays ; +IN: alien.structs +USING: alien.c-types strings help.markup help.syntax +alien.syntax sequences io arrays ; M: string slot-specs c-type struct-type-fields ; M: array ($instance) first ($instance) " array" write ; + +ARTICLE: "c-structs" "C structure types" +"A " { $snippet "struct" } " in C is essentially a block of memory with the value of each structure field stored at a fixed offset from the start of the block. The C library interface provides some utilities to define words which read and write structure fields given a base address." +{ $subsection POSTPONE: C-STRUCT: } +"Great care must be taken when working with C structures since no type or bounds checking is possible." +$nl +"An example:" +{ $code + "C-STRUCT: XVisualInfo" + " { \"Visual*\" \"visual\" }" + " { \"VisualID\" \"visualid\" }" + " { \"int\" \"screen\" }" + " { \"uint\" \"depth\" }" + " { \"int\" \"class\" }" + " { \"ulong\" \"red_mask\" }" + " { \"ulong\" \"green_mask\" }" + " { \"ulong\" \"blue_mask\" }" + " { \"int\" \"colormap_size\" }" + " { \"int\" \"bits_per_rgb\" } ;" +} +"C structure objects can be allocated by calling " { $link } " or " { $link malloc-object } "." +$nl +"Arrays of C structures can be created by calling " { $link } " or " { $link malloc-array } ". Elements can be read and written using words named " { $snippet { $emphasis "type" } "-nth" } " and " { $snippet "set-" { $emphasis "type" } "-nth" } "; these words are automatically generated by " { $link POSTPONE: C-STRUCT: } "." ; + +ARTICLE: "c-unions" "C unions" +"A " { $snippet "union" } " in C defines a type large enough to hold its largest member. This is usually used to allocate a block of memory which can hold one of several types of values." +{ $subsection POSTPONE: C-UNION: } +"C structure objects can be allocated by calling " { $link } " or " { $link malloc-object } "." +$nl +"Arrays of C unions can be created by calling " { $link } " or " { $link malloc-array } ". Elements can be read and written using words named " { $snippet { $emphasis "type" } "-nth" } " and " { $snippet "set-" { $emphasis "type" } "-nth" } "; these words are automatically generated by " { $link POSTPONE: C-UNION: } "." ; diff --git a/core/assocs/assocs-docs.factor b/core/assocs/assocs-docs.factor old mode 100644 new mode 100755 index 1805ee05b5..2eabe9b0bc --- a/core/assocs/assocs-docs.factor +++ b/core/assocs/assocs-docs.factor @@ -64,6 +64,7 @@ ARTICLE: "assocs-sets" "Set-theoretic operations on assocs" ARTICLE: "assocs-mutation" "Storing keys and values in assocs" "Utility operations built up from the " { $link "assocs-protocol" } ":" { $subsection delete-at* } +{ $subsection delete-any } { $subsection rename-at } { $subsection change-at } { $subsection at+ } @@ -220,6 +221,12 @@ HELP: delete-at* { $description "Removes an entry from the assoc and outputs the previous value together with a boolean indicating whether it was present." } { $side-effects "assoc" } ; +HELP: delete-any +{ $values { "assoc" assoc } { "key" "a key" } { "value" "a value" } } +{ $description "Removes an undetermined entry from the assoc and outputs it." } +{ $errors "Throws an error if the assoc is empty." } +{ $notes "This word is useful when using an assoc as an unordered queue which requires constant-time membership tests. Entries are enqueued with " { $link set-at } " and dequeued with " { $link delete-any } "." } ; + HELP: rename-at { $values { "newkey" object } { "key" object } { "assoc" assoc } } { $description "Removes the values associated to " { $snippet "key" } " and re-adds it as " { $snippet "newkey" } ". Does nothing if the assoc does not contain " { $snippet "key" } "." } diff --git a/core/assocs/assocs.factor b/core/assocs/assocs.factor index 1983608624..d8cf01e1bd 100755 --- a/core/assocs/assocs.factor +++ b/core/assocs/assocs.factor @@ -77,8 +77,11 @@ M: assoc assoc-clone-like ( assoc exemplar -- newassoc ) : rename-at ( newkey key assoc -- ) tuck delete-at* [ -rot set-at ] [ 3drop ] if ; -: delete-any ( assoc -- element ) - [ [ 2drop t ] assoc-find 2drop dup ] keep delete-at ; +: delete-any ( assoc -- key value ) + [ + [ 2drop t ] assoc-find + [ "Assoc is empty" throw ] unless over + ] keep delete-at ; : assoc-empty? ( assoc -- ? ) assoc-size zero? ; diff --git a/core/bootstrap/primitives.factor b/core/bootstrap/primitives.factor index 3e93a868ca..a88729f539 100755 --- a/core/bootstrap/primitives.factor +++ b/core/bootstrap/primitives.factor @@ -5,22 +5,32 @@ USING: alien arrays byte-arrays generic hashtables hashtables.private io kernel math namespaces parser sequences strings vectors words quotations assocs layouts classes tuples kernel.private vocabs vocabs.loader source-files definitions -slots classes.union compiler.units ; +slots classes.union compiler.units bootstrap.image.private +io.files ; "Creating primitives and basic runtime structures..." print flush -load-help? off crossref off -! Bring up a bare cross-compiling vocabulary. -"syntax" vocab vocab-words bootstrap-syntax set - "resource:core/bootstrap/syntax.factor" parse-file +"resource:core/cpu/" architecture get { + { "x86.32" "x86/32" } + { "x86.64" "x86/64" } + { "linux-ppc" "ppc/linux" } + { "macosx-ppc" "ppc/macosx" } + { "arm" "arm" } + } at "/bootstrap.factor" 3append parse-file + +! Now we have ( syntax-quot arch-quot ) on the stack + +! Bring up a bare cross-compiling vocabulary. +"syntax" vocab vocab-words bootstrap-syntax set H{ } clone dictionary set H{ } clone changed-words set [ drop ] recompile-hook set +call call ! Create some empty vocabs where the below primitives and @@ -558,8 +568,6 @@ builtins get num-tags get tail f union-class define-class { "alien>u16-string" "alien" } { "string>u16-alien" "alien" } { "(throw)" "kernel.private" } - { "string>memory" "alien" } - { "memory>string" "alien" } { "alien-address" "alien" } { "slot" "slots.private" } { "set-slot" "slots.private" } diff --git a/core/hashtables/hashtables-docs.factor b/core/hashtables/hashtables-docs.factor old mode 100644 new mode 100755 index 3719c2f9e0..7b6c2d1dc9 --- a/core/hashtables/hashtables-docs.factor +++ b/core/hashtables/hashtables-docs.factor @@ -35,8 +35,10 @@ $nl "Utility words to create a new hashtable from a single key/value pair:" { $subsection associate } { $subsection ?set-at } -"Removing duplicate elements from a sequence in linear time, using a hashtable:" +"The final two words pertain to sequences but use a hashtable internally. Removing duplicate elements from a sequence in linear time, using a hashtable:" { $subsection prune } +"Test if a sequence contains duplicates in linear time:" +{ $subsection all-unique? } { $subsection "hashtables.private" } ; ABOUT: "hashtables" @@ -133,6 +135,15 @@ HELP: prune { $example "USE: hashtables" "{ 1 1 t 3 t } prune ." "V{ 1 t 3 }" } } ; +HELP: all-unique? +{ $values { "seq" sequence } { "?" "a boolean" } } +{ $description "Tests whether a sequence contains any repeated elements." } +{ $example + "USE: combinators.lib" + "{ 0 1 1 2 3 5 } all-unique? ." + "f" +} ; + HELP: rehash { $values { "hash" hashtable } } { $description "Rebuild the hashtable. This word should be called if the hashcodes of the hashtable's keys have changed, or if the hashing algorithms themselves have changed, neither of which should occur during normal operation." } ; diff --git a/core/hashtables/hashtables-tests.factor b/core/hashtables/hashtables-tests.factor index 7dc252fd3e..40d079402c 100755 --- a/core/hashtables/hashtables-tests.factor +++ b/core/hashtables/hashtables-tests.factor @@ -160,3 +160,6 @@ H{ } "x" set H{ { 1 "one" } { 2 "two" } } { 1 2 3 } clone [ substitute ] keep ] unit-test + +[ f ] [ { 0 1 1 2 3 5 } all-unique? ] unit-test +[ t ] [ { 0 1 2 3 4 5 } all-unique? ] unit-test diff --git a/core/hashtables/hashtables.factor b/core/hashtables/hashtables.factor old mode 100644 new mode 100755 index 004cc9fa90..e477aa59ed --- a/core/hashtables/hashtables.factor +++ b/core/hashtables/hashtables.factor @@ -195,4 +195,7 @@ M: hashtable assoc-like dup length over length rot [ >r 2dup r> (prune) ] each nip ; +: all-unique? ( seq -- ? ) + dup prune [ length ] 2apply = ; + INSTANCE: hashtable assoc diff --git a/extra/io/buffers/buffers-tests.factor b/extra/io/buffers/buffers-tests.factor old mode 100644 new mode 100755 index b19918292e..6fcdc86423 --- a/extra/io/buffers/buffers-tests.factor +++ b/extra/io/buffers/buffers-tests.factor @@ -1,9 +1,9 @@ IN: temporary -USING: alien io.buffers kernel kernel.private libc +USING: alien alien.c-types io.buffers kernel kernel.private libc sequences tools.test namespaces ; : buffer-set ( string buffer -- ) - 2dup buffer-ptr string>memory + 2dup buffer-ptr string>char-memory >r length r> buffer-reset ; : string>buffer ( string -- buffer ) diff --git a/extra/io/buffers/buffers.factor b/extra/io/buffers/buffers.factor old mode 100644 new mode 100755 index 5d6eaebe6f..54198a7dcc --- a/extra/io/buffers/buffers.factor +++ b/extra/io/buffers/buffers.factor @@ -1,9 +1,9 @@ ! Copyright (C) 2004, 2005 Mackenzie Straight. -! Copyright (C) 2006, 2007 Slava Pestov. +! Copyright (C) 2006, 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. IN: io.buffers -USING: alien alien.syntax kernel kernel.private libc math -sequences strings hints ; +USING: alien alien.c-types alien.syntax kernel kernel.private +libc math sequences strings hints ; TUPLE: buffer size ptr fill pos ; @@ -39,14 +39,14 @@ TUPLE: buffer size ptr fill pos ; : (buffer>) ( n buffer -- string ) [ dup buffer-fill swap buffer-pos - min ] keep - buffer@ swap memory>string ; + buffer@ swap memory>char-string ; : buffer> ( n buffer -- string ) [ (buffer>) ] 2keep buffer-consume ; : (buffer>>) ( buffer -- string ) dup buffer-pos over buffer-ptr - over buffer-fill rot buffer-pos - memory>string ; + over buffer-fill rot buffer-pos - memory>char-string ; : buffer>> ( buffer -- string ) dup (buffer>>) 0 rot buffer-reset ; @@ -87,7 +87,7 @@ HINTS: search-buffer-until { fixnum fixnum simple-alien string } ; : >buffer ( string buffer -- ) over length over check-overflow - [ buffer-end string>memory ] 2keep + [ buffer-end string>char-memory ] 2keep [ buffer-fill swap length + ] keep set-buffer-fill ; : ch>buffer ( ch buffer -- ) diff --git a/extra/io/monitor/monitor.factor b/extra/io/monitor/monitor.factor index c74a449181..23b336c929 100755 --- a/extra/io/monitor/monitor.factor +++ b/extra/io/monitor/monitor.factor @@ -1,11 +1,19 @@ ! Copyright (C) 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: io.backend ; +USING: io.backend kernel continuations ; IN: io.monitor -HOOK: io-backend ( path -- monitor ) +HOOK: io-backend ( path recursive? -- monitor ) -HOOK: next-change io-backend ( monitor -- path ) +HOOK: close-monitor io-backend ( monitor -- ) -: with-monitor ( directory quot -- ) +HOOK: next-change io-backend ( monitor -- path changes ) + +SYMBOL: +change-file+ +SYMBOL: +change-name+ +SYMBOL: +change-size+ +SYMBOL: +change-attributes+ +SYMBOL: +change-modified+ + +: with-monitor ( path recursive? quot -- ) >r r> over [ close-monitor ] curry [ ] cleanup ; diff --git a/extra/io/sockets/headers/bsd/bsd.factor b/extra/io/sockets/headers/bsd/bsd.factor old mode 100644 new mode 100755 index c67cc95b7d..06634c28c8 --- a/extra/io/sockets/headers/bsd/bsd.factor +++ b/extra/io/sockets/headers/bsd/bsd.factor @@ -13,7 +13,7 @@ C-STRUCT: bpfh : bpfh. ( bpfh -- ) [ bpfh-timestamp "Timestamp: " write - "timeval" heap-size memory>string >byte-array . + "timeval" heap-size memory>byte-array . ] keep [ bpfh-caplen "caplen: " write . ] keep [ bpfh-datalen "datalen: " write . ] keep diff --git a/extra/io/sockets/headers/headers.factor b/extra/io/sockets/headers/headers.factor old mode 100644 new mode 100755 index 3a46f295d5..c697b60973 --- a/extra/io/sockets/headers/headers.factor +++ b/extra/io/sockets/headers/headers.factor @@ -9,6 +9,10 @@ C-STRUCT: etherneth { { "char" 6 } "smac" } { "ushort" "type" } ; +: >mac-address ( byte-array -- string ) + 6 memory>byte-array + [ >hex 2 48 pad-left ] { } map-as ":" join ; + : etherneth. ( etherneth -- ) [ etherneth-dmac "Dest MAC: " write >mac-address . ] keep [ etherneth-smac "Source MAC: " write >mac-address . ] keep diff --git a/extra/io/sockets/impl/impl.factor b/extra/io/sockets/impl/impl.factor index ce4d5ad566..d7ac18ee20 100755 --- a/extra/io/sockets/impl/impl.factor +++ b/extra/io/sockets/impl/impl.factor @@ -32,7 +32,7 @@ GENERIC: inet-pton ( str addrspec -- data ) M: inet4 inet-ntop ( data addrspec -- str ) - drop 4 memory>string [ number>string ] { } map-as "." join ; + drop 4 memory>byte-array [ number>string ] { } map-as "." join ; M: inet4 inet-pton ( str addrspec -- data ) drop "." split [ string>number ] B{ } map-as ; @@ -60,7 +60,7 @@ M: inet4 parse-sockaddr swap sockaddr-in-port ntohs (port) ; M: inet6 inet-ntop ( data addrspec -- str ) - drop 16 memory>string 2 [ be> >hex ] map ":" join ; + drop 16 memory>byte-array 2 [ be> >hex ] map ":" join ; M: inet6 inet-pton ( str addrspec -- data ) drop "::" split1 @@ -132,8 +132,3 @@ M: object host-name ( -- name ) 256 dup dup length gethostname zero? [ "gethostname failed" throw ] unless alien>char-string ; - -: >mac-address ( byte-array -- string ) - 6 memory>string >byte-array - [ >hex 2 48 pad-left ] { } map-as ":" join ; - diff --git a/extra/io/windows/ce/sockets/sockets.factor b/extra/io/windows/ce/sockets/sockets.factor index cc19976bc5..5f87088804 100755 --- a/extra/io/windows/ce/sockets/sockets.factor +++ b/extra/io/windows/ce/sockets/sockets.factor @@ -78,7 +78,7 @@ M: windows-ce-io ( addrspec -- datagram ) packet-size receive-buffer make-WSABUF ; : packet-data ( len -- byte-array ) - receive-buffer swap memory>string >byte-array ; + receive-buffer swap memory>byte-array ; packet-size receive-buffer set-global diff --git a/extra/io/windows/nt/monitor/monitor.factor b/extra/io/windows/nt/monitor/monitor.factor index 2b3b87b2bd..746b02a3cb 100755 --- a/extra/io/windows/nt/monitor/monitor.factor +++ b/extra/io/windows/nt/monitor/monitor.factor @@ -2,10 +2,10 @@ ! See http://factorcode.org/license.txt for BSD license. USING: alien.c-types destructors io.windows kernel math windows windows.kernel32 windows.types libc assocs alien namespaces -continuations io.monitor ; +continuations io.monitor sequences hashtables sorting arrays ; IN: io.windows.nt.monitor -TUPLE: monitor handle buffer queue closed? ; +TUPLE: monitor handle recursive? buffer queue closed? ; : open-directory ( path -- handle ) [ @@ -20,9 +20,9 @@ TUPLE: monitor handle buffer queue closed? ; : buffer-size 65536 ; inline -M: windows-nt-io ( path -- monitor ) +M: windows-nt-io ( path recursive? -- monitor ) [ - open-directory + >r open-directory r> buffer-size malloc dup free-later f ] with-destructors f monitor construct-boa ; @@ -30,7 +30,7 @@ M: windows-nt-io ( path -- monitor ) : check-closed ( monitor -- ) monitor-closed? [ "Monitor closed" throw ] when ; -: close-monitor ( monitor -- ) +M: windows-nt-io close-monitor ( monitor -- ) dup check-closed dup monitor-buffer free dup monitor-handle CloseHandle drop @@ -39,9 +39,9 @@ M: windows-nt-io ( path -- monitor ) : fill-buffer ( monitor -- bytes ) [ dup monitor-handle - swap monitor-buffer + over monitor-buffer buffer-size - TRUE + roll monitor-recursive? 1 0 ? FILE_NOTIFY_CHANGE_ALL 0 [ f @@ -50,25 +50,52 @@ M: windows-nt-io ( path -- monitor ) ] keep *uint ] with-destructors ; -: (changed-files) ( buffer -- ) - dup { - FILE_NOTIFY_INFORMATION-NextEntryOffset +: parse-action-flag ( action mask symbol -- action ) + >r over bitand 0 > [ r> , ] [ r> drop ] if ; + +: parse-action ( action -- changes ) + [ + FILE_NOTIFY_CHANGE_FILE +change-file+ parse-action-flag + FILE_NOTIFY_CHANGE_DIR_NAME +change-name+ parse-action-flag + FILE_NOTIFY_CHANGE_ATTRIBUTES +change-attributes+ parse-action-flag + FILE_NOTIFY_CHANGE_SIZE +change-size+ parse-action-flag + FILE_NOTIFY_CHANGE_LAST_WRITE +change-modified+ parse-action-flag + FILE_NOTIFY_CHANGE_LAST_ACCESS +change-attributes+ parse-action-flag + FILE_NOTIFY_CHANGE_EA +change-attributes+ parse-action-flag + FILE_NOTIFY_CHANGE_CREATION +change-attributes+ parse-action-flag + FILE_NOTIFY_CHANGE_SECURITY +change-attributes+ parse-action-flag + FILE_NOTIFY_CHANGE_FILE_NAME +change-name+ parse-action-flag + drop + ] { } make ; + +: changed-file ( buffer -- changes path ) + { FILE_NOTIFY_INFORMATION-FileName FILE_NOTIFY_INFORMATION-FileNameLength - } get-slots memory>string dup set + FILE_NOTIFY_INFORMATION-Action + } get-slots parse-action -rot memory>u16-string ; + +: (changed-files) ( buffer -- ) + dup changed-file namespace [ append ] change-at + dup FILE_NOTIFY_INFORMATION-NextEntryOffset dup zero? [ 2drop ] [ swap (changed-files) ] if ; : changed-files ( buffer len -- assoc ) - [ zero? [ drop ] [ (changed-files) ] if ] H{ } make-assoc ; + [ + zero? [ drop ] [ (changed-files) ] if + ] H{ } make-assoc ; : fill-queue ( monitor -- ) dup monitor-buffer over fill-buffer changed-files swap set-monitor-queue ; -M: windows-nt-io next-change ( monitor -- path ) +M: windows-nt-io next-change ( monitor -- path changes ) dup check-closed - dup monitor-queue dup assoc-empty? - [ drop dup fill-queue next-change ] [ nip delete-any ] if ; + dup monitor-queue dup assoc-empty? [ + drop dup fill-queue next-change + ] [ + nip delete-any prune natural-sort >array + ] if ; diff --git a/extra/io/windows/nt/nt.factor b/extra/io/windows/nt/nt.factor index 000d1362b6..5bdefd7713 100755 --- a/extra/io/windows/nt/nt.factor +++ b/extra/io/windows/nt/nt.factor @@ -1,12 +1,13 @@ -! Copyright (C) 2004, 2007 Mackenzie Straight, Doug Coleman. +! Copyright (C) 2004, 2008 Mackenzie Straight, Doug Coleman, +! Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USE: io.windows USE: io.windows.nt.backend USE: io.windows.nt.files -USE: io.windows.nt.sockets USE: io.windows.nt.launcher +USE: io.windows.nt.monitor +USE: io.windows.nt.sockets USE: io.windows.mmap USE: io.backend -USE: namespaces T{ windows-nt-io } set-io-backend diff --git a/extra/io/windows/nt/sockets/sockets.factor b/extra/io/windows/nt/sockets/sockets.factor index a6c44a0b86..ae15e404d9 100755 --- a/extra/io/windows/nt/sockets/sockets.factor +++ b/extra/io/windows/nt/sockets/sockets.factor @@ -202,7 +202,7 @@ TUPLE: WSARecvFrom-args port : parse-WSARecvFrom ( n WSARecvFrom -- packet addrspec ) [ WSARecvFrom-args-lpBuffers* WSABUF-buf - swap memory>string >byte-array + swap memory>byte-array ] keep [ WSARecvFrom-args-lpFrom* ] keep WSARecvFrom-args-port datagram-port-addr parse-sockaddr ; diff --git a/extra/opengl/opengl.factor b/extra/opengl/opengl.factor old mode 100644 new mode 100755 index 80c9b80ea7..0949386bd1 --- a/extra/opengl/opengl.factor +++ b/extra/opengl/opengl.factor @@ -191,7 +191,7 @@ TUPLE: sprite loc dim dim2 dlist texture ; : c-true? ( int -- ? ) zero? not ; inline : with-gl-shader-source-ptr ( string quot -- ) - swap dup length 1+ [ tuck string>memory swap call ] with-malloc ; inline + swap dup length 1+ [ tuck string>char-memory swap call ] with-malloc ; inline : ( source kind -- shader ) glCreateShader dup rot [ 1 swap f glShaderSource ] with-gl-shader-source-ptr diff --git a/vm/primitives.c b/vm/primitives.c index dd96ee1495..7151d139bf 100755 --- a/vm/primitives.c +++ b/vm/primitives.c @@ -150,8 +150,6 @@ void *primitives[] = { primitive_alien_to_u16_string, primitive_string_to_u16_alien, primitive_throw, - primitive_char_string_to_memory, - primitive_memory_to_char_string, primitive_alien_address, primitive_slot, primitive_set_slot, diff --git a/vm/types.c b/vm/types.c index d70c1623f4..51dd4c3da4 100755 --- a/vm/types.c +++ b/vm/types.c @@ -363,12 +363,6 @@ DEFINE_PRIMITIVE(resize_string) } \ return s; \ } \ - DEFINE_PRIMITIVE(memory_to_##type##_string) \ - { \ - CELL length = to_cell(dpop()); \ - const type *string = unbox_alien(); \ - dpush(tag_object(memory_to_##type##_string(string,length))); \ - } \ F_STRING *from_##type##_string(const type *str) \ { \ CELL length = 0; \ diff --git a/vm/types.h b/vm/types.h index c896b69eba..356b944133 100755 --- a/vm/types.h +++ b/vm/types.h @@ -154,26 +154,22 @@ F_STRING *reallot_string(F_STRING *string, CELL capacity, u16 fill); DECLARE_PRIMITIVE(resize_string); F_STRING *memory_to_char_string(const char *string, CELL length); -DECLARE_PRIMITIVE(memory_to_char_string); F_STRING *from_char_string(const char *c_string); DLLEXPORT void box_char_string(const char *c_string); DECLARE_PRIMITIVE(alien_to_char_string); F_STRING *memory_to_u16_string(const u16 *string, CELL length); -DECLARE_PRIMITIVE(memory_to_u16_string); F_STRING *from_u16_string(const u16 *c_string); DLLEXPORT void box_u16_string(const u16 *c_string); DECLARE_PRIMITIVE(alien_to_u16_string); void char_string_to_memory(F_STRING *s, char *string); -DECLARE_PRIMITIVE(char_string_to_memory); F_BYTE_ARRAY *string_to_char_alien(F_STRING *s, bool check); char* to_char_string(F_STRING *s, bool check); DLLEXPORT char *unbox_char_string(void); DECLARE_PRIMITIVE(string_to_char_alien); void u16_string_to_memory(F_STRING *s, u16 *string); -DECLARE_PRIMITIVE(u16_string_to_memory); F_BYTE_ARRAY *string_to_u16_alien(F_STRING *s, bool check); u16* to_u16_string(F_STRING *s, bool check); DLLEXPORT u16 *unbox_u16_string(void); From 6458d6e94623ec9ffbf9c8658bb50941e4786b4b Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sat, 26 Jan 2008 23:40:01 -0400 Subject: [PATCH 101/216] Remove word moved to core --- extra/combinators/lib/lib-docs.factor | 9 --------- extra/combinators/lib/lib-tests.factor | 2 -- extra/combinators/lib/lib.factor | 2 -- 3 files changed, 13 deletions(-) mode change 100644 => 100755 extra/combinators/lib/lib-docs.factor mode change 100644 => 100755 extra/combinators/lib/lib-tests.factor diff --git a/extra/combinators/lib/lib-docs.factor b/extra/combinators/lib/lib-docs.factor old mode 100644 new mode 100755 index ac05160b31..02c3556742 --- a/extra/combinators/lib/lib-docs.factor +++ b/extra/combinators/lib/lib-docs.factor @@ -83,15 +83,6 @@ HELP: count "50" } ; -HELP: all-unique? -{ $values { "seq" sequence } { "?" "a boolean" } } -{ $description "Tests whether a sequence contains any repeated elements." } -{ $example - "USE: combinators.lib" - "{ 0 1 1 2 3 5 } all-unique? ." - "f" -} ; - HELP: && { $values { "quots" "a sequence of quotations with stack effect " { $snippet "( ... -- ... ? )" } } { "?" "a boolean" } } { $description "Calls each quotation in turn; outputs " { $link f } " if one of the quotations output " { $link f } ", otherwise outputs " { $link t } ". As soon as a quotation outputs " { $link f } ", evaluation stops and subsequent quotations are not called." } ; diff --git a/extra/combinators/lib/lib-tests.factor b/extra/combinators/lib/lib-tests.factor old mode 100644 new mode 100755 index 0d76e6f50d..deeb105758 --- a/extra/combinators/lib/lib-tests.factor +++ b/extra/combinators/lib/lib-tests.factor @@ -7,8 +7,6 @@ IN: temporary [ 50 ] [ 100 [1,b] [ even? ] count ] unit-test [ 50 ] [ 100 [1,b] [ odd? ] count ] unit-test [ 328350 ] [ 100 [ sq ] sigma ] unit-test -[ f ] [ { 0 1 1 2 3 5 } all-unique? ] unit-test -[ t ] [ { 0 1 2 3 4 5 } all-unique? ] unit-test : infers? [ infer drop ] curry catch not ; diff --git a/extra/combinators/lib/lib.factor b/extra/combinators/lib/lib.factor index aae4c5d9ab..cbe25fccf6 100755 --- a/extra/combinators/lib/lib.factor +++ b/extra/combinators/lib/lib.factor @@ -98,8 +98,6 @@ MACRO: nfirst ( n -- ) : count ( seq quot -- n ) [ 1 0 ? ] compose sigma ; inline -: all-unique? ( seq -- ? ) [ prune ] keep [ length ] 2apply = ; - ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! short circuiting words ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! From bca0dce0a5a8baa905534c128c9cd10051a24667 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sat, 26 Jan 2008 23:43:38 -0400 Subject: [PATCH 102/216] Add a compile time check to set-slots transform --- core/inference/inference-docs.factor | 6 +++--- core/inference/known-words/known-words.factor | 4 ---- core/inference/transforms/transforms-docs.factor | 9 +++++++-- .../inference/transforms/transforms-tests.factor | 14 +++++++++++++- core/inference/transforms/transforms.factor | 16 ++++++++++++++-- 5 files changed, 37 insertions(+), 12 deletions(-) mode change 100644 => 100755 core/inference/transforms/transforms-docs.factor mode change 100644 => 100755 core/inference/transforms/transforms-tests.factor diff --git a/core/inference/inference-docs.factor b/core/inference/inference-docs.factor index 508b0a6510..5f7e926b6a 100755 --- a/core/inference/inference-docs.factor +++ b/core/inference/inference-docs.factor @@ -1,5 +1,5 @@ USING: help.syntax help.markup kernel sequences words io -effects inference.dataflow inference.backend +effects inference.dataflow inference.backend classes math combinators inference.transforms inference.state ; IN: inference @@ -93,8 +93,8 @@ $nl ABOUT: "inference" HELP: inference-error -{ $values { "msg" "an object" } } -{ $description "Throws an " { $link inference-error } "." } +{ $values { "class" class } } +{ $description "Creates an instance of " { $snippet "class" } ", wraps it in an " { $link inference-error } " and throws the result." } { $error-description "Thrown by " { $link infer } " and " { $link dataflow } " when the stack effect of a quotation cannot be inferred." $nl diff --git a/core/inference/known-words/known-words.factor b/core/inference/known-words/known-words.factor index 2223dd56b6..72935f1405 100755 --- a/core/inference/known-words/known-words.factor +++ b/core/inference/known-words/known-words.factor @@ -475,10 +475,6 @@ t over set-effect-terminated? \ string>u16-alien { string } { byte-array } "inferred-effect" set-word-prop -\ string>memory { string c-ptr } { } "inferred-effect" set-word-prop - -\ memory>string { c-ptr integer } { string } "inferred-effect" set-word-prop - \ alien-address { alien } { integer } "inferred-effect" set-word-prop \ alien-address make-flushable diff --git a/core/inference/transforms/transforms-docs.factor b/core/inference/transforms/transforms-docs.factor old mode 100644 new mode 100755 index b695406653..a6f0c8e0bf --- a/core/inference/transforms/transforms-docs.factor +++ b/core/inference/transforms/transforms-docs.factor @@ -1,5 +1,5 @@ -USING: help.markup help.syntax inference.transforms -combinators words ; +IN: inference.transforms +USING: help.markup help.syntax combinators words kernel ; HELP: define-transform { $values { "word" word } { "quot" "a quotation taking " { $snippet "n" } " inputs from the stack and producing another quotation as output" } { "n" "a non-negative integer" } } @@ -12,3 +12,8 @@ HELP: define-transform $nl "The " { $link cond } " word compiles to efficient code because it is transformed using " { $link cond>quot } ":" { $code "\\ cond [ cond>quot ] 1 define-transform" } } ; + +HELP: duplicated-slots-error +{ $values { "names" "a sequence of setter words" } } +{ $description "Throws a " { $link duplicated-slots-error } "." } +{ $error-description "Thrown by stack effect inference if a " { $link set-slots } " form is given an array of slot setters that includes duplicates. Since writing to the same slot multiple times has no useful effect, this is a programmer error, so it is caught at compile time." } ; diff --git a/core/inference/transforms/transforms-tests.factor b/core/inference/transforms/transforms-tests.factor old mode 100644 new mode 100755 index 9a62a1faca..152da8c757 --- a/core/inference/transforms/transforms-tests.factor +++ b/core/inference/transforms/transforms-tests.factor @@ -1,6 +1,6 @@ IN: temporary USING: sequences inference.transforms tools.test math kernel -quotations tools.test.inference ; +quotations tools.test.inference inference ; : compose-n-quot >quotation ; : compose-n compose-n-quot call ; @@ -20,3 +20,15 @@ quotations tools.test.inference ; [ 512 ] [ 1 { { 1+ 8 } } bitfield-quot call ] unit-test \ construct-empty must-infer + +TUPLE: a-tuple x y z ; + +: set-slots-test ( x y z -- ) + { set-a-tuple-x set-a-tuple-y } set-slots ; + +\ set-slots-test must-infer + +: set-slots-test-2 + { set-a-tuple-x set-a-tuple-x } set-slots ; + +[ [ set-slots-test-2 ] infer ] unit-test-fails diff --git a/core/inference/transforms/transforms.factor b/core/inference/transforms/transforms.factor index c4eeb98145..fd15b7da98 100755 --- a/core/inference/transforms/transforms.factor +++ b/core/inference/transforms/transforms.factor @@ -2,7 +2,8 @@ ! See http://factorcode.org/license.txt for BSD license. USING: arrays kernel words sequences generic math namespaces quotations assocs combinators math.bitfields inference.backend -inference.dataflow inference.state tuples.private effects ; +inference.dataflow inference.state tuples.private effects +inspector hashtables ; IN: inference.transforms : pop-literals ( n -- rstate seq ) @@ -59,7 +60,18 @@ M: pair (bitfield-quot) ( spec -- quot ) \ get-slots [ [get-slots] ] 1 define-transform -\ set-slots [ [get-slots] ] 1 define-transform +TUPLE: duplicated-slots-error names ; + +M: duplicated-slots-error summary + drop "Calling set-slots with duplicate slot setters" ; + +: duplicated-slots-error ( names -- * ) + \ duplicated-slots-error construct-boa throw ; + +\ set-slots [ + dup all-unique? + [ [get-slots] ] [ duplicated-slots-error ] if +] 1 define-transform \ construct-boa [ dup +inlined+ depends-on From 27701acaafe994d4e4c95c447867cd62ad6f615c Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sat, 26 Jan 2008 23:44:00 -0400 Subject: [PATCH 103/216] Fix using --- extra/math/miller-rabin/miller-rabin.factor | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) mode change 100644 => 100755 extra/math/miller-rabin/miller-rabin.factor diff --git a/extra/math/miller-rabin/miller-rabin.factor b/extra/math/miller-rabin/miller-rabin.factor old mode 100644 new mode 100755 index e2d012ec0a..8b0d98283c --- a/extra/math/miller-rabin/miller-rabin.factor +++ b/extra/math/miller-rabin/miller-rabin.factor @@ -1,5 +1,6 @@ USING: combinators combinators.lib io locals kernel math -math.functions math.ranges namespaces random sequences ; +math.functions math.ranges namespaces random sequences +hashtables ; IN: math.miller-rabin SYMBOL: a From 30eae6b77a8e2da140a55b03160e11c6155f2809 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sat, 26 Jan 2008 23:46:35 -0400 Subject: [PATCH 104/216] Fix completion for upper case strings --- extra/tools/completion/completion.factor | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) mode change 100644 => 100755 extra/tools/completion/completion.factor diff --git a/extra/tools/completion/completion.factor b/extra/tools/completion/completion.factor old mode 100644 new mode 100755 index bb15a3fa87..539b348706 --- a/extra/tools/completion/completion.factor +++ b/extra/tools/completion/completion.factor @@ -60,13 +60,14 @@ vectors words assocs combinators sorting ; dupd fuzzy score max ; : completion ( short candidate -- result ) - [ second swap complete ] keep first 2array ; + [ second >lower swap complete ] keep first 2array ; : completions ( short candidates -- seq ) over empty? [ nip [ first ] map ] [ - >r >lower r> [ completion ] with map rank-completions + >r >lower r> [ completion ] with map + rank-completions ] if ; : string-completions ( short strs -- seq ) From 952f6ca3632d7012e998e08d088d33adb8346fc8 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sat, 26 Jan 2008 23:47:52 -0400 Subject: [PATCH 105/216] Fix bootstrap for a different cell size --- core/bootstrap/image/image.factor | 22 ++++++---------------- core/bootstrap/stage2.factor | 1 + core/compiler/compiler.factor | 2 +- core/cpu/ppc/linux/bootstrap.factor | 7 ++++--- core/cpu/ppc/macosx/bootstrap.factor | 7 ++++--- core/cpu/x86/32/bootstrap.factor | 3 ++- core/cpu/x86/64/bootstrap.factor | 3 ++- 7 files changed, 20 insertions(+), 25 deletions(-) mode change 100644 => 100755 core/cpu/ppc/linux/bootstrap.factor mode change 100644 => 100755 core/cpu/ppc/macosx/bootstrap.factor mode change 100644 => 100755 core/cpu/x86/64/bootstrap.factor diff --git a/core/bootstrap/image/image.factor b/core/bootstrap/image/image.factor index 7b199a5e46..43a8d9752a 100755 --- a/core/bootstrap/image/image.factor +++ b/core/bootstrap/image/image.factor @@ -427,32 +427,22 @@ M: curry ' "Writing image to " write dup write "..." print flush [ (write-image) ] with-stream ; -: prepare-profile ( arch -- ) - "resource:core/bootstrap/layouts/layouts.factor" run-file - "resource:core/cpu/" swap { - { "x86.32" "x86/32" } - { "x86.64" "x86/64" } - { "linux-ppc" "ppc/linux" } - { "macosx-ppc" "ppc/macosx" } - { "arm" "arm" } - } at "/bootstrap.factor" 3append ?resource-path run-file ; - -: prepare-image ( arch -- ) - dup architecture set prepare-profile +: prepare-image ( -- ) bootstrapping? on load-help? off - 800000 image set 20000 objects set ; + 800000 image set + 20000 objects set ; PRIVATE> : make-image ( arch -- ) - [ + architecture [ prepare-image begin-image "resource:/core/bootstrap/stage1.factor" run-file end-image image get image-name write-image - ] with-scope ; + ] with-variable ; : my-arch ( -- arch ) cpu dup "ppc" = [ os "-" rot 3append ] when ; @@ -460,7 +450,7 @@ PRIVATE> : make-images ( -- ) { "x86.32" - ! "x86.64" + "x86.64" "linux-ppc" "macosx-ppc" ! "arm" } [ make-image ] each ; diff --git a/core/bootstrap/stage2.factor b/core/bootstrap/stage2.factor index d035744cd0..0163422f47 100755 --- a/core/bootstrap/stage2.factor +++ b/core/bootstrap/stage2.factor @@ -54,6 +54,7 @@ IN: bootstrap.stage2 ] each ] when ] with-compiler-errors + :errors f error set-global f error-continuation set-global diff --git a/core/compiler/compiler.factor b/core/compiler/compiler.factor index 9378642951..1e6d4f8a17 100755 --- a/core/compiler/compiler.factor +++ b/core/compiler/compiler.factor @@ -44,7 +44,7 @@ IN: compiler : compile-loop ( assoc -- ) dup assoc-empty? [ drop ] [ - dup delete-any (compile) + dup delete-any drop (compile) yield compile-loop ] if ; diff --git a/core/cpu/ppc/linux/bootstrap.factor b/core/cpu/ppc/linux/bootstrap.factor old mode 100644 new mode 100755 index a84bff5141..3900ca7f88 --- a/core/cpu/ppc/linux/bootstrap.factor +++ b/core/cpu/ppc/linux/bootstrap.factor @@ -1,9 +1,10 @@ -! Copyright (C) 2007 Slava Pestov. +! Copyright (C) 2007, 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: parser layouts system ; +USING: parser layouts system kernel ; IN: bootstrap.ppc : c-area-size 10 bootstrap-cells ; : lr-save bootstrap-cell ; -"resource:core/cpu/ppc/bootstrap.factor" run-file +<< "resource:core/cpu/ppc/bootstrap.factor" parse-file parsed >> +call diff --git a/core/cpu/ppc/macosx/bootstrap.factor b/core/cpu/ppc/macosx/bootstrap.factor old mode 100644 new mode 100755 index 016e445522..db5e3a343f --- a/core/cpu/ppc/macosx/bootstrap.factor +++ b/core/cpu/ppc/macosx/bootstrap.factor @@ -1,9 +1,10 @@ -! Copyright (C) 2007 Slava Pestov. +! Copyright (C) 2007, 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: parser layouts system ; +USING: parser layouts system kernel ; IN: bootstrap.ppc : c-area-size 14 bootstrap-cells ; : lr-save 2 bootstrap-cells ; -"resource:core/cpu/ppc/bootstrap.factor" run-file +<< "resource:core/cpu/ppc/bootstrap.factor" parse-file parsed >> +call diff --git a/core/cpu/x86/32/bootstrap.factor b/core/cpu/x86/32/bootstrap.factor index 4ce4b1684d..16083a8628 100755 --- a/core/cpu/x86/32/bootstrap.factor +++ b/core/cpu/x86/32/bootstrap.factor @@ -14,4 +14,5 @@ IN: bootstrap.x86 : fixnum>slot@ arg0 1 SAR ; : rex-length 0 ; -"resource:core/cpu/x86/bootstrap.factor" run-file +<< "resource:core/cpu/x86/bootstrap.factor" parse-file parsed >> +call diff --git a/core/cpu/x86/64/bootstrap.factor b/core/cpu/x86/64/bootstrap.factor old mode 100644 new mode 100755 index 1227369ae8..93bf7cca17 --- a/core/cpu/x86/64/bootstrap.factor +++ b/core/cpu/x86/64/bootstrap.factor @@ -14,4 +14,5 @@ IN: bootstrap.x86 : fixnum>slot@ ; : rex-length 1 ; -"resource:core/cpu/x86/bootstrap.factor" run-file +<< "resource:core/cpu/x86/bootstrap.factor" parse-file parsed >> +call From 0b079572d147b9c6619f6208dc1f52c194999732 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sun, 27 Jan 2008 00:05:37 -0400 Subject: [PATCH 106/216] Clean up opengl a bit (untested) --- extra/opengl/opengl.factor | 45 +++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/extra/opengl/opengl.factor b/extra/opengl/opengl.factor index 0949386bd1..3fffa15318 100755 --- a/extra/opengl/opengl.factor +++ b/extra/opengl/opengl.factor @@ -1,9 +1,10 @@ ! Copyright (C) 2005, 2007 Slava Pestov. ! Portions copyright (C) 2007 Eduardo Cavazos. +! Portions copyright (C) 2008 Joe Groff. ! See http://factorcode.org/license.txt for BSD license. -USING: alien alien.c-types kernel libc math namespaces sequences -math.vectors math.constants math.functions opengl.gl opengl.glu -combinators arrays ; +USING: alien alien.c-types byte-arrays kernel libc math +namespaces sequences math.vectors math.constants math.functions +opengl.gl opengl.glu combinators arrays ; IN: opengl : coordinates [ first2 ] 2apply ; @@ -191,10 +192,13 @@ TUPLE: sprite loc dim dim2 dlist texture ; : c-true? ( int -- ? ) zero? not ; inline : with-gl-shader-source-ptr ( string quot -- ) - swap dup length 1+ [ tuck string>char-memory swap call ] with-malloc ; inline + swap >byte-array malloc-byte-array [ + swap call + ] keep free ; inline : ( source kind -- shader ) - glCreateShader dup rot [ 1 swap f glShaderSource ] with-gl-shader-source-ptr + glCreateShader dup rot + [ 1 swap f glShaderSource ] with-gl-shader-source-ptr [ glCompileShader ] keep gl-error ; @@ -211,19 +215,27 @@ TUPLE: sprite loc dim dim2 dlist texture ; GL_VERTEX_SHADER ; inline : (vertex-shader?) ( object -- ? ) - dup (gl-shader?) [ GL_SHADER_TYPE gl-shader-get-int GL_VERTEX_SHADER = ] [ drop f ] if ; + dup (gl-shader?) + [ GL_SHADER_TYPE gl-shader-get-int GL_VERTEX_SHADER = ] + [ drop f ] if ; : ( source -- fragment-shader ) GL_FRAGMENT_SHADER ; inline : (fragment-shader?) ( object -- ? ) - dup (gl-shader?) [ GL_SHADER_TYPE gl-shader-get-int GL_FRAGMENT_SHADER = ] [ drop f ] if ; + dup (gl-shader?) + [ GL_SHADER_TYPE gl-shader-get-int GL_FRAGMENT_SHADER = ] + [ drop f ] if ; : gl-shader-info-log-length ( shader -- log-length ) GL_INFO_LOG_LENGTH gl-shader-get-int ; inline : gl-shader-info-log ( shader -- log ) - dup gl-shader-info-log-length dup [ [ 0 swap glGetShaderInfoLog ] keep alien>char-string ] with-malloc ; + dup gl-shader-info-log-length + dup [ + 0 over glGetShaderInfoLog + alien>char-string + ] with-malloc ; : check-gl-shader ( shader -- shader* ) dup gl-shader-ok? [ dup gl-shader-info-log throw ] unless ; @@ -266,17 +278,20 @@ PREDICATE: gl-shader fragment-shader (fragment-shader?) ; GL_ATTACHED_SHADERS gl-program-get-int ; inline : gl-program-shaders ( program -- shaders ) - dup gl-program-shaders-length - [ dup "GLuint" [ 0 swap glGetAttachedShaders ] keep ] keep - c-uint-array> ; + dup gl-program-shaders-length [ + dup "GLuint" 0 over glGetAttachedShaders + ] keep c-uint-array> ; -: delete-gl-program-only ( program -- ) glDeleteProgram ; inline +: delete-gl-program-only ( program -- ) + glDeleteProgram ; inline -: detach-gl-program-shader ( program shader -- ) glDetachShader ; inline +: detach-gl-program-shader ( program shader -- ) + glDetachShader ; inline : delete-gl-program ( program -- ) - dup gl-program-shaders [ 2dup detach-gl-program-shader delete-gl-shader ] each - delete-gl-program-only ; + dup gl-program-shaders [ + 2dup detach-gl-program-shader delete-gl-shader + ] each delete-gl-program-only ; : with-gl-program ( program quot -- ) swap glUseProgram call 0 glUseProgram ; inline From 1c91a286e54d48c6853ad9c6d1e31a8dbc59e952 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sun, 27 Jan 2008 01:02:31 -0400 Subject: [PATCH 107/216] Updating summary and authors --- core/compiler/constants/authors.txt | 1 + core/compiler/constants/summary.txt | 1 + core/compiler/errors/authors.txt | 1 + core/compiler/errors/summary.txt | 1 + core/compiler/units/authors.txt | 1 + core/compiler/units/summary.txt | 1 + core/cpu/arm/allot/authors.txt | 1 + core/cpu/arm/architecture/authors.txt | 1 + core/cpu/arm/assembler/authors.txt | 1 + core/cpu/arm/intrinsics/authors.txt | 1 + core/cpu/ppc/intrinsics/authors.txt | 1 + core/cpu/x86/32/authors.txt | 1 + core/cpu/x86/allot/authors.txt | 1 + core/cpu/x86/architecture/authors.txt | 1 + core/cpu/x86/assembler/authors.txt | 1 + core/cpu/x86/intrinsics/authors.txt | 1 + core/float-arrays/authors.txt | 1 + core/heaps/authors.txt | 2 ++ core/heaps/summary.txt | 1 + core/inference/state/authors.txt | 1 + core/inference/state/summary.txt | 1 + core/io/encodings/authors.txt | 1 + core/io/encodings/summary.txt | 1 + core/refs/authors.txt | 1 + core/refs/summary.txt | 1 + extra/alarms/authors.txt | 1 + extra/arrays/lib/authors.txt | 1 + extra/asn1/ldap/authors.txt | 1 + extra/assoc-heaps/authors.txt | 1 + extra/assoc-heaps/summary.txt | 1 + extra/automata/ui/authors.txt | 1 + extra/benchmark/bootstrap1/authors.txt | 1 + extra/benchmark/bootstrap2/authors.txt | 1 + extra/benchmark/continuations/authors.txt | 1 + extra/benchmark/dispatch1/authors.txt | 1 + extra/benchmark/dispatch2/authors.txt | 1 + extra/benchmark/dispatch3/authors.txt | 1 + extra/benchmark/dispatch4/authors.txt | 1 + extra/benchmark/empty-loop/authors.txt | 1 + extra/benchmark/fib1/authors.txt | 1 + extra/benchmark/fib2/authors.txt | 1 + extra/benchmark/fib3/authors.txt | 1 + extra/benchmark/fib4/authors.txt | 1 + extra/benchmark/fib5/authors.txt | 1 + extra/benchmark/iteration/authors.txt | 1 + extra/benchmark/mandel/authors.txt | 1 + extra/benchmark/nsieve-bits/authors.txt | 1 + extra/benchmark/nsieve/authors.txt | 1 + extra/benchmark/partial-sums/authors.txt | 1 + extra/benchmark/raytracer/authors.txt | 1 + extra/benchmark/recursive/authors.txt | 1 + extra/benchmark/reverse-complement/authors.txt | 1 + extra/benchmark/ring/authors.txt | 1 + extra/benchmark/sha1/authors.txt | 1 + extra/benchmark/sort/authors.txt | 1 + extra/benchmark/spectral-norm/authors.txt | 1 + extra/benchmark/sum-file/authors.txt | 1 + extra/benchmark/typecheck1/authors.txt | 1 + extra/benchmark/typecheck2/authors.txt | 1 + extra/benchmark/typecheck3/authors.txt | 1 + extra/benchmark/typecheck4/authors.txt | 1 + extra/boids/ui/authors.txt | 1 + extra/cairo-demo/authors.txt | 1 + extra/calendar/backend/authors.txt | 1 + extra/calendar/unix/authors.txt | 1 + extra/calendar/windows/authors.txt | 1 + extra/cfdg/gl/authors.txt | 1 + extra/cfdg/models/aqua-star/authors.txt | 1 + extra/cfdg/models/chiaroscuro/authors.txt | 1 + extra/cfdg/models/flower6/authors.txt | 1 + extra/cfdg/models/game1-turn6/authors.txt | 1 + extra/cfdg/models/lesson/authors.txt | 1 + extra/cfdg/models/sierpinski/authors.txt | 1 + extra/cfdg/models/snowflake/authors.txt | 1 + extra/cocoa/plists/authors.txt | 1 + extra/colors/hsv/authors.txt | 1 + extra/combinators/cleave/authors.txt | 1 + extra/combinators/lib/authors.txt | 1 + extra/contributors/summary.txt | 2 +- extra/crypto/barrett/authors.txt | 1 + extra/crypto/common/authors.txt | 1 + extra/crypto/hmac/authors.txt | 1 + extra/crypto/md5/authors.txt | 1 + extra/crypto/rc4/authors.txt | 1 + extra/crypto/rsa/authors.txt | 1 + extra/crypto/sha1/authors.txt | 1 + extra/crypto/sha2/authors.txt | 1 + extra/crypto/timing/authors.txt | 1 + extra/crypto/xor/authors.txt | 1 + extra/delegate/authors.txt | 1 + extra/delegate/protocols/authors.txt | 1 + extra/editors/gvim/backend/authors.txt | 1 + extra/editors/gvim/unix/authors.txt | 1 + extra/editors/gvim/windows/authors.txt | 1 + extra/factory/commands/authors.txt | 1 + extra/factory/load/authors.txt | 1 + extra/faq/authors.txt | 1 + extra/faq/summary.txt | 1 + extra/furnace/sessions/authors.txt | 1 + extra/furnace/summary.txt | 1 + extra/furnace/validator/authors.txt | 1 + extra/generic/lib/authors.txt | 1 + extra/geom/dim/authors.txt | 1 + extra/geom/pos/authors.txt | 1 + extra/geom/rect/authors.txt | 1 + extra/graphics/bitmap/authors.txt | 1 + extra/graphics/viewer/authors.txt | 1 + extra/hardware-info/backend/authors.txt | 1 + extra/hardware-info/linux/authors.txt | 1 + extra/hardware-info/macosx/authors.txt | 1 + extra/hardware-info/windows/authors.txt | 1 + extra/hardware-info/windows/ce/authors.txt | 1 + extra/hardware-info/windows/nt/authors.txt | 1 + extra/help/cookbook/authors.txt | 1 + extra/help/tutorial/authors.txt | 1 + extra/html/elements/authors.txt | 2 ++ extra/html/parser/analyzer/authors.txt | 1 + extra/html/parser/authors.txt | 1 + extra/html/parser/printer/authors.txt | 1 + extra/html/parser/utils/authors.txt | 1 + extra/http/mime/authors.txt | 1 + extra/http/server/authors.txt | 1 + extra/http/server/responders/authors.txt | 1 + extra/inverse/summary.txt | 1 + extra/io/mmap/authors.txt | 1 + extra/io/mmap/summary.txt | 1 + extra/io/monitor/authors.txt | 1 + extra/io/monitor/summary.txt | 1 + extra/io/paths/authors.txt | 1 + extra/io/server/authors.txt | 1 + extra/io/sniffer/authors.txt | 2 ++ extra/io/sniffer/backend/authors.txt | 2 ++ extra/io/sniffer/bsd/authors.txt | 2 ++ extra/io/sniffer/filter/authors.txt | 2 ++ extra/io/sniffer/filter/backend/authors.txt | 2 ++ extra/io/sniffer/filter/bsd/authors.txt | 2 ++ extra/io/sockets/headers/authors.txt | 1 + extra/io/sockets/headers/bsd/authors.txt | 1 + extra/io/sockets/impl/authors.txt | 1 + extra/io/streams/null/authors.txt | 1 + extra/io/unix/bsd/authors.txt | 1 + extra/io/unix/epoll/authors.txt | 1 + extra/io/unix/kqueue/authors.txt | 1 + extra/io/unix/launcher/authors.txt | 1 + extra/io/unix/linux/authors.txt | 1 + extra/io/unix/mmap/authors.txt | 1 + extra/io/unix/select/authors.txt | 1 + extra/io/windows/ce/backend/authors.txt | 3 +++ extra/io/windows/ce/files/authors.txt | 2 ++ extra/io/windows/ce/sockets/authors.txt | 2 ++ extra/io/windows/launcher/authors.txt | 2 ++ extra/io/windows/mmap/authors.txt | 1 + extra/io/windows/nt/backend/authors.txt | 3 +++ extra/io/windows/nt/files/authors.txt | 3 +++ extra/io/windows/nt/launcher/authors.txt | 3 +++ extra/io/windows/nt/monitor/authors.txt | 1 + extra/io/windows/nt/sockets/authors.txt | 3 +++ extra/io/windows/pipes/authors.txt | 1 + extra/jamshred/authors.txt | 1 + extra/jamshred/game/authors.txt | 1 + extra/jamshred/gl/authors.txt | 1 + extra/jamshred/oint/authors.txt | 1 + extra/jamshred/player/authors.txt | 1 + extra/jamshred/tunnel/authors.txt | 1 + extra/json/authors.txt | 1 + extra/json/summary.txt | 1 + extra/koszul/authors.txt | 1 + extra/koszul/summary.txt | 1 + extra/lazy-lists/examples/authors.txt | 1 + extra/ldap/libldap/authors.txt | 1 + extra/lint/summary.txt | 1 + extra/lsys/strings/authors.txt | 1 + extra/lsys/strings/interpret/authors.txt | 1 + extra/lsys/strings/rewrite/authors.txt | 1 + extra/lsys/tortoise/authors.txt | 1 + extra/lsys/tortoise/graphics/authors.txt | 1 + extra/lsys/ui/authors.txt | 1 + extra/macros/zoo/authors.txt | 1 + extra/mad/api/authors.txt | 1 + extra/mad/player/authors.txt | 1 + extra/math/miller-rabin/authors.txt | 1 + extra/math/primes/list/authors.txt | 1 + extra/nehe/2/authors.txt | 1 + extra/nehe/3/authors.txt | 1 + extra/nehe/4/authors.txt | 1 + extra/nehe/5/authors.txt | 1 + extra/network-clipboard/authors.txt | 1 + extra/new-slots/authors.txt | 1 + extra/openal/backend/authors.txt | 1 + extra/openal/example/authors.txt | 1 + extra/openal/macosx/authors.txt | 1 + extra/openal/other/authors.txt | 1 + extra/opengl/camera/authors.txt | 1 + extra/opengl/gl/unix/authors.txt | 1 + extra/opengl/gl/windows/authors.txt | 1 + extra/openssl/summary.txt | 1 + extra/optimizer/debugger/authors.txt | 1 + extra/oracle/liboci/authors.txt | 1 + extra/random-tester/authors.txt | 1 + extra/random-tester/databank/authors.txt | 1 + extra/random-tester/random/authors.txt | 1 + extra/random-tester/safe-words/authors.txt | 1 + extra/random-tester/utils/authors.txt | 1 + extra/raptor/authors.txt | 1 + extra/raptor/cron/authors.txt | 1 + extra/regexp/authors.txt | 2 ++ extra/rss/authors.txt | 1 + extra/rss/summary.txt | 1 + extra/slides/summary.txt | 1 + extra/springies/models/2snake/authors.txt | 1 + extra/springies/models/2x2snake/authors.txt | 1 + extra/springies/models/3snake/authors.txt | 1 + extra/springies/models/ball/authors.txt | 1 + extra/springies/models/belt-tire/authors.txt | 1 + extra/springies/models/nifty/authors.txt | 1 + extra/springies/models/urchin/authors.txt | 1 + extra/springies/ui/authors.txt | 1 + extra/sqlite/authors.txt | 1 + extra/sqlite/lib/authors.txt | 1 + extra/sqlite/tuple-db/authors.txt | 1 + extra/state-machine/authors.txt | 1 + extra/store/blob/authors.txt | 1 + extra/strings/lib/authors.txt | 1 + extra/structs/authors.txt | 1 + extra/tar/authors.txt | 1 + extra/tetris/board/authors.txt | 1 + extra/tetris/game/authors.txt | 1 + extra/tetris/gl/authors.txt | 1 + extra/tetris/piece/authors.txt | 1 + extra/tetris/tetromino/authors.txt | 1 + extra/tools/browser/authors.txt | 1 + extra/tools/deploy/backend/authors.txt | 1 + extra/tools/deploy/config/authors.txt | 1 + extra/tools/deploy/macosx/authors.txt | 1 + extra/tools/deploy/shaker/authors.txt | 1 + extra/tools/deploy/windows/authors.txt | 1 + extra/tools/interpreter/debug/authors.txt | 1 + extra/tools/test/inference/authors.txt | 1 + extra/tools/test/ui/authors.txt | 1 + extra/ui/gadgets/canvas/authors.txt | 1 + extra/ui/gadgets/handler/authors.txt | 1 + extra/ui/gadgets/lib/authors.txt | 1 + extra/ui/gadgets/slate/authors.txt | 1 + extra/ui/tools/deploy/authors.txt | 1 + extra/ui/windows/authors.txt | 1 + extra/ui/x11/authors.txt | 1 + extra/unicode/breaks/authors.txt | 1 + extra/unicode/case/authors.txt | 1 + extra/unicode/categories/authors.txt | 1 + extra/unicode/data/authors.txt | 1 + extra/unicode/normalize/authors.txt | 1 + extra/unicode/syntax/authors.txt | 1 + extra/units/authors.txt | 1 + extra/units/constants/authors.txt | 1 + extra/units/imperial/authors.txt | 1 + extra/units/si/authors.txt | 1 + extra/unix/kqueue/authors.txt | 1 + extra/unix/linux/authors.txt | 1 + extra/unix/linux/epoll/authors.txt | 1 + extra/unix/linux/fs/authors.txt | 1 + extra/unix/linux/if/authors.txt | 1 + extra/unix/linux/ifreq/authors.txt | 1 + extra/unix/linux/route/authors.txt | 1 + extra/unix/linux/sockios/authors.txt | 1 + extra/unix/linux/swap/authors.txt | 1 + extra/unix/process/authors.txt | 1 + extra/unix/solaris/authors.txt | 1 + extra/webapps/article-manager/database/authors.txt | 1 + extra/webapps/callback/authors.txt | 2 ++ extra/webapps/cgi/authors.txt | 1 + extra/webapps/continuation/authors.txt | 1 + extra/webapps/continuation/examples/authors.txt | 1 + extra/webapps/file/authors.txt | 1 + extra/webapps/help/authors.txt | 1 + extra/webapps/numbers/authors.txt | 1 + extra/webapps/pastebin/authors.txt | 1 + extra/webapps/planet/authors.txt | 1 + extra/webapps/source/authors.txt | 1 + extra/windows/advapi32/authors.txt | 1 + extra/windows/ce/authors.txt | 1 + extra/windows/errors/authors.txt | 1 + extra/windows/gdi32/authors.txt | 1 + extra/windows/kernel32/authors.txt | 1 + extra/windows/messages/authors.txt | 1 + extra/windows/nt/authors.txt | 1 + extra/windows/opengl32/authors.txt | 1 + extra/windows/shell32/authors.txt | 1 + extra/windows/time/authors.txt | 1 + extra/windows/types/authors.txt | 1 + extra/windows/user32/authors.txt | 1 + extra/windows/winsock/authors.txt | 1 + extra/x/font/authors.txt | 1 + extra/x/gc/authors.txt | 1 + extra/x/keysym-table/authors.txt | 1 + extra/x/pen/authors.txt | 1 + extra/x/widgets/authors.txt | 1 + extra/x/widgets/button/authors.txt | 1 + extra/x/widgets/keymenu/authors.txt | 1 + extra/x/widgets/label/authors.txt | 1 + extra/x/widgets/wm/child/authors.txt | 1 + extra/x/widgets/wm/frame/authors.txt | 1 + extra/x/widgets/wm/frame/drag/authors.txt | 1 + extra/x/widgets/wm/frame/drag/move/authors.txt | 1 + extra/x/widgets/wm/frame/drag/size/authors.txt | 1 + extra/x/widgets/wm/menu/authors.txt | 1 + extra/x/widgets/wm/root/authors.txt | 1 + extra/x/widgets/wm/unmapped-frames-menu/authors.txt | 1 + extra/x/widgets/wm/workspace/authors.txt | 1 + extra/xml/char-classes/authors.txt | 1 + extra/xml/data/authors.txt | 1 + extra/xml/entities/authors.txt | 1 + extra/xml/errors/authors.txt | 1 + extra/xml/generator/authors.txt | 1 + extra/xml/test/authors.txt | 1 + extra/xml/tokenize/authors.txt | 1 + extra/xml/utilities/authors.txt | 1 + extra/xml/writer/authors.txt | 1 + extra/xmode/catalog/authors.txt | 1 + extra/xmode/code2html/authors.txt | 1 + extra/xmode/keyword-map/authors.txt | 1 + extra/xmode/loader/authors.txt | 1 + extra/xmode/loader/syntax/authors.txt | 1 + extra/xmode/marker/authors.txt | 1 + extra/xmode/marker/context/authors.txt | 1 + extra/xmode/marker/state/authors.txt | 1 + extra/xmode/rules/authors.txt | 1 + extra/xmode/tokens/authors.txt | 1 + extra/xmode/utilities/authors.txt | 1 + 328 files changed, 351 insertions(+), 1 deletion(-) create mode 100755 core/compiler/constants/authors.txt create mode 100755 core/compiler/constants/summary.txt create mode 100755 core/compiler/errors/authors.txt create mode 100755 core/compiler/errors/summary.txt create mode 100755 core/compiler/units/authors.txt create mode 100755 core/compiler/units/summary.txt create mode 100755 core/cpu/arm/allot/authors.txt create mode 100755 core/cpu/arm/architecture/authors.txt create mode 100755 core/cpu/arm/assembler/authors.txt create mode 100755 core/cpu/arm/intrinsics/authors.txt create mode 100755 core/cpu/ppc/intrinsics/authors.txt create mode 100755 core/cpu/x86/32/authors.txt create mode 100755 core/cpu/x86/allot/authors.txt create mode 100755 core/cpu/x86/architecture/authors.txt create mode 100755 core/cpu/x86/assembler/authors.txt create mode 100755 core/cpu/x86/intrinsics/authors.txt create mode 100755 core/float-arrays/authors.txt create mode 100755 core/heaps/authors.txt create mode 100755 core/heaps/summary.txt create mode 100755 core/inference/state/authors.txt create mode 100755 core/inference/state/summary.txt create mode 100755 core/io/encodings/authors.txt create mode 100755 core/io/encodings/summary.txt create mode 100755 core/refs/authors.txt create mode 100755 core/refs/summary.txt create mode 100755 extra/alarms/authors.txt create mode 100755 extra/arrays/lib/authors.txt create mode 100755 extra/asn1/ldap/authors.txt create mode 100755 extra/assoc-heaps/authors.txt create mode 100755 extra/assoc-heaps/summary.txt create mode 100755 extra/automata/ui/authors.txt create mode 100755 extra/benchmark/bootstrap1/authors.txt create mode 100755 extra/benchmark/bootstrap2/authors.txt create mode 100755 extra/benchmark/continuations/authors.txt create mode 100755 extra/benchmark/dispatch1/authors.txt create mode 100755 extra/benchmark/dispatch2/authors.txt create mode 100755 extra/benchmark/dispatch3/authors.txt create mode 100755 extra/benchmark/dispatch4/authors.txt create mode 100755 extra/benchmark/empty-loop/authors.txt create mode 100755 extra/benchmark/fib1/authors.txt create mode 100755 extra/benchmark/fib2/authors.txt create mode 100755 extra/benchmark/fib3/authors.txt create mode 100755 extra/benchmark/fib4/authors.txt create mode 100755 extra/benchmark/fib5/authors.txt create mode 100755 extra/benchmark/iteration/authors.txt create mode 100755 extra/benchmark/mandel/authors.txt create mode 100755 extra/benchmark/nsieve-bits/authors.txt create mode 100755 extra/benchmark/nsieve/authors.txt create mode 100755 extra/benchmark/partial-sums/authors.txt create mode 100755 extra/benchmark/raytracer/authors.txt create mode 100755 extra/benchmark/recursive/authors.txt create mode 100755 extra/benchmark/reverse-complement/authors.txt create mode 100755 extra/benchmark/ring/authors.txt create mode 100755 extra/benchmark/sha1/authors.txt create mode 100755 extra/benchmark/sort/authors.txt create mode 100755 extra/benchmark/spectral-norm/authors.txt create mode 100755 extra/benchmark/sum-file/authors.txt create mode 100755 extra/benchmark/typecheck1/authors.txt create mode 100755 extra/benchmark/typecheck2/authors.txt create mode 100755 extra/benchmark/typecheck3/authors.txt create mode 100755 extra/benchmark/typecheck4/authors.txt create mode 100755 extra/boids/ui/authors.txt create mode 100755 extra/cairo-demo/authors.txt create mode 100755 extra/calendar/backend/authors.txt create mode 100755 extra/calendar/unix/authors.txt create mode 100755 extra/calendar/windows/authors.txt create mode 100755 extra/cfdg/gl/authors.txt create mode 100755 extra/cfdg/models/aqua-star/authors.txt create mode 100755 extra/cfdg/models/chiaroscuro/authors.txt create mode 100755 extra/cfdg/models/flower6/authors.txt create mode 100755 extra/cfdg/models/game1-turn6/authors.txt create mode 100755 extra/cfdg/models/lesson/authors.txt create mode 100755 extra/cfdg/models/sierpinski/authors.txt create mode 100755 extra/cfdg/models/snowflake/authors.txt create mode 100755 extra/cocoa/plists/authors.txt create mode 100755 extra/colors/hsv/authors.txt create mode 100755 extra/combinators/cleave/authors.txt create mode 100755 extra/combinators/lib/authors.txt create mode 100755 extra/crypto/barrett/authors.txt create mode 100755 extra/crypto/common/authors.txt create mode 100755 extra/crypto/hmac/authors.txt create mode 100755 extra/crypto/md5/authors.txt create mode 100755 extra/crypto/rc4/authors.txt create mode 100755 extra/crypto/rsa/authors.txt create mode 100755 extra/crypto/sha1/authors.txt create mode 100755 extra/crypto/sha2/authors.txt create mode 100755 extra/crypto/timing/authors.txt create mode 100755 extra/crypto/xor/authors.txt create mode 100755 extra/delegate/authors.txt create mode 100755 extra/delegate/protocols/authors.txt create mode 100755 extra/editors/gvim/backend/authors.txt create mode 100755 extra/editors/gvim/unix/authors.txt create mode 100755 extra/editors/gvim/windows/authors.txt create mode 100755 extra/factory/commands/authors.txt create mode 100755 extra/factory/load/authors.txt create mode 100755 extra/faq/authors.txt create mode 100755 extra/faq/summary.txt create mode 100755 extra/furnace/sessions/authors.txt create mode 100755 extra/furnace/summary.txt create mode 100755 extra/furnace/validator/authors.txt create mode 100755 extra/generic/lib/authors.txt create mode 100755 extra/geom/dim/authors.txt create mode 100755 extra/geom/pos/authors.txt create mode 100755 extra/geom/rect/authors.txt create mode 100755 extra/graphics/bitmap/authors.txt create mode 100755 extra/graphics/viewer/authors.txt create mode 100755 extra/hardware-info/backend/authors.txt create mode 100755 extra/hardware-info/linux/authors.txt create mode 100755 extra/hardware-info/macosx/authors.txt create mode 100755 extra/hardware-info/windows/authors.txt create mode 100755 extra/hardware-info/windows/ce/authors.txt create mode 100755 extra/hardware-info/windows/nt/authors.txt create mode 100755 extra/help/cookbook/authors.txt create mode 100755 extra/help/tutorial/authors.txt create mode 100755 extra/html/elements/authors.txt create mode 100755 extra/html/parser/analyzer/authors.txt create mode 100755 extra/html/parser/authors.txt create mode 100755 extra/html/parser/printer/authors.txt create mode 100755 extra/html/parser/utils/authors.txt create mode 100755 extra/http/mime/authors.txt create mode 100755 extra/http/server/authors.txt create mode 100755 extra/http/server/responders/authors.txt create mode 100755 extra/inverse/summary.txt create mode 100755 extra/io/mmap/authors.txt create mode 100755 extra/io/mmap/summary.txt create mode 100755 extra/io/monitor/authors.txt create mode 100755 extra/io/monitor/summary.txt create mode 100755 extra/io/paths/authors.txt create mode 100755 extra/io/server/authors.txt create mode 100755 extra/io/sniffer/authors.txt create mode 100755 extra/io/sniffer/backend/authors.txt create mode 100755 extra/io/sniffer/bsd/authors.txt create mode 100755 extra/io/sniffer/filter/authors.txt create mode 100755 extra/io/sniffer/filter/backend/authors.txt create mode 100755 extra/io/sniffer/filter/bsd/authors.txt create mode 100755 extra/io/sockets/headers/authors.txt create mode 100755 extra/io/sockets/headers/bsd/authors.txt create mode 100755 extra/io/sockets/impl/authors.txt create mode 100755 extra/io/streams/null/authors.txt create mode 100755 extra/io/unix/bsd/authors.txt create mode 100755 extra/io/unix/epoll/authors.txt create mode 100755 extra/io/unix/kqueue/authors.txt create mode 100755 extra/io/unix/launcher/authors.txt create mode 100755 extra/io/unix/linux/authors.txt create mode 100755 extra/io/unix/mmap/authors.txt create mode 100755 extra/io/unix/select/authors.txt create mode 100755 extra/io/windows/ce/backend/authors.txt create mode 100755 extra/io/windows/ce/files/authors.txt create mode 100755 extra/io/windows/ce/sockets/authors.txt create mode 100755 extra/io/windows/launcher/authors.txt create mode 100755 extra/io/windows/mmap/authors.txt create mode 100755 extra/io/windows/nt/backend/authors.txt create mode 100755 extra/io/windows/nt/files/authors.txt create mode 100755 extra/io/windows/nt/launcher/authors.txt create mode 100755 extra/io/windows/nt/monitor/authors.txt create mode 100755 extra/io/windows/nt/sockets/authors.txt create mode 100755 extra/io/windows/pipes/authors.txt create mode 100755 extra/jamshred/authors.txt create mode 100755 extra/jamshred/game/authors.txt create mode 100755 extra/jamshred/gl/authors.txt create mode 100755 extra/jamshred/oint/authors.txt create mode 100755 extra/jamshred/player/authors.txt create mode 100755 extra/jamshred/tunnel/authors.txt create mode 100755 extra/json/authors.txt create mode 100755 extra/json/summary.txt create mode 100755 extra/koszul/authors.txt create mode 100755 extra/koszul/summary.txt create mode 100755 extra/lazy-lists/examples/authors.txt create mode 100755 extra/ldap/libldap/authors.txt create mode 100755 extra/lint/summary.txt create mode 100755 extra/lsys/strings/authors.txt create mode 100755 extra/lsys/strings/interpret/authors.txt create mode 100755 extra/lsys/strings/rewrite/authors.txt create mode 100755 extra/lsys/tortoise/authors.txt create mode 100755 extra/lsys/tortoise/graphics/authors.txt create mode 100755 extra/lsys/ui/authors.txt create mode 100755 extra/macros/zoo/authors.txt create mode 100755 extra/mad/api/authors.txt create mode 100755 extra/mad/player/authors.txt create mode 100755 extra/math/miller-rabin/authors.txt create mode 100755 extra/math/primes/list/authors.txt create mode 100755 extra/nehe/2/authors.txt create mode 100755 extra/nehe/3/authors.txt create mode 100755 extra/nehe/4/authors.txt create mode 100755 extra/nehe/5/authors.txt create mode 100755 extra/network-clipboard/authors.txt create mode 100755 extra/new-slots/authors.txt create mode 100755 extra/openal/backend/authors.txt create mode 100755 extra/openal/example/authors.txt create mode 100755 extra/openal/macosx/authors.txt create mode 100755 extra/openal/other/authors.txt create mode 100755 extra/opengl/camera/authors.txt create mode 100755 extra/opengl/gl/unix/authors.txt create mode 100755 extra/opengl/gl/windows/authors.txt create mode 100755 extra/openssl/summary.txt create mode 100755 extra/optimizer/debugger/authors.txt create mode 100755 extra/oracle/liboci/authors.txt create mode 100755 extra/random-tester/authors.txt create mode 100755 extra/random-tester/databank/authors.txt create mode 100755 extra/random-tester/random/authors.txt create mode 100755 extra/random-tester/safe-words/authors.txt create mode 100755 extra/random-tester/utils/authors.txt create mode 100755 extra/raptor/authors.txt create mode 100755 extra/raptor/cron/authors.txt create mode 100755 extra/regexp/authors.txt create mode 100755 extra/rss/authors.txt create mode 100755 extra/rss/summary.txt create mode 100755 extra/slides/summary.txt create mode 100755 extra/springies/models/2snake/authors.txt create mode 100755 extra/springies/models/2x2snake/authors.txt create mode 100755 extra/springies/models/3snake/authors.txt create mode 100755 extra/springies/models/ball/authors.txt create mode 100755 extra/springies/models/belt-tire/authors.txt create mode 100755 extra/springies/models/nifty/authors.txt create mode 100755 extra/springies/models/urchin/authors.txt create mode 100755 extra/springies/ui/authors.txt create mode 100755 extra/sqlite/authors.txt create mode 100755 extra/sqlite/lib/authors.txt create mode 100755 extra/sqlite/tuple-db/authors.txt create mode 100755 extra/state-machine/authors.txt create mode 100755 extra/store/blob/authors.txt create mode 100755 extra/strings/lib/authors.txt create mode 100755 extra/structs/authors.txt create mode 100755 extra/tar/authors.txt create mode 100755 extra/tetris/board/authors.txt create mode 100755 extra/tetris/game/authors.txt create mode 100755 extra/tetris/gl/authors.txt create mode 100755 extra/tetris/piece/authors.txt create mode 100755 extra/tetris/tetromino/authors.txt create mode 100755 extra/tools/browser/authors.txt create mode 100755 extra/tools/deploy/backend/authors.txt create mode 100755 extra/tools/deploy/config/authors.txt create mode 100755 extra/tools/deploy/macosx/authors.txt create mode 100755 extra/tools/deploy/shaker/authors.txt create mode 100755 extra/tools/deploy/windows/authors.txt create mode 100755 extra/tools/interpreter/debug/authors.txt create mode 100755 extra/tools/test/inference/authors.txt create mode 100755 extra/tools/test/ui/authors.txt create mode 100755 extra/ui/gadgets/canvas/authors.txt create mode 100755 extra/ui/gadgets/handler/authors.txt create mode 100755 extra/ui/gadgets/lib/authors.txt create mode 100755 extra/ui/gadgets/slate/authors.txt create mode 100755 extra/ui/tools/deploy/authors.txt create mode 100755 extra/ui/windows/authors.txt create mode 100755 extra/ui/x11/authors.txt create mode 100755 extra/unicode/breaks/authors.txt create mode 100755 extra/unicode/case/authors.txt create mode 100755 extra/unicode/categories/authors.txt create mode 100755 extra/unicode/data/authors.txt create mode 100755 extra/unicode/normalize/authors.txt create mode 100755 extra/unicode/syntax/authors.txt create mode 100755 extra/units/authors.txt create mode 100755 extra/units/constants/authors.txt create mode 100755 extra/units/imperial/authors.txt create mode 100755 extra/units/si/authors.txt create mode 100755 extra/unix/kqueue/authors.txt create mode 100755 extra/unix/linux/authors.txt create mode 100755 extra/unix/linux/epoll/authors.txt create mode 100755 extra/unix/linux/fs/authors.txt create mode 100755 extra/unix/linux/if/authors.txt create mode 100755 extra/unix/linux/ifreq/authors.txt create mode 100755 extra/unix/linux/route/authors.txt create mode 100755 extra/unix/linux/sockios/authors.txt create mode 100755 extra/unix/linux/swap/authors.txt create mode 100755 extra/unix/process/authors.txt create mode 100755 extra/unix/solaris/authors.txt create mode 100755 extra/webapps/article-manager/database/authors.txt create mode 100755 extra/webapps/callback/authors.txt create mode 100755 extra/webapps/cgi/authors.txt create mode 100755 extra/webapps/continuation/authors.txt create mode 100755 extra/webapps/continuation/examples/authors.txt create mode 100755 extra/webapps/file/authors.txt create mode 100755 extra/webapps/help/authors.txt create mode 100755 extra/webapps/numbers/authors.txt create mode 100755 extra/webapps/pastebin/authors.txt create mode 100755 extra/webapps/planet/authors.txt create mode 100755 extra/webapps/source/authors.txt create mode 100755 extra/windows/advapi32/authors.txt create mode 100755 extra/windows/ce/authors.txt create mode 100755 extra/windows/errors/authors.txt create mode 100755 extra/windows/gdi32/authors.txt create mode 100755 extra/windows/kernel32/authors.txt create mode 100755 extra/windows/messages/authors.txt create mode 100755 extra/windows/nt/authors.txt create mode 100755 extra/windows/opengl32/authors.txt create mode 100755 extra/windows/shell32/authors.txt create mode 100755 extra/windows/time/authors.txt create mode 100755 extra/windows/types/authors.txt create mode 100755 extra/windows/user32/authors.txt create mode 100755 extra/windows/winsock/authors.txt create mode 100755 extra/x/font/authors.txt create mode 100755 extra/x/gc/authors.txt create mode 100755 extra/x/keysym-table/authors.txt create mode 100755 extra/x/pen/authors.txt create mode 100755 extra/x/widgets/authors.txt create mode 100755 extra/x/widgets/button/authors.txt create mode 100755 extra/x/widgets/keymenu/authors.txt create mode 100755 extra/x/widgets/label/authors.txt create mode 100755 extra/x/widgets/wm/child/authors.txt create mode 100755 extra/x/widgets/wm/frame/authors.txt create mode 100755 extra/x/widgets/wm/frame/drag/authors.txt create mode 100755 extra/x/widgets/wm/frame/drag/move/authors.txt create mode 100755 extra/x/widgets/wm/frame/drag/size/authors.txt create mode 100755 extra/x/widgets/wm/menu/authors.txt create mode 100755 extra/x/widgets/wm/root/authors.txt create mode 100755 extra/x/widgets/wm/unmapped-frames-menu/authors.txt create mode 100755 extra/x/widgets/wm/workspace/authors.txt create mode 100755 extra/xml/char-classes/authors.txt create mode 100755 extra/xml/data/authors.txt create mode 100755 extra/xml/entities/authors.txt create mode 100755 extra/xml/errors/authors.txt create mode 100755 extra/xml/generator/authors.txt create mode 100755 extra/xml/test/authors.txt create mode 100755 extra/xml/tokenize/authors.txt create mode 100755 extra/xml/utilities/authors.txt create mode 100755 extra/xml/writer/authors.txt create mode 100755 extra/xmode/catalog/authors.txt create mode 100755 extra/xmode/code2html/authors.txt create mode 100755 extra/xmode/keyword-map/authors.txt create mode 100755 extra/xmode/loader/authors.txt create mode 100755 extra/xmode/loader/syntax/authors.txt create mode 100755 extra/xmode/marker/authors.txt create mode 100755 extra/xmode/marker/context/authors.txt create mode 100755 extra/xmode/marker/state/authors.txt create mode 100755 extra/xmode/rules/authors.txt create mode 100755 extra/xmode/tokens/authors.txt create mode 100755 extra/xmode/utilities/authors.txt diff --git a/core/compiler/constants/authors.txt b/core/compiler/constants/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/core/compiler/constants/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/core/compiler/constants/summary.txt b/core/compiler/constants/summary.txt new file mode 100755 index 0000000000..bf51e9a486 --- /dev/null +++ b/core/compiler/constants/summary.txt @@ -0,0 +1 @@ +VM memory layout constants diff --git a/core/compiler/errors/authors.txt b/core/compiler/errors/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/core/compiler/errors/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/core/compiler/errors/summary.txt b/core/compiler/errors/summary.txt new file mode 100755 index 0000000000..01d106bcad --- /dev/null +++ b/core/compiler/errors/summary.txt @@ -0,0 +1 @@ +Compiler warning and error reporting diff --git a/core/compiler/units/authors.txt b/core/compiler/units/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/core/compiler/units/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/core/compiler/units/summary.txt b/core/compiler/units/summary.txt new file mode 100755 index 0000000000..3e989e8901 --- /dev/null +++ b/core/compiler/units/summary.txt @@ -0,0 +1 @@ +Compilation units group word definitions for compilation diff --git a/core/cpu/arm/allot/authors.txt b/core/cpu/arm/allot/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/core/cpu/arm/allot/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/core/cpu/arm/architecture/authors.txt b/core/cpu/arm/architecture/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/core/cpu/arm/architecture/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/core/cpu/arm/assembler/authors.txt b/core/cpu/arm/assembler/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/core/cpu/arm/assembler/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/core/cpu/arm/intrinsics/authors.txt b/core/cpu/arm/intrinsics/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/core/cpu/arm/intrinsics/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/core/cpu/ppc/intrinsics/authors.txt b/core/cpu/ppc/intrinsics/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/core/cpu/ppc/intrinsics/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/core/cpu/x86/32/authors.txt b/core/cpu/x86/32/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/core/cpu/x86/32/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/core/cpu/x86/allot/authors.txt b/core/cpu/x86/allot/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/core/cpu/x86/allot/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/core/cpu/x86/architecture/authors.txt b/core/cpu/x86/architecture/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/core/cpu/x86/architecture/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/core/cpu/x86/assembler/authors.txt b/core/cpu/x86/assembler/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/core/cpu/x86/assembler/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/core/cpu/x86/intrinsics/authors.txt b/core/cpu/x86/intrinsics/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/core/cpu/x86/intrinsics/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/core/float-arrays/authors.txt b/core/float-arrays/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/core/float-arrays/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/core/heaps/authors.txt b/core/heaps/authors.txt new file mode 100755 index 0000000000..1229a590fa --- /dev/null +++ b/core/heaps/authors.txt @@ -0,0 +1,2 @@ +Doug Coleman +Ryan Murphy diff --git a/core/heaps/summary.txt b/core/heaps/summary.txt new file mode 100755 index 0000000000..afed9806ab --- /dev/null +++ b/core/heaps/summary.txt @@ -0,0 +1 @@ +Maxheap and minheap implementations of priority queues diff --git a/core/inference/state/authors.txt b/core/inference/state/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/core/inference/state/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/core/inference/state/summary.txt b/core/inference/state/summary.txt new file mode 100755 index 0000000000..6b782f6e21 --- /dev/null +++ b/core/inference/state/summary.txt @@ -0,0 +1 @@ +Variables for holding stack effect inference state diff --git a/core/io/encodings/authors.txt b/core/io/encodings/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/core/io/encodings/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/core/io/encodings/summary.txt b/core/io/encodings/summary.txt new file mode 100755 index 0000000000..ae6a19b334 --- /dev/null +++ b/core/io/encodings/summary.txt @@ -0,0 +1 @@ +Common support for ASCII, UTF8 and UTF16 character encodings diff --git a/core/refs/authors.txt b/core/refs/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/core/refs/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/core/refs/summary.txt b/core/refs/summary.txt new file mode 100755 index 0000000000..a8a5a4a119 --- /dev/null +++ b/core/refs/summary.txt @@ -0,0 +1 @@ +References to keys and values in assocs diff --git a/extra/alarms/authors.txt b/extra/alarms/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/alarms/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/arrays/lib/authors.txt b/extra/arrays/lib/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/arrays/lib/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/asn1/ldap/authors.txt b/extra/asn1/ldap/authors.txt new file mode 100755 index 0000000000..7c29e7c401 --- /dev/null +++ b/extra/asn1/ldap/authors.txt @@ -0,0 +1 @@ +Elie Chaftari diff --git a/extra/assoc-heaps/authors.txt b/extra/assoc-heaps/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/assoc-heaps/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/assoc-heaps/summary.txt b/extra/assoc-heaps/summary.txt new file mode 100755 index 0000000000..07ae2e33f8 --- /dev/null +++ b/extra/assoc-heaps/summary.txt @@ -0,0 +1 @@ +Priority search queues diff --git a/extra/automata/ui/authors.txt b/extra/automata/ui/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/automata/ui/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/benchmark/bootstrap1/authors.txt b/extra/benchmark/bootstrap1/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/benchmark/bootstrap1/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/benchmark/bootstrap2/authors.txt b/extra/benchmark/bootstrap2/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/benchmark/bootstrap2/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/benchmark/continuations/authors.txt b/extra/benchmark/continuations/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/benchmark/continuations/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/benchmark/dispatch1/authors.txt b/extra/benchmark/dispatch1/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/benchmark/dispatch1/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/benchmark/dispatch2/authors.txt b/extra/benchmark/dispatch2/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/benchmark/dispatch2/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/benchmark/dispatch3/authors.txt b/extra/benchmark/dispatch3/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/benchmark/dispatch3/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/benchmark/dispatch4/authors.txt b/extra/benchmark/dispatch4/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/benchmark/dispatch4/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/benchmark/empty-loop/authors.txt b/extra/benchmark/empty-loop/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/benchmark/empty-loop/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/benchmark/fib1/authors.txt b/extra/benchmark/fib1/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/benchmark/fib1/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/benchmark/fib2/authors.txt b/extra/benchmark/fib2/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/benchmark/fib2/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/benchmark/fib3/authors.txt b/extra/benchmark/fib3/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/benchmark/fib3/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/benchmark/fib4/authors.txt b/extra/benchmark/fib4/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/benchmark/fib4/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/benchmark/fib5/authors.txt b/extra/benchmark/fib5/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/benchmark/fib5/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/benchmark/iteration/authors.txt b/extra/benchmark/iteration/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/benchmark/iteration/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/benchmark/mandel/authors.txt b/extra/benchmark/mandel/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/benchmark/mandel/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/benchmark/nsieve-bits/authors.txt b/extra/benchmark/nsieve-bits/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/benchmark/nsieve-bits/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/benchmark/nsieve/authors.txt b/extra/benchmark/nsieve/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/benchmark/nsieve/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/benchmark/partial-sums/authors.txt b/extra/benchmark/partial-sums/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/benchmark/partial-sums/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/benchmark/raytracer/authors.txt b/extra/benchmark/raytracer/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/benchmark/raytracer/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/benchmark/recursive/authors.txt b/extra/benchmark/recursive/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/benchmark/recursive/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/benchmark/reverse-complement/authors.txt b/extra/benchmark/reverse-complement/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/benchmark/reverse-complement/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/benchmark/ring/authors.txt b/extra/benchmark/ring/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/benchmark/ring/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/benchmark/sha1/authors.txt b/extra/benchmark/sha1/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/benchmark/sha1/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/benchmark/sort/authors.txt b/extra/benchmark/sort/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/benchmark/sort/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/benchmark/spectral-norm/authors.txt b/extra/benchmark/spectral-norm/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/benchmark/spectral-norm/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/benchmark/sum-file/authors.txt b/extra/benchmark/sum-file/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/benchmark/sum-file/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/benchmark/typecheck1/authors.txt b/extra/benchmark/typecheck1/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/benchmark/typecheck1/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/benchmark/typecheck2/authors.txt b/extra/benchmark/typecheck2/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/benchmark/typecheck2/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/benchmark/typecheck3/authors.txt b/extra/benchmark/typecheck3/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/benchmark/typecheck3/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/benchmark/typecheck4/authors.txt b/extra/benchmark/typecheck4/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/benchmark/typecheck4/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/boids/ui/authors.txt b/extra/boids/ui/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/boids/ui/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/cairo-demo/authors.txt b/extra/cairo-demo/authors.txt new file mode 100755 index 0000000000..4a2736dd93 --- /dev/null +++ b/extra/cairo-demo/authors.txt @@ -0,0 +1 @@ +Sampo Vuori diff --git a/extra/calendar/backend/authors.txt b/extra/calendar/backend/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/calendar/backend/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/calendar/unix/authors.txt b/extra/calendar/unix/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/calendar/unix/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/calendar/windows/authors.txt b/extra/calendar/windows/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/calendar/windows/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/cfdg/gl/authors.txt b/extra/cfdg/gl/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/cfdg/gl/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/cfdg/models/aqua-star/authors.txt b/extra/cfdg/models/aqua-star/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/cfdg/models/aqua-star/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/cfdg/models/chiaroscuro/authors.txt b/extra/cfdg/models/chiaroscuro/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/cfdg/models/chiaroscuro/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/cfdg/models/flower6/authors.txt b/extra/cfdg/models/flower6/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/cfdg/models/flower6/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/cfdg/models/game1-turn6/authors.txt b/extra/cfdg/models/game1-turn6/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/cfdg/models/game1-turn6/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/cfdg/models/lesson/authors.txt b/extra/cfdg/models/lesson/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/cfdg/models/lesson/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/cfdg/models/sierpinski/authors.txt b/extra/cfdg/models/sierpinski/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/cfdg/models/sierpinski/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/cfdg/models/snowflake/authors.txt b/extra/cfdg/models/snowflake/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/cfdg/models/snowflake/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/cocoa/plists/authors.txt b/extra/cocoa/plists/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/cocoa/plists/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/colors/hsv/authors.txt b/extra/colors/hsv/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/colors/hsv/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/combinators/cleave/authors.txt b/extra/combinators/cleave/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/combinators/cleave/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/combinators/lib/authors.txt b/extra/combinators/lib/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/combinators/lib/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/contributors/summary.txt b/extra/contributors/summary.txt index ca6fc06710..f0b8e5b603 100644 --- a/extra/contributors/summary.txt +++ b/extra/contributors/summary.txt @@ -1 +1 @@ -Contributor patch count tally from darcs demo +Contributor patch counts from git diff --git a/extra/crypto/barrett/authors.txt b/extra/crypto/barrett/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/crypto/barrett/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/crypto/common/authors.txt b/extra/crypto/common/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/crypto/common/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/crypto/hmac/authors.txt b/extra/crypto/hmac/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/crypto/hmac/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/crypto/md5/authors.txt b/extra/crypto/md5/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/crypto/md5/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/crypto/rc4/authors.txt b/extra/crypto/rc4/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/crypto/rc4/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/crypto/rsa/authors.txt b/extra/crypto/rsa/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/crypto/rsa/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/crypto/sha1/authors.txt b/extra/crypto/sha1/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/crypto/sha1/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/crypto/sha2/authors.txt b/extra/crypto/sha2/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/crypto/sha2/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/crypto/timing/authors.txt b/extra/crypto/timing/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/crypto/timing/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/crypto/xor/authors.txt b/extra/crypto/xor/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/crypto/xor/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/delegate/authors.txt b/extra/delegate/authors.txt new file mode 100755 index 0000000000..f990dd0ed2 --- /dev/null +++ b/extra/delegate/authors.txt @@ -0,0 +1 @@ +Daniel Ehrenberg diff --git a/extra/delegate/protocols/authors.txt b/extra/delegate/protocols/authors.txt new file mode 100755 index 0000000000..f990dd0ed2 --- /dev/null +++ b/extra/delegate/protocols/authors.txt @@ -0,0 +1 @@ +Daniel Ehrenberg diff --git a/extra/editors/gvim/backend/authors.txt b/extra/editors/gvim/backend/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/editors/gvim/backend/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/editors/gvim/unix/authors.txt b/extra/editors/gvim/unix/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/editors/gvim/unix/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/editors/gvim/windows/authors.txt b/extra/editors/gvim/windows/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/editors/gvim/windows/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/factory/commands/authors.txt b/extra/factory/commands/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/factory/commands/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/factory/load/authors.txt b/extra/factory/load/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/factory/load/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/faq/authors.txt b/extra/faq/authors.txt new file mode 100755 index 0000000000..f990dd0ed2 --- /dev/null +++ b/extra/faq/authors.txt @@ -0,0 +1 @@ +Daniel Ehrenberg diff --git a/extra/faq/summary.txt b/extra/faq/summary.txt new file mode 100755 index 0000000000..c33f8cffeb --- /dev/null +++ b/extra/faq/summary.txt @@ -0,0 +1 @@ +The Factor FAQ diff --git a/extra/furnace/sessions/authors.txt b/extra/furnace/sessions/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/furnace/sessions/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/furnace/summary.txt b/extra/furnace/summary.txt new file mode 100755 index 0000000000..5696506f79 --- /dev/null +++ b/extra/furnace/summary.txt @@ -0,0 +1 @@ +Action-based web framework diff --git a/extra/furnace/validator/authors.txt b/extra/furnace/validator/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/furnace/validator/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/generic/lib/authors.txt b/extra/generic/lib/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/generic/lib/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/geom/dim/authors.txt b/extra/geom/dim/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/geom/dim/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/geom/pos/authors.txt b/extra/geom/pos/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/geom/pos/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/geom/rect/authors.txt b/extra/geom/rect/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/geom/rect/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/graphics/bitmap/authors.txt b/extra/graphics/bitmap/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/graphics/bitmap/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/graphics/viewer/authors.txt b/extra/graphics/viewer/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/graphics/viewer/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/hardware-info/backend/authors.txt b/extra/hardware-info/backend/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/hardware-info/backend/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/hardware-info/linux/authors.txt b/extra/hardware-info/linux/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/hardware-info/linux/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/hardware-info/macosx/authors.txt b/extra/hardware-info/macosx/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/hardware-info/macosx/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/hardware-info/windows/authors.txt b/extra/hardware-info/windows/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/hardware-info/windows/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/hardware-info/windows/ce/authors.txt b/extra/hardware-info/windows/ce/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/hardware-info/windows/ce/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/hardware-info/windows/nt/authors.txt b/extra/hardware-info/windows/nt/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/hardware-info/windows/nt/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/help/cookbook/authors.txt b/extra/help/cookbook/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/help/cookbook/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/help/tutorial/authors.txt b/extra/help/tutorial/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/help/tutorial/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/html/elements/authors.txt b/extra/html/elements/authors.txt new file mode 100755 index 0000000000..a8fb961d36 --- /dev/null +++ b/extra/html/elements/authors.txt @@ -0,0 +1,2 @@ +Chris Double +Slava Pestov diff --git a/extra/html/parser/analyzer/authors.txt b/extra/html/parser/analyzer/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/html/parser/analyzer/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/html/parser/authors.txt b/extra/html/parser/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/html/parser/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/html/parser/printer/authors.txt b/extra/html/parser/printer/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/html/parser/printer/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/html/parser/utils/authors.txt b/extra/html/parser/utils/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/html/parser/utils/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/http/mime/authors.txt b/extra/http/mime/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/http/mime/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/http/server/authors.txt b/extra/http/server/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/http/server/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/http/server/responders/authors.txt b/extra/http/server/responders/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/http/server/responders/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/inverse/summary.txt b/extra/inverse/summary.txt new file mode 100755 index 0000000000..77e8f77495 --- /dev/null +++ b/extra/inverse/summary.txt @@ -0,0 +1 @@ +Invertible quotations diff --git a/extra/io/mmap/authors.txt b/extra/io/mmap/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/io/mmap/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/io/mmap/summary.txt b/extra/io/mmap/summary.txt new file mode 100755 index 0000000000..07d36c45be --- /dev/null +++ b/extra/io/mmap/summary.txt @@ -0,0 +1 @@ +Memory-mapped files diff --git a/extra/io/monitor/authors.txt b/extra/io/monitor/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/io/monitor/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/io/monitor/summary.txt b/extra/io/monitor/summary.txt new file mode 100755 index 0000000000..96d49e5ec8 --- /dev/null +++ b/extra/io/monitor/summary.txt @@ -0,0 +1 @@ +File alteration monitoring diff --git a/extra/io/paths/authors.txt b/extra/io/paths/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/io/paths/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/io/server/authors.txt b/extra/io/server/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/io/server/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/io/sniffer/authors.txt b/extra/io/sniffer/authors.txt new file mode 100755 index 0000000000..7a1ef51c6f --- /dev/null +++ b/extra/io/sniffer/authors.txt @@ -0,0 +1,2 @@ +Doug Coleman +Elie Chaftari diff --git a/extra/io/sniffer/backend/authors.txt b/extra/io/sniffer/backend/authors.txt new file mode 100755 index 0000000000..7a1ef51c6f --- /dev/null +++ b/extra/io/sniffer/backend/authors.txt @@ -0,0 +1,2 @@ +Doug Coleman +Elie Chaftari diff --git a/extra/io/sniffer/bsd/authors.txt b/extra/io/sniffer/bsd/authors.txt new file mode 100755 index 0000000000..7a1ef51c6f --- /dev/null +++ b/extra/io/sniffer/bsd/authors.txt @@ -0,0 +1,2 @@ +Doug Coleman +Elie Chaftari diff --git a/extra/io/sniffer/filter/authors.txt b/extra/io/sniffer/filter/authors.txt new file mode 100755 index 0000000000..7a1ef51c6f --- /dev/null +++ b/extra/io/sniffer/filter/authors.txt @@ -0,0 +1,2 @@ +Doug Coleman +Elie Chaftari diff --git a/extra/io/sniffer/filter/backend/authors.txt b/extra/io/sniffer/filter/backend/authors.txt new file mode 100755 index 0000000000..7a1ef51c6f --- /dev/null +++ b/extra/io/sniffer/filter/backend/authors.txt @@ -0,0 +1,2 @@ +Doug Coleman +Elie Chaftari diff --git a/extra/io/sniffer/filter/bsd/authors.txt b/extra/io/sniffer/filter/bsd/authors.txt new file mode 100755 index 0000000000..7a1ef51c6f --- /dev/null +++ b/extra/io/sniffer/filter/bsd/authors.txt @@ -0,0 +1,2 @@ +Doug Coleman +Elie Chaftari diff --git a/extra/io/sockets/headers/authors.txt b/extra/io/sockets/headers/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/io/sockets/headers/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/io/sockets/headers/bsd/authors.txt b/extra/io/sockets/headers/bsd/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/io/sockets/headers/bsd/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/io/sockets/impl/authors.txt b/extra/io/sockets/impl/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/io/sockets/impl/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/io/streams/null/authors.txt b/extra/io/streams/null/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/io/streams/null/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/io/unix/bsd/authors.txt b/extra/io/unix/bsd/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/io/unix/bsd/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/io/unix/epoll/authors.txt b/extra/io/unix/epoll/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/io/unix/epoll/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/io/unix/kqueue/authors.txt b/extra/io/unix/kqueue/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/io/unix/kqueue/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/io/unix/launcher/authors.txt b/extra/io/unix/launcher/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/io/unix/launcher/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/io/unix/linux/authors.txt b/extra/io/unix/linux/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/io/unix/linux/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/io/unix/mmap/authors.txt b/extra/io/unix/mmap/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/io/unix/mmap/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/io/unix/select/authors.txt b/extra/io/unix/select/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/io/unix/select/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/io/windows/ce/backend/authors.txt b/extra/io/windows/ce/backend/authors.txt new file mode 100755 index 0000000000..026f4cd0de --- /dev/null +++ b/extra/io/windows/ce/backend/authors.txt @@ -0,0 +1,3 @@ +Doug Coleman +Slava Pestov +Mackenzie Straight diff --git a/extra/io/windows/ce/files/authors.txt b/extra/io/windows/ce/files/authors.txt new file mode 100755 index 0000000000..5674120196 --- /dev/null +++ b/extra/io/windows/ce/files/authors.txt @@ -0,0 +1,2 @@ +Doug Coleman +Slava Pestov diff --git a/extra/io/windows/ce/sockets/authors.txt b/extra/io/windows/ce/sockets/authors.txt new file mode 100755 index 0000000000..5674120196 --- /dev/null +++ b/extra/io/windows/ce/sockets/authors.txt @@ -0,0 +1,2 @@ +Doug Coleman +Slava Pestov diff --git a/extra/io/windows/launcher/authors.txt b/extra/io/windows/launcher/authors.txt new file mode 100755 index 0000000000..5674120196 --- /dev/null +++ b/extra/io/windows/launcher/authors.txt @@ -0,0 +1,2 @@ +Doug Coleman +Slava Pestov diff --git a/extra/io/windows/mmap/authors.txt b/extra/io/windows/mmap/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/io/windows/mmap/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/io/windows/nt/backend/authors.txt b/extra/io/windows/nt/backend/authors.txt new file mode 100755 index 0000000000..026f4cd0de --- /dev/null +++ b/extra/io/windows/nt/backend/authors.txt @@ -0,0 +1,3 @@ +Doug Coleman +Slava Pestov +Mackenzie Straight diff --git a/extra/io/windows/nt/files/authors.txt b/extra/io/windows/nt/files/authors.txt new file mode 100755 index 0000000000..026f4cd0de --- /dev/null +++ b/extra/io/windows/nt/files/authors.txt @@ -0,0 +1,3 @@ +Doug Coleman +Slava Pestov +Mackenzie Straight diff --git a/extra/io/windows/nt/launcher/authors.txt b/extra/io/windows/nt/launcher/authors.txt new file mode 100755 index 0000000000..026f4cd0de --- /dev/null +++ b/extra/io/windows/nt/launcher/authors.txt @@ -0,0 +1,3 @@ +Doug Coleman +Slava Pestov +Mackenzie Straight diff --git a/extra/io/windows/nt/monitor/authors.txt b/extra/io/windows/nt/monitor/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/io/windows/nt/monitor/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/io/windows/nt/sockets/authors.txt b/extra/io/windows/nt/sockets/authors.txt new file mode 100755 index 0000000000..026f4cd0de --- /dev/null +++ b/extra/io/windows/nt/sockets/authors.txt @@ -0,0 +1,3 @@ +Doug Coleman +Slava Pestov +Mackenzie Straight diff --git a/extra/io/windows/pipes/authors.txt b/extra/io/windows/pipes/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/io/windows/pipes/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/jamshred/authors.txt b/extra/jamshred/authors.txt new file mode 100755 index 0000000000..e9c193bac7 --- /dev/null +++ b/extra/jamshred/authors.txt @@ -0,0 +1 @@ +Alex Chapman diff --git a/extra/jamshred/game/authors.txt b/extra/jamshred/game/authors.txt new file mode 100755 index 0000000000..e9c193bac7 --- /dev/null +++ b/extra/jamshred/game/authors.txt @@ -0,0 +1 @@ +Alex Chapman diff --git a/extra/jamshred/gl/authors.txt b/extra/jamshred/gl/authors.txt new file mode 100755 index 0000000000..e9c193bac7 --- /dev/null +++ b/extra/jamshred/gl/authors.txt @@ -0,0 +1 @@ +Alex Chapman diff --git a/extra/jamshred/oint/authors.txt b/extra/jamshred/oint/authors.txt new file mode 100755 index 0000000000..e9c193bac7 --- /dev/null +++ b/extra/jamshred/oint/authors.txt @@ -0,0 +1 @@ +Alex Chapman diff --git a/extra/jamshred/player/authors.txt b/extra/jamshred/player/authors.txt new file mode 100755 index 0000000000..e9c193bac7 --- /dev/null +++ b/extra/jamshred/player/authors.txt @@ -0,0 +1 @@ +Alex Chapman diff --git a/extra/jamshred/tunnel/authors.txt b/extra/jamshred/tunnel/authors.txt new file mode 100755 index 0000000000..e9c193bac7 --- /dev/null +++ b/extra/jamshred/tunnel/authors.txt @@ -0,0 +1 @@ +Alex Chapman diff --git a/extra/json/authors.txt b/extra/json/authors.txt new file mode 100755 index 0000000000..44b06f94bc --- /dev/null +++ b/extra/json/authors.txt @@ -0,0 +1 @@ +Chris Double diff --git a/extra/json/summary.txt b/extra/json/summary.txt new file mode 100755 index 0000000000..33c7c9780c --- /dev/null +++ b/extra/json/summary.txt @@ -0,0 +1 @@ +JSON reader and writer diff --git a/extra/koszul/authors.txt b/extra/koszul/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/koszul/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/koszul/summary.txt b/extra/koszul/summary.txt new file mode 100755 index 0000000000..33ad2754b8 --- /dev/null +++ b/extra/koszul/summary.txt @@ -0,0 +1 @@ +Lie algebra cohomology diff --git a/extra/lazy-lists/examples/authors.txt b/extra/lazy-lists/examples/authors.txt new file mode 100755 index 0000000000..44b06f94bc --- /dev/null +++ b/extra/lazy-lists/examples/authors.txt @@ -0,0 +1 @@ +Chris Double diff --git a/extra/ldap/libldap/authors.txt b/extra/ldap/libldap/authors.txt new file mode 100755 index 0000000000..7c29e7c401 --- /dev/null +++ b/extra/ldap/libldap/authors.txt @@ -0,0 +1 @@ +Elie Chaftari diff --git a/extra/lint/summary.txt b/extra/lint/summary.txt new file mode 100755 index 0000000000..943869d7d2 --- /dev/null +++ b/extra/lint/summary.txt @@ -0,0 +1 @@ +Finds potential mistakes in code diff --git a/extra/lsys/strings/authors.txt b/extra/lsys/strings/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/lsys/strings/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/lsys/strings/interpret/authors.txt b/extra/lsys/strings/interpret/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/lsys/strings/interpret/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/lsys/strings/rewrite/authors.txt b/extra/lsys/strings/rewrite/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/lsys/strings/rewrite/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/lsys/tortoise/authors.txt b/extra/lsys/tortoise/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/lsys/tortoise/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/lsys/tortoise/graphics/authors.txt b/extra/lsys/tortoise/graphics/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/lsys/tortoise/graphics/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/lsys/ui/authors.txt b/extra/lsys/ui/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/lsys/ui/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/macros/zoo/authors.txt b/extra/macros/zoo/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/macros/zoo/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/mad/api/authors.txt b/extra/mad/api/authors.txt new file mode 100755 index 0000000000..bbc876e7b6 --- /dev/null +++ b/extra/mad/api/authors.txt @@ -0,0 +1 @@ +Adam Wendt diff --git a/extra/mad/player/authors.txt b/extra/mad/player/authors.txt new file mode 100755 index 0000000000..bbc876e7b6 --- /dev/null +++ b/extra/mad/player/authors.txt @@ -0,0 +1 @@ +Adam Wendt diff --git a/extra/math/miller-rabin/authors.txt b/extra/math/miller-rabin/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/math/miller-rabin/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/math/primes/list/authors.txt b/extra/math/primes/list/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/math/primes/list/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/nehe/2/authors.txt b/extra/nehe/2/authors.txt new file mode 100755 index 0000000000..44b06f94bc --- /dev/null +++ b/extra/nehe/2/authors.txt @@ -0,0 +1 @@ +Chris Double diff --git a/extra/nehe/3/authors.txt b/extra/nehe/3/authors.txt new file mode 100755 index 0000000000..44b06f94bc --- /dev/null +++ b/extra/nehe/3/authors.txt @@ -0,0 +1 @@ +Chris Double diff --git a/extra/nehe/4/authors.txt b/extra/nehe/4/authors.txt new file mode 100755 index 0000000000..44b06f94bc --- /dev/null +++ b/extra/nehe/4/authors.txt @@ -0,0 +1 @@ +Chris Double diff --git a/extra/nehe/5/authors.txt b/extra/nehe/5/authors.txt new file mode 100755 index 0000000000..44b06f94bc --- /dev/null +++ b/extra/nehe/5/authors.txt @@ -0,0 +1 @@ +Chris Double diff --git a/extra/network-clipboard/authors.txt b/extra/network-clipboard/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/network-clipboard/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/new-slots/authors.txt b/extra/new-slots/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/new-slots/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/openal/backend/authors.txt b/extra/openal/backend/authors.txt new file mode 100755 index 0000000000..44b06f94bc --- /dev/null +++ b/extra/openal/backend/authors.txt @@ -0,0 +1 @@ +Chris Double diff --git a/extra/openal/example/authors.txt b/extra/openal/example/authors.txt new file mode 100755 index 0000000000..44b06f94bc --- /dev/null +++ b/extra/openal/example/authors.txt @@ -0,0 +1 @@ +Chris Double diff --git a/extra/openal/macosx/authors.txt b/extra/openal/macosx/authors.txt new file mode 100755 index 0000000000..44b06f94bc --- /dev/null +++ b/extra/openal/macosx/authors.txt @@ -0,0 +1 @@ +Chris Double diff --git a/extra/openal/other/authors.txt b/extra/openal/other/authors.txt new file mode 100755 index 0000000000..44b06f94bc --- /dev/null +++ b/extra/openal/other/authors.txt @@ -0,0 +1 @@ +Chris Double diff --git a/extra/opengl/camera/authors.txt b/extra/opengl/camera/authors.txt new file mode 100755 index 0000000000..bbc876e7b6 --- /dev/null +++ b/extra/opengl/camera/authors.txt @@ -0,0 +1 @@ +Adam Wendt diff --git a/extra/opengl/gl/unix/authors.txt b/extra/opengl/gl/unix/authors.txt new file mode 100755 index 0000000000..f13c9c1e77 --- /dev/null +++ b/extra/opengl/gl/unix/authors.txt @@ -0,0 +1 @@ +Joe Groff diff --git a/extra/opengl/gl/windows/authors.txt b/extra/opengl/gl/windows/authors.txt new file mode 100755 index 0000000000..f13c9c1e77 --- /dev/null +++ b/extra/opengl/gl/windows/authors.txt @@ -0,0 +1 @@ +Joe Groff diff --git a/extra/openssl/summary.txt b/extra/openssl/summary.txt new file mode 100755 index 0000000000..42db29f294 --- /dev/null +++ b/extra/openssl/summary.txt @@ -0,0 +1 @@ +OpenSSL binding diff --git a/extra/optimizer/debugger/authors.txt b/extra/optimizer/debugger/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/optimizer/debugger/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/oracle/liboci/authors.txt b/extra/oracle/liboci/authors.txt new file mode 100755 index 0000000000..7c29e7c401 --- /dev/null +++ b/extra/oracle/liboci/authors.txt @@ -0,0 +1 @@ +Elie Chaftari diff --git a/extra/random-tester/authors.txt b/extra/random-tester/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/random-tester/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/random-tester/databank/authors.txt b/extra/random-tester/databank/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/random-tester/databank/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/random-tester/random/authors.txt b/extra/random-tester/random/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/random-tester/random/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/random-tester/safe-words/authors.txt b/extra/random-tester/safe-words/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/random-tester/safe-words/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/random-tester/utils/authors.txt b/extra/random-tester/utils/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/random-tester/utils/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/raptor/authors.txt b/extra/raptor/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/raptor/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/raptor/cron/authors.txt b/extra/raptor/cron/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/raptor/cron/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/regexp/authors.txt b/extra/regexp/authors.txt new file mode 100755 index 0000000000..5674120196 --- /dev/null +++ b/extra/regexp/authors.txt @@ -0,0 +1,2 @@ +Doug Coleman +Slava Pestov diff --git a/extra/rss/authors.txt b/extra/rss/authors.txt new file mode 100755 index 0000000000..f990dd0ed2 --- /dev/null +++ b/extra/rss/authors.txt @@ -0,0 +1 @@ +Daniel Ehrenberg diff --git a/extra/rss/summary.txt b/extra/rss/summary.txt new file mode 100755 index 0000000000..b65787ab67 --- /dev/null +++ b/extra/rss/summary.txt @@ -0,0 +1 @@ +RSS 1.0, 2.0 and Atom feed parser diff --git a/extra/slides/summary.txt b/extra/slides/summary.txt new file mode 100755 index 0000000000..c3be28003e --- /dev/null +++ b/extra/slides/summary.txt @@ -0,0 +1 @@ +Bare-bones tools for giving presentations and demonstrations with the Factor UI diff --git a/extra/springies/models/2snake/authors.txt b/extra/springies/models/2snake/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/springies/models/2snake/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/springies/models/2x2snake/authors.txt b/extra/springies/models/2x2snake/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/springies/models/2x2snake/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/springies/models/3snake/authors.txt b/extra/springies/models/3snake/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/springies/models/3snake/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/springies/models/ball/authors.txt b/extra/springies/models/ball/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/springies/models/ball/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/springies/models/belt-tire/authors.txt b/extra/springies/models/belt-tire/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/springies/models/belt-tire/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/springies/models/nifty/authors.txt b/extra/springies/models/nifty/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/springies/models/nifty/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/springies/models/urchin/authors.txt b/extra/springies/models/urchin/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/springies/models/urchin/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/springies/ui/authors.txt b/extra/springies/ui/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/springies/ui/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/sqlite/authors.txt b/extra/sqlite/authors.txt new file mode 100755 index 0000000000..44b06f94bc --- /dev/null +++ b/extra/sqlite/authors.txt @@ -0,0 +1 @@ +Chris Double diff --git a/extra/sqlite/lib/authors.txt b/extra/sqlite/lib/authors.txt new file mode 100755 index 0000000000..44b06f94bc --- /dev/null +++ b/extra/sqlite/lib/authors.txt @@ -0,0 +1 @@ +Chris Double diff --git a/extra/sqlite/tuple-db/authors.txt b/extra/sqlite/tuple-db/authors.txt new file mode 100755 index 0000000000..44b06f94bc --- /dev/null +++ b/extra/sqlite/tuple-db/authors.txt @@ -0,0 +1 @@ +Chris Double diff --git a/extra/state-machine/authors.txt b/extra/state-machine/authors.txt new file mode 100755 index 0000000000..f990dd0ed2 --- /dev/null +++ b/extra/state-machine/authors.txt @@ -0,0 +1 @@ +Daniel Ehrenberg diff --git a/extra/store/blob/authors.txt b/extra/store/blob/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/store/blob/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/strings/lib/authors.txt b/extra/strings/lib/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/strings/lib/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/structs/authors.txt b/extra/structs/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/structs/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/tar/authors.txt b/extra/tar/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/tar/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/tetris/board/authors.txt b/extra/tetris/board/authors.txt new file mode 100755 index 0000000000..e9c193bac7 --- /dev/null +++ b/extra/tetris/board/authors.txt @@ -0,0 +1 @@ +Alex Chapman diff --git a/extra/tetris/game/authors.txt b/extra/tetris/game/authors.txt new file mode 100755 index 0000000000..e9c193bac7 --- /dev/null +++ b/extra/tetris/game/authors.txt @@ -0,0 +1 @@ +Alex Chapman diff --git a/extra/tetris/gl/authors.txt b/extra/tetris/gl/authors.txt new file mode 100755 index 0000000000..e9c193bac7 --- /dev/null +++ b/extra/tetris/gl/authors.txt @@ -0,0 +1 @@ +Alex Chapman diff --git a/extra/tetris/piece/authors.txt b/extra/tetris/piece/authors.txt new file mode 100755 index 0000000000..e9c193bac7 --- /dev/null +++ b/extra/tetris/piece/authors.txt @@ -0,0 +1 @@ +Alex Chapman diff --git a/extra/tetris/tetromino/authors.txt b/extra/tetris/tetromino/authors.txt new file mode 100755 index 0000000000..e9c193bac7 --- /dev/null +++ b/extra/tetris/tetromino/authors.txt @@ -0,0 +1 @@ +Alex Chapman diff --git a/extra/tools/browser/authors.txt b/extra/tools/browser/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/tools/browser/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/tools/deploy/backend/authors.txt b/extra/tools/deploy/backend/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/tools/deploy/backend/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/tools/deploy/config/authors.txt b/extra/tools/deploy/config/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/tools/deploy/config/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/tools/deploy/macosx/authors.txt b/extra/tools/deploy/macosx/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/tools/deploy/macosx/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/tools/deploy/shaker/authors.txt b/extra/tools/deploy/shaker/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/tools/deploy/shaker/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/tools/deploy/windows/authors.txt b/extra/tools/deploy/windows/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/tools/deploy/windows/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/tools/interpreter/debug/authors.txt b/extra/tools/interpreter/debug/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/tools/interpreter/debug/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/tools/test/inference/authors.txt b/extra/tools/test/inference/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/tools/test/inference/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/tools/test/ui/authors.txt b/extra/tools/test/ui/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/tools/test/ui/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/ui/gadgets/canvas/authors.txt b/extra/ui/gadgets/canvas/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/ui/gadgets/canvas/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/ui/gadgets/handler/authors.txt b/extra/ui/gadgets/handler/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/ui/gadgets/handler/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/ui/gadgets/lib/authors.txt b/extra/ui/gadgets/lib/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/ui/gadgets/lib/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/ui/gadgets/slate/authors.txt b/extra/ui/gadgets/slate/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/ui/gadgets/slate/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/ui/tools/deploy/authors.txt b/extra/ui/tools/deploy/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/ui/tools/deploy/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/ui/windows/authors.txt b/extra/ui/windows/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/ui/windows/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/ui/x11/authors.txt b/extra/ui/x11/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/ui/x11/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/unicode/breaks/authors.txt b/extra/unicode/breaks/authors.txt new file mode 100755 index 0000000000..f990dd0ed2 --- /dev/null +++ b/extra/unicode/breaks/authors.txt @@ -0,0 +1 @@ +Daniel Ehrenberg diff --git a/extra/unicode/case/authors.txt b/extra/unicode/case/authors.txt new file mode 100755 index 0000000000..f990dd0ed2 --- /dev/null +++ b/extra/unicode/case/authors.txt @@ -0,0 +1 @@ +Daniel Ehrenberg diff --git a/extra/unicode/categories/authors.txt b/extra/unicode/categories/authors.txt new file mode 100755 index 0000000000..f990dd0ed2 --- /dev/null +++ b/extra/unicode/categories/authors.txt @@ -0,0 +1 @@ +Daniel Ehrenberg diff --git a/extra/unicode/data/authors.txt b/extra/unicode/data/authors.txt new file mode 100755 index 0000000000..f990dd0ed2 --- /dev/null +++ b/extra/unicode/data/authors.txt @@ -0,0 +1 @@ +Daniel Ehrenberg diff --git a/extra/unicode/normalize/authors.txt b/extra/unicode/normalize/authors.txt new file mode 100755 index 0000000000..f990dd0ed2 --- /dev/null +++ b/extra/unicode/normalize/authors.txt @@ -0,0 +1 @@ +Daniel Ehrenberg diff --git a/extra/unicode/syntax/authors.txt b/extra/unicode/syntax/authors.txt new file mode 100755 index 0000000000..f990dd0ed2 --- /dev/null +++ b/extra/unicode/syntax/authors.txt @@ -0,0 +1 @@ +Daniel Ehrenberg diff --git a/extra/units/authors.txt b/extra/units/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/units/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/units/constants/authors.txt b/extra/units/constants/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/units/constants/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/units/imperial/authors.txt b/extra/units/imperial/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/units/imperial/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/units/si/authors.txt b/extra/units/si/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/units/si/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/unix/kqueue/authors.txt b/extra/unix/kqueue/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/unix/kqueue/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/unix/linux/authors.txt b/extra/unix/linux/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/unix/linux/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/unix/linux/epoll/authors.txt b/extra/unix/linux/epoll/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/unix/linux/epoll/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/unix/linux/fs/authors.txt b/extra/unix/linux/fs/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/unix/linux/fs/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/unix/linux/if/authors.txt b/extra/unix/linux/if/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/unix/linux/if/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/unix/linux/ifreq/authors.txt b/extra/unix/linux/ifreq/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/unix/linux/ifreq/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/unix/linux/route/authors.txt b/extra/unix/linux/route/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/unix/linux/route/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/unix/linux/sockios/authors.txt b/extra/unix/linux/sockios/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/unix/linux/sockios/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/unix/linux/swap/authors.txt b/extra/unix/linux/swap/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/unix/linux/swap/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/unix/process/authors.txt b/extra/unix/process/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/unix/process/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/unix/solaris/authors.txt b/extra/unix/solaris/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/unix/solaris/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/webapps/article-manager/database/authors.txt b/extra/webapps/article-manager/database/authors.txt new file mode 100755 index 0000000000..44b06f94bc --- /dev/null +++ b/extra/webapps/article-manager/database/authors.txt @@ -0,0 +1 @@ +Chris Double diff --git a/extra/webapps/callback/authors.txt b/extra/webapps/callback/authors.txt new file mode 100755 index 0000000000..a8fb961d36 --- /dev/null +++ b/extra/webapps/callback/authors.txt @@ -0,0 +1,2 @@ +Chris Double +Slava Pestov diff --git a/extra/webapps/cgi/authors.txt b/extra/webapps/cgi/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/webapps/cgi/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/webapps/continuation/authors.txt b/extra/webapps/continuation/authors.txt new file mode 100755 index 0000000000..44b06f94bc --- /dev/null +++ b/extra/webapps/continuation/authors.txt @@ -0,0 +1 @@ +Chris Double diff --git a/extra/webapps/continuation/examples/authors.txt b/extra/webapps/continuation/examples/authors.txt new file mode 100755 index 0000000000..44b06f94bc --- /dev/null +++ b/extra/webapps/continuation/examples/authors.txt @@ -0,0 +1 @@ +Chris Double diff --git a/extra/webapps/file/authors.txt b/extra/webapps/file/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/webapps/file/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/webapps/help/authors.txt b/extra/webapps/help/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/webapps/help/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/webapps/numbers/authors.txt b/extra/webapps/numbers/authors.txt new file mode 100755 index 0000000000..44b06f94bc --- /dev/null +++ b/extra/webapps/numbers/authors.txt @@ -0,0 +1 @@ +Chris Double diff --git a/extra/webapps/pastebin/authors.txt b/extra/webapps/pastebin/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/webapps/pastebin/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/webapps/planet/authors.txt b/extra/webapps/planet/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/webapps/planet/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/webapps/source/authors.txt b/extra/webapps/source/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/webapps/source/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/windows/advapi32/authors.txt b/extra/windows/advapi32/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/windows/advapi32/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/windows/ce/authors.txt b/extra/windows/ce/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/windows/ce/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/windows/errors/authors.txt b/extra/windows/errors/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/windows/errors/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/windows/gdi32/authors.txt b/extra/windows/gdi32/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/windows/gdi32/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/windows/kernel32/authors.txt b/extra/windows/kernel32/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/windows/kernel32/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/windows/messages/authors.txt b/extra/windows/messages/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/windows/messages/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/windows/nt/authors.txt b/extra/windows/nt/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/windows/nt/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/windows/opengl32/authors.txt b/extra/windows/opengl32/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/windows/opengl32/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/windows/shell32/authors.txt b/extra/windows/shell32/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/windows/shell32/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/windows/time/authors.txt b/extra/windows/time/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/windows/time/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/windows/types/authors.txt b/extra/windows/types/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/windows/types/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/windows/user32/authors.txt b/extra/windows/user32/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/windows/user32/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/windows/winsock/authors.txt b/extra/windows/winsock/authors.txt new file mode 100755 index 0000000000..7c1b2f2279 --- /dev/null +++ b/extra/windows/winsock/authors.txt @@ -0,0 +1 @@ +Doug Coleman diff --git a/extra/x/font/authors.txt b/extra/x/font/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/x/font/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/x/gc/authors.txt b/extra/x/gc/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/x/gc/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/x/keysym-table/authors.txt b/extra/x/keysym-table/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/x/keysym-table/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/x/pen/authors.txt b/extra/x/pen/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/x/pen/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/x/widgets/authors.txt b/extra/x/widgets/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/x/widgets/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/x/widgets/button/authors.txt b/extra/x/widgets/button/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/x/widgets/button/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/x/widgets/keymenu/authors.txt b/extra/x/widgets/keymenu/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/x/widgets/keymenu/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/x/widgets/label/authors.txt b/extra/x/widgets/label/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/x/widgets/label/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/x/widgets/wm/child/authors.txt b/extra/x/widgets/wm/child/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/x/widgets/wm/child/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/x/widgets/wm/frame/authors.txt b/extra/x/widgets/wm/frame/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/x/widgets/wm/frame/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/x/widgets/wm/frame/drag/authors.txt b/extra/x/widgets/wm/frame/drag/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/x/widgets/wm/frame/drag/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/x/widgets/wm/frame/drag/move/authors.txt b/extra/x/widgets/wm/frame/drag/move/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/x/widgets/wm/frame/drag/move/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/x/widgets/wm/frame/drag/size/authors.txt b/extra/x/widgets/wm/frame/drag/size/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/x/widgets/wm/frame/drag/size/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/x/widgets/wm/menu/authors.txt b/extra/x/widgets/wm/menu/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/x/widgets/wm/menu/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/x/widgets/wm/root/authors.txt b/extra/x/widgets/wm/root/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/x/widgets/wm/root/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/x/widgets/wm/unmapped-frames-menu/authors.txt b/extra/x/widgets/wm/unmapped-frames-menu/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/x/widgets/wm/unmapped-frames-menu/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/x/widgets/wm/workspace/authors.txt b/extra/x/widgets/wm/workspace/authors.txt new file mode 100755 index 0000000000..6cfd5da273 --- /dev/null +++ b/extra/x/widgets/wm/workspace/authors.txt @@ -0,0 +1 @@ +Eduardo Cavazos diff --git a/extra/xml/char-classes/authors.txt b/extra/xml/char-classes/authors.txt new file mode 100755 index 0000000000..f990dd0ed2 --- /dev/null +++ b/extra/xml/char-classes/authors.txt @@ -0,0 +1 @@ +Daniel Ehrenberg diff --git a/extra/xml/data/authors.txt b/extra/xml/data/authors.txt new file mode 100755 index 0000000000..f990dd0ed2 --- /dev/null +++ b/extra/xml/data/authors.txt @@ -0,0 +1 @@ +Daniel Ehrenberg diff --git a/extra/xml/entities/authors.txt b/extra/xml/entities/authors.txt new file mode 100755 index 0000000000..f990dd0ed2 --- /dev/null +++ b/extra/xml/entities/authors.txt @@ -0,0 +1 @@ +Daniel Ehrenberg diff --git a/extra/xml/errors/authors.txt b/extra/xml/errors/authors.txt new file mode 100755 index 0000000000..f990dd0ed2 --- /dev/null +++ b/extra/xml/errors/authors.txt @@ -0,0 +1 @@ +Daniel Ehrenberg diff --git a/extra/xml/generator/authors.txt b/extra/xml/generator/authors.txt new file mode 100755 index 0000000000..f990dd0ed2 --- /dev/null +++ b/extra/xml/generator/authors.txt @@ -0,0 +1 @@ +Daniel Ehrenberg diff --git a/extra/xml/test/authors.txt b/extra/xml/test/authors.txt new file mode 100755 index 0000000000..f990dd0ed2 --- /dev/null +++ b/extra/xml/test/authors.txt @@ -0,0 +1 @@ +Daniel Ehrenberg diff --git a/extra/xml/tokenize/authors.txt b/extra/xml/tokenize/authors.txt new file mode 100755 index 0000000000..f990dd0ed2 --- /dev/null +++ b/extra/xml/tokenize/authors.txt @@ -0,0 +1 @@ +Daniel Ehrenberg diff --git a/extra/xml/utilities/authors.txt b/extra/xml/utilities/authors.txt new file mode 100755 index 0000000000..f990dd0ed2 --- /dev/null +++ b/extra/xml/utilities/authors.txt @@ -0,0 +1 @@ +Daniel Ehrenberg diff --git a/extra/xml/writer/authors.txt b/extra/xml/writer/authors.txt new file mode 100755 index 0000000000..f990dd0ed2 --- /dev/null +++ b/extra/xml/writer/authors.txt @@ -0,0 +1 @@ +Daniel Ehrenberg diff --git a/extra/xmode/catalog/authors.txt b/extra/xmode/catalog/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/xmode/catalog/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/xmode/code2html/authors.txt b/extra/xmode/code2html/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/xmode/code2html/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/xmode/keyword-map/authors.txt b/extra/xmode/keyword-map/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/xmode/keyword-map/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/xmode/loader/authors.txt b/extra/xmode/loader/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/xmode/loader/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/xmode/loader/syntax/authors.txt b/extra/xmode/loader/syntax/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/xmode/loader/syntax/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/xmode/marker/authors.txt b/extra/xmode/marker/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/xmode/marker/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/xmode/marker/context/authors.txt b/extra/xmode/marker/context/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/xmode/marker/context/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/xmode/marker/state/authors.txt b/extra/xmode/marker/state/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/xmode/marker/state/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/xmode/rules/authors.txt b/extra/xmode/rules/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/xmode/rules/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/xmode/tokens/authors.txt b/extra/xmode/tokens/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/xmode/tokens/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/extra/xmode/utilities/authors.txt b/extra/xmode/utilities/authors.txt new file mode 100755 index 0000000000..1901f27a24 --- /dev/null +++ b/extra/xmode/utilities/authors.txt @@ -0,0 +1 @@ +Slava Pestov From 11eca5b38a499e0cf8e21ff3a6f5dcdcd13a89ad Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sat, 26 Jan 2008 22:37:28 -0800 Subject: [PATCH 108/216] Documentation for new words in opengl vocab --- extra/line-art/line-art.factor | 4 +- extra/opengl/opengl-docs.factor | 70 ++++++++++++++++++++++++++++++++- extra/opengl/opengl.factor | 15 ++++--- 3 files changed, 79 insertions(+), 10 deletions(-) diff --git a/extra/line-art/line-art.factor b/extra/line-art/line-art.factor index 83f2a6a975..921c9e16d5 100644 --- a/extra/line-art/line-art.factor +++ b/extra/line-art/line-art.factor @@ -223,7 +223,7 @@ M: line-art-gadget draw-gadget* ( gadget -- ) line-art-draw-setup dup line-art-gadget-framebuffer [ line-art-clear-framebuffer - GL_COLOR_ATTACHMENT0_EXT GL_COLOR_ATTACHMENT1_EXT 2array set-draw-buffers + { GL_COLOR_ATTACHMENT0_EXT GL_COLOR_ATTACHMENT1_EXT } set-draw-buffers dup line-art-gadget-step1-program dup [ "color" glGetUniformLocation 0.6 0.5 0.5 1.0 glUniform4f 0.0 -0.12 0.0 glTranslatef @@ -239,7 +239,7 @@ M: line-art-gadget draw-gadget* ( gadget -- ) [ "normalmap" glGetUniformLocation 1 glUniform1i ] [ "depthmap" glGetUniformLocation 2 glUniform1i ] [ "line_color" glGetUniformLocation 0.2 0.0 0.0 1.0 glUniform4f ] } call-with - { -1.0 -1.0 } { 1.0 1.0 } draw-rectangle + { -1.0 -1.0 } { 1.0 1.0 } rect-vertices ] with-gl-program ; : line-art-window ( -- ) diff --git a/extra/opengl/opengl-docs.factor b/extra/opengl/opengl-docs.factor index 58b86f09b3..756507dace 100644 --- a/extra/opengl/opengl-docs.factor +++ b/extra/opengl/opengl-docs.factor @@ -37,6 +37,10 @@ HELP: gl-rect { $values { "loc" "a pair of integers" } { "ext" "a pair of integers" } } { $description "Draws the outline of a rectangle with top-left corner " { $snippet "loc" } " and bottom-right corner " { $snippet "ext" } "." } ; +HELP: rect-vertices +{ $values { "lower-left" "A pair of numbers indicating the lower-left coordinates of the rectangle." } { "upper-right" "The upper-right coordinates of the rectangle." } } +{ $description "Emits" { $link glVertex2d } " calls outlining the axis-aligned rectangle from " { $snippet "lower-left" } to { $snippet "upper-right" } " on the z=0 plane in counterclockwise order." } ; + HELP: gl-fill-poly { $values { "points" "a sequence of pairs of integers" } } { $description "Draws a filled polygon." } ; @@ -53,6 +57,58 @@ HELP: gen-texture { $values { "id" integer } } { $description "Wrapper for " { $link glGenTextures } " to handle the common case of generating a single texture ID." } ; +HELP: gen-framebuffer +{ $values { "id" integer } } +{ $description "Wrapper for " { $link glGenFramebuffersEXT } " to handle the common case of generating a single framebuffer ID." } ; + +HELP: gen-renderbuffer +{ $values { "id" integer } } +{ $description "Wrapper for " { $link glGenRenderbuffersEXT } " to handle the common case of generating a single render buffer ID." } ; + +HELP: gen-buffer +{ $values { "id" integer } } +{ $description "Wrapper for " { $link glGenBuffers } " to handle the common case of generating a single buffer ID." } ; + +HELP: delete-texture +{ $values { "id" integer } } +{ $description "Wrapper for " { $link glDeleteTextures } " to handle the common case of deleting a single texture ID." } ; + +HELP: delete-framebuffer +{ $values { "id" integer } } +{ $description "Wrapper for " { $link glDeleteFramebuffersEXT } " to handle the common case of deleting a single framebuffer ID." } ; + +HELP: delete-renderbuffer +{ $values { "id" integer } } +{ $description "Wrapper for " { $link glDeleteRenderbuffersEXT } " to handle the common case of deleting a single render buffer ID." } ; + +HELP: delete-buffer +{ $values { "id" integer } } +{ $description "Wrapper for " { $link glDeleteBuffers } " to handle the common case of deleting a single buffer ID." } ; + +{ gen-texture delete-texture } related-words +{ gen-framebuffer delete-framebuffer } related-words +{ gen-renderbuffer delete-renderbuffer } related-words +{ gen-buffer delete-buffer } related-words + +HELP: framebuffer-incomplete? +{ $values { "status/f" "The framebuffer error code, or " { $snippet "f" } " if the framebuffer is render-complete." } } +{ $description "Checks the framebuffer currently bound by " { $link glBindFramebufferEXT } " or " { $link with-framebuffer } " to see if it is incomplete, i.e., it is not ready to be rendered to." } ; + +HELP: check-framebuffer +{ $description "Checks the framebuffer currently bound by " { $link glBindFramebufferEXT } " or " { $link with-framebuffer } " with " { $link framebuffer-incomplete? } ", and throws a descriptive error if the framebuffer is incomplete." } ; + +HELP: with-framebuffer +{ $values { "id" "The id of a framebuffer object." } { "quot" "a quotation" } } +{ $description "Binds framebuffer " { $snippet "id" } " while calling " { $snippet "quot" } ", restoring the window framebuffer when finished." } ; + +HELP: bind-texture-unit +{ $values { "id" "The id of a texture object." } { "target" "The texture target (e.g., " { $snippet "GL_TEXTURE_2D" } ")" } { "unit" "The texture unit to bind (e.g., " { $snippet "GL_TEXTURE0" } ")" } } +{ $description "Binds texture " { $snippet "id" } " to texture target " { $snippet "target" } " of texture unit " { $snippet "unit" } ". Equivalent to " { $snippet "unit glActiveTexture target id glBindTexture" } "." } ; + +HELP: set-draw-buffers +{ $values { "buffers" "A sequence of buffer words (e.g. " { $snippet GL_BACK } ", " { $snippet GL_COLOR_ATTACHMENT0_EXT } ")"} } +{ $description "Wrapper for " { $link glDrawBuffers } ". Sets up the buffers named in the sequence for simultaneous drawing." } ; + HELP: do-attribs { $values { "bits" integer } { "quot" quotation } } { $description "Wraps a quotation in " { $link glPushAttrib } "/" { $link glPopAttrib } " calls." } ; @@ -148,11 +204,11 @@ HELP: gl-shader-info-log HELP: gl-program { $class-description { $snippet "gl-program" } " is a predicate class comprising values returned by OpenGL to represent proram objects. The following words are provided for creating and manipulating these objects:" { $list - { { $link } " - Link a set of shaders into a GLSL program" } + { { $link } ", " { $link } " - Link a set of shaders into a GLSL program" } { { $link gl-program-ok? } " - Check whether a program object linked successfully" } { { $link check-gl-program } " - Throw an error unless a program object linked successfully" } { { $link gl-program-info-log } " - Retrieve the info log of messages generated by the GLSL linker" } - { { $link gl-program-shaders } " - Retrieve the set of shader objects composing the GLSL linker" } + { { $link gl-program-shaders } " - Retrieve the set of shader objects composing the GLSL program" } { { $link delete-gl-program } " - Invalidate a program object and all its attached shaders" } { { $link with-gl-program } " - Use a program object" } } @@ -162,6 +218,12 @@ HELP: { $values { "shaders" "A sequence of " { $link gl-shader } " objects." } } { $description "Creates a new GLSL program object, attaches all the shader objects in the " { $snippet "shaders" } " sequence, and attempts to link them. The returned object can be checked for validity by " { $link check-gl-program } " or " { $link gl-program-ok? } ". Errors and warnings generated by the GLSL linker will be collected in the info log, available from " { $link gl-program-info-log } ".\n\nWhen the program object and its attached shaders are no longer needed, it should be deleted using " { $link delete-gl-program } "." } ; +HELP: +{ $values { "vertex-shader-source" "A string containing GLSL vertex shader source" } { "fragment-shader-source" "A string containing GLSL fragment shader source" } } +{ $description "Wrapper for " { $link } " for the simple case of compiling a single vertex shader and fragment shader and linking them into a GLSL program. Throws an exception if compiling or linking fails." } ; + +{ } related-words + HELP: gl-program-ok? { $values { "program" "A " { $link gl-program } " object" } } { $description "Returns a boolean value indicating whether the given program object linked successfully. Link errors and warnings are available in the program's info log, which can be gotten using " { $link gl-program-info-log } "." } ; @@ -189,12 +251,16 @@ $nl { $subsection gl-color } { $subsection gl-vertex } { $subsection gl-translate } +{ $subsection gen-texture } +{ $subsection bind-texture-unit } "Combinators:" { $subsection do-state } { $subsection do-enabled } { $subsection do-attribs } { $subsection do-matrix } { $subsection with-translation } +{ $subsection with-framebuffer } +{ $subsection with-gl-program } { $subsection make-dlist } "Rendering geometric shapes:" { $subsection gl-line } diff --git a/extra/opengl/opengl.factor b/extra/opengl/opengl.factor index 737303c16d..63a7370238 100644 --- a/extra/opengl/opengl.factor +++ b/extra/opengl/opengl.factor @@ -1,9 +1,9 @@ ! Copyright (C) 2005, 2007 Slava Pestov. ! Portions copyright (C) 2007 Eduardo Cavazos. ! See http://factorcode.org/license.txt for BSD license. -USING: alien alien.c-types continuations kernel libc math namespaces sequences -math.vectors math.constants math.functions opengl.gl opengl.glu -combinators arrays ; +USING: alien alien.c-types continuations kernel libc math macros namespaces +math.vectors math.constants math.functions opengl.gl opengl.glu words +combinators arrays sequences ; IN: opengl : coordinates [ first2 ] 2apply ; @@ -115,7 +115,7 @@ IN: opengl : delete-buffer ( id -- ) [ glDeleteBuffers ] (delete-gl-object) ; -: framebuffer-incomplete? ( -- ? ) +: framebuffer-incomplete? ( -- status/f ) GL_FRAMEBUFFER_EXT glCheckFramebufferStatusEXT dup GL_FRAMEBUFFER_COMPLETE_EXT = f rot ? ; @@ -145,9 +145,12 @@ IN: opengl GL_FRAMEBUFFER_EXT swap GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0 [ glGetFramebufferAttachmentParameterivEXT ] keep *uint ; -: set-draw-buffers ( buffers -- ) +: (set-draw-buffers) ( buffers -- ) dup length swap >c-uint-array glDrawBuffers ; +MACRO: set-draw-buffers ( buffers -- ) + [ dup word? [ execute ] [ ] if ] map [ (set-draw-buffers) ] curry ; + : do-attribs ( bits quot -- ) swap glPushAttrib call glPopAttrib ; inline @@ -206,7 +209,7 @@ TUPLE: sprite loc dim dim2 dlist texture ; swap sprite-loc v- gl-translate GL_TEXTURE_2D 0 glBindTexture ; -: draw-rectangle ( lower-left upper-right -- ) +: rect-vertices ( lower-left upper-right -- ) GL_QUADS [ over first2 glVertex2d dup first pick second glVertex2d From b60edc199a4f4cdee7bc04cd35154da7752a5edc Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sun, 27 Jan 2008 18:15:11 -0400 Subject: [PATCH 109/216] Fix optimizer regression --- core/compiler/test/optimizer.factor | 4 ++++ core/inference/class/class.factor | 10 +++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/core/compiler/test/optimizer.factor b/core/compiler/test/optimizer.factor index ecb5525fd0..b59c0d5f33 100755 --- a/core/compiler/test/optimizer.factor +++ b/core/compiler/test/optimizer.factor @@ -287,3 +287,7 @@ TUPLE: silly-tuple a b ; [ 3 throw ] [ empty-compound ] compose [ 3 throw ] if ; [ t ] [ \ node-successor-f-bug compiled? ] unit-test + +: construct-empty-bug construct-empty ; + +[ ] [ [ construct-empty ] dataflow optimize drop ] unit-test diff --git a/core/inference/class/class.factor b/core/inference/class/class.factor index 9049104cfc..f6d5a36d3d 100755 --- a/core/inference/class/class.factor +++ b/core/inference/class/class.factor @@ -2,7 +2,8 @@ ! See http://factorcode.org/license.txt for BSD license. USING: arrays generic assocs hashtables inference kernel math namespaces sequences words parser math.intervals -effects classes inference.dataflow inference.backend ; +effects classes inference.dataflow inference.backend +combinators ; IN: inference.class ! Class inference @@ -181,8 +182,11 @@ M: pair constraint-satisfied? ] if* ; : default-output-classes ( word -- classes ) - "inferred-effect" word-prop effect-out - dup [ class? ] all? [ drop f ] unless ; + "inferred-effect" word-prop { + { [ dup not ] [ drop f ] } + { [ dup effect-out [ class? ] all? not ] [ drop f ] } + { [ t ] [ effect-out ] } + } cond ; : compute-output-classes ( node word -- classes intervals ) dup node-param "output-classes" word-prop dup From 33193a92f88a90eea65b6c50fc39b1f679724832 Mon Sep 17 00:00:00 2001 From: Daniel Ehrenberg Date: Sun, 27 Jan 2008 18:44:26 -0600 Subject: [PATCH 110/216] Fixing Unicode.breaks for the new compilation units --- extra/unicode/breaks/breaks.factor | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/extra/unicode/breaks/breaks.factor b/extra/unicode/breaks/breaks.factor index fc1e3071e7..fb893ed51b 100644 --- a/extra/unicode/breaks/breaks.factor +++ b/extra/unicode/breaks/breaks.factor @@ -1,10 +1,10 @@ -USING: unicode.categories kernel math const combinators splitting +USING: unicode.categories kernel math combinators splitting sequences math.parser io.files io assocs arrays namespaces combinators.lib assocs.lib math.ranges unicode.normalize -unicode.syntax unicode.data ; +unicode.syntax unicode.data compiler.units alien.syntax ; IN: unicode.breaks -ENUM: Any L V T Extend Control CR LF graphemes ; +C-ENUM: Any L V T Extend Control CR LF graphemes ; : jamo-class ( ch -- class ) dup initial? [ drop L ] @@ -71,9 +71,9 @@ SYMBOL: table : make-grapheme-table ( -- ) CR LF connect - { Control CR LF } graphemes break-around - L { L V } connect-before - V { V T } connect-before + Control CR LF 3array graphemes break-around + L L V 2array connect-before + V V T 2array connect-before T T connect graphemes Extend connect-after ; From c770e5d5862cdc807f2ca5cb525e2d840061dbdf Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Sun, 27 Jan 2008 20:00:31 -0500 Subject: [PATCH 111/216] Fix nPk and add permutation words to math.combinatorics; including docs/tests --- extra/math/combinatorics/authors.txt | 1 + .../combinatorics/combinatorics-docs.factor | 49 +++++++++++++++++ .../combinatorics/combinatorics-tests.factor | 50 +++++++++++++++++ extra/math/combinatorics/combinatorics.factor | 54 +++++++++++++++---- extra/math/constants/constants.factor | 2 +- 5 files changed, 144 insertions(+), 12 deletions(-) create mode 100644 extra/math/combinatorics/combinatorics-docs.factor create mode 100644 extra/math/combinatorics/combinatorics-tests.factor diff --git a/extra/math/combinatorics/authors.txt b/extra/math/combinatorics/authors.txt index f372b574ae..708cc3e23e 100644 --- a/extra/math/combinatorics/authors.txt +++ b/extra/math/combinatorics/authors.txt @@ -1,2 +1,3 @@ Slava Pestov Doug Coleman +Aaron Schaefer diff --git a/extra/math/combinatorics/combinatorics-docs.factor b/extra/math/combinatorics/combinatorics-docs.factor new file mode 100644 index 0000000000..c763cc32cf --- /dev/null +++ b/extra/math/combinatorics/combinatorics-docs.factor @@ -0,0 +1,49 @@ +USING: help.markup help.syntax kernel math sequences ; +IN: math.combinatorics + +HELP: factorial +{ $values { "n" "a non-negative integer" } { "n!" integer } } +{ $description "Outputs the product of all positive integers less than or equal to " { $snippet "n" } "." } +{ $examples { $example "4 factorial ." "24" } } ; + +HELP: nPk +{ $values { "n" "a non-negative integer" } { "k" "a non-negative integer" } { "nPk" integer } } +{ $description "Outputs the total number of unique permutations of size " { $snippet "k" } " (order does matter) that can be taken from a set of size " { $snippet "n" } "." } +{ $examples { $example "10 4 nPk ." "5040" } } ; + +HELP: nCk +{ $values { "n" "a non-negative integer" } { "k" "a non-negative integer" } { "nCk" integer } } +{ $description "Outputs the total number of unique combinations of size " { $snippet "k" } " (order does not matter) that can be taken from a set of size " { $snippet "n" } ". Commonly written as \"n choose k\"." } +{ $examples { $example "10 4 nCk ." "210" } } ; + +HELP: permutation +{ $values { "n" "a non-negative integer" } { "seq" sequence } { "seq" sequence } } +{ $description "Outputs the " { $snippet "nth" } " lexicographical permutation of " { $snippet "seq" } "." } +{ $notes "Permutations are 0-based and a bounds error will be thrown if " { $snippet "n" } " is larger than " { $snippet "seq length factorial 1-" } "." } +{ $examples { $example "1 3 permutation ." "{ 0 2 1 }" } { $example "5 { \"apple\" \"banana\" \"orange\" } permutation ." "{ \"orange\" \"banana\" \"apple\"}" } } ; + +HELP: all-permutations +{ $values { "seq" sequence } { "seq" sequence } } +{ $description "Outputs a sequence containing all permutations of " { $snippet "seq" } " in lexicographical order." } +{ $examples { $example "3 all-permutations ." "{ { 0 1 2 } { 0 2 1 } { 1 0 2 } { 1 2 0 } { 2 0 1 } { 2 1 0 } }" } } ; + +HELP: inverse-permutation +{ $values { "seq" sequence } { "permutation" sequence } } +{ $description "Outputs a sequence of indices representing the lexicographical permutation of " { $snippet "seq" } "." } +{ $notes "All items in " { $snippet "seq" } " must be comparable by " { $link <=> } "." } +{ $examples { $example "\"dcba\" inverse-permutation ." "{ 3 2 1 0 }" } { $example "{ 12 56 34 78 } inverse-permutation ." "{ 0 2 1 3 }" } } ; + + +IN: math.combinatorics.private + +HELP: factoradic +{ $values { "n" integer } { "seq" sequence } } +{ $description "Converts a positive integer " { $snippet "n" } " to factoradic form. The factoradic of an integer is its representation based on a mixed radix numerical system that corresponds to the values of " { $snippet "n" } " factorial." } +{ $examples { $example "859 factoradic ." "{ 1 1 0 3 0 1 0 }" } } ; + +HELP: >permutation +{ $values { "factoradic" sequence } { "permutation" sequence } } +{ $description "Converts an integer represented in factoradic form into its corresponding unique permutation (0-based)." } +{ $notes "For clarification, the following two statements are equivalent:" { $code "10 factoradic >permutation" "{ 1 2 0 0 } >permutation" } } +{ $examples { $example "{ 0 0 0 0 } >permutation ." "{ 0 1 2 3 }" } } ; + diff --git a/extra/math/combinatorics/combinatorics-tests.factor b/extra/math/combinatorics/combinatorics-tests.factor new file mode 100644 index 0000000000..440630e38f --- /dev/null +++ b/extra/math/combinatorics/combinatorics-tests.factor @@ -0,0 +1,50 @@ +USING: math.combinatorics math.combinatorics.private tools.test ; +IN: temporary + +[ { } ] [ 0 factoradic ] unit-test +[ { 1 0 } ] [ 1 factoradic ] unit-test +[ { 1 1 0 3 0 1 0 } ] [ 859 factoradic ] unit-test + +[ { 0 1 2 3 } ] [ { 0 0 0 0 } >permutation ] unit-test +[ { 0 1 3 2 } ] [ { 0 0 1 0 } >permutation ] unit-test +[ { 1 2 0 6 3 5 4 } ] [ { 1 1 0 3 0 1 0 } >permutation ] unit-test + +[ { 0 1 2 3 } ] [ 0 4 permutation-indices ] unit-test +[ { 0 1 3 2 } ] [ 1 4 permutation-indices ] unit-test +[ { 1 2 0 6 3 5 4 } ] [ 859 7 permutation-indices ] unit-test + +[ { "b" "d" } ] [ { "a" "b" "c" "d" } { 1 3 } reorder ] unit-test +[ { "a" "b" "c" "d" } ] [ { "a" "b" "c" "d" } { 0 1 2 3 } reorder ] unit-test +[ { "d" "c" "b" "a" } ] [ { "a" "b" "c" "d" } { 3 2 1 0 } reorder ] unit-test +[ { "d" "a" "b" "c" } ] [ { "a" "b" "c" "d" } { 3 0 1 2 } reorder ] unit-test + +[ 1 ] [ 0 factorial ] unit-test +[ 1 ] [ 1 factorial ] unit-test +[ 3628800 ] [ 10 factorial ] unit-test + +[ 1 ] [ 3 0 nPk ] unit-test +[ 6 ] [ 3 2 nPk ] unit-test +[ 6 ] [ 3 3 nPk ] unit-test +[ 0 ] [ 3 4 nPk ] unit-test +[ 311875200 ] [ 52 5 nPk ] unit-test +[ 672151459757865654763838640470031391460745878674027315200000000000 ] [ 52 47 nPk ] unit-test + +[ 1 ] [ 3 0 nCk ] unit-test +[ 3 ] [ 3 2 nCk ] unit-test +[ 1 ] [ 3 3 nCk ] unit-test +[ 0 ] [ 3 4 nCk ] unit-test +[ 2598960 ] [ 52 5 nCk ] unit-test +[ 2598960 ] [ 52 47 nCk ] unit-test + +[ { "a" "b" "c" "d" } ] [ 0 { "a" "b" "c" "d" } permutation ] unit-test +[ { "d" "c" "b" "a" } ] [ 23 { "a" "b" "c" "d" } permutation ] unit-test +[ { "d" "a" "b" "c" } ] [ 18 { "a" "b" "c" "d" } permutation ] unit-test + +[ { { "a" "b" "c" } { "a" "c" "b" } + { "b" "a" "c" } { "b" "c" "a" } + { "c" "a" "b" } { "c" "b" "a" } } ] [ { "a" "b" "c" } all-permutations ] unit-test + +[ { 0 1 2 } ] [ { "a" "b" "c" } inverse-permutation ] unit-test +[ { 2 1 0 } ] [ { "c" "b" "a" } inverse-permutation ] unit-test +[ { 3 0 2 1 } ] [ { 12 45 34 2 } inverse-permutation ] unit-test + diff --git a/extra/math/combinatorics/combinatorics.factor b/extra/math/combinatorics/combinatorics.factor index a0f331e6f6..99a098ca09 100644 --- a/extra/math/combinatorics/combinatorics.factor +++ b/extra/math/combinatorics/combinatorics.factor @@ -1,21 +1,53 @@ -USING: kernel math math.ranges math.vectors -sequences sorting mirrors assocs ; +! Copyright (c) 2007, 2008 Slava Pestov, Doug Coleman, Aaron Schaefer. +! See http://factorcode.org/license.txt for BSD license. +USING: assocs kernel math math.ranges mirrors namespaces sequences sorting ; IN: math.combinatorics -: possible? 0 rot between? ; inline + [ dupd - ] when ; inline -: (nCk) ( n k -- nCk ) - [ nPk ] 2keep - factorial / ; +! See this article for explanation of the factoradic-based permutation methodology: +! http://msdn2.microsoft.com/en-us/library/aa302371.aspx -: twiddle 2dup - dupd < [ dupd - ] when ; inline +: factoradic ( n -- factoradic ) + 0 [ over 0 > ] [ 1+ [ /mod ] keep swap ] [ ] unfold reverse 2nip ; + +: (>permutation) ( seq n -- seq ) + [ [ dupd >= [ 1+ ] when ] curry map ] keep add* ; + +: >permutation ( factoradic -- permutation ) + reverse 1 cut [ (>permutation) ] each ; + +: permutation-indices ( n seq -- permutation ) + length [ factoradic ] dip 0 pad-left >permutation ; + +: reorder ( seq indices -- seq ) + [ [ over nth , ] each drop ] { } make ; + +PRIVATE> + +: factorial ( n -- n! ) + 1 [ 1+ * ] reduce ; + +: nPk ( n k -- nPk ) + 2dup possible? [ dupd - [a,b) product ] [ 2drop 0 ] if ; : nCk ( n k -- nCk ) - 2dup possible? [ twiddle (nCk) ] [ 2drop 0 ] if ; + twiddle [ nPk ] keep factorial / ; -: inverse-permutation ( seq -- seq ) +: permutation ( n seq -- seq ) + tuck permutation-indices reorder ; + +: all-permutations ( seq -- seq ) + [ + [ length factorial ] keep [ permutation , ] curry each + ] { } make ; + +: inverse-permutation ( seq -- permutation ) >alist sort-values keys ; + diff --git a/extra/math/constants/constants.factor b/extra/math/constants/constants.factor index 7e2b8842ad..c4abeca0eb 100755 --- a/extra/math/constants/constants.factor +++ b/extra/math/constants/constants.factor @@ -4,6 +4,6 @@ IN: math.constants : e ( -- e ) 2.7182818284590452354 ; inline : gamma ( -- gamma ) 0.57721566490153286060 ; inline -: pi ( -- pi ) 3.14159265358979323846 ; inline : phi ( -- phi ) 1.61803398874989484820 ; inline +: pi ( -- pi ) 3.14159265358979323846 ; inline : epsilon ( -- epsilon ) 2.2204460492503131e-16 ; inline From 5da9faa71c6e24307b468f216511c896adc91824 Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Sun, 27 Jan 2008 20:09:31 -0500 Subject: [PATCH 112/216] Update math.combinatorics dependencies in PE solutions --- extra/project-euler/024/024.factor | 19 +------------------ extra/project-euler/032/032.factor | 2 +- 2 files changed, 2 insertions(+), 19 deletions(-) diff --git a/extra/project-euler/024/024.factor b/extra/project-euler/024/024.factor index 230aea02b9..c795fc0169 100644 --- a/extra/project-euler/024/024.factor +++ b/extra/project-euler/024/024.factor @@ -1,6 +1,6 @@ ! Copyright (c) 2008 Aaron Schaefer. ! See http://factorcode.org/license.txt for BSD license. -USING: kernel math math.parser math.ranges namespaces sequences ; +USING: kernel math.combinatorics math.parser ; IN: project-euler.024 ! http://projecteuler.net/index.php?section=problems&id=24 @@ -22,23 +22,6 @@ IN: project-euler.024 ! SOLUTION ! -------- -permutation) ( seq n -- seq ) - [ [ dupd >= [ 1+ ] when ] curry map ] keep add* ; - -PRIVATE> - -: >permutation ( factoradic -- permutation ) - reverse 1 cut [ (>permutation) ] each ; - -: factoradic ( k order -- factoradic ) - [ [1,b] [ 2dup mod , /i ] each ] { } make reverse nip ; - -: permutation ( k seq -- seq ) - dup length swapd factoradic >permutation - [ [ dupd swap nth , ] each drop ] { } make ; - : euler024 ( -- answer ) 999999 10 permutation 10 swap digits>integer ; diff --git a/extra/project-euler/032/032.factor b/extra/project-euler/032/032.factor index 67a8befb0a..d10326a076 100644 --- a/extra/project-euler/032/032.factor +++ b/extra/project-euler/032/032.factor @@ -1,7 +1,7 @@ ! Copyright (c) 2008 Aaron Schaefer. ! See http://factorcode.org/license.txt for BSD license. USING: combinators.lib hashtables kernel math math.combinatorics math.parser - math.ranges project-euler.common project-euler.024 sequences sorting ; + math.ranges project-euler.common sequences sorting ; IN: project-euler.032 ! http://projecteuler.net/index.php?section=problems&id=32 From 83aa8d0d6e437f245e464d6079056da2e5111ab0 Mon Sep 17 00:00:00 2001 From: Eduardo Cavazos Date: Sun, 27 Jan 2008 19:10:28 -0600 Subject: [PATCH 113/216] Fix wait loop bug (fixed by Slava) --- extra/io/unix/linux/linux.factor | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/extra/io/unix/linux/linux.factor b/extra/io/unix/linux/linux.factor index fcb48dd577..6d55decb5a 100755 --- a/extra/io/unix/linux/linux.factor +++ b/extra/io/unix/linux/linux.factor @@ -2,14 +2,15 @@ ! See http://factorcode.org/license.txt for BSD license. IN: io.unix.linux USING: io.backend io.unix.backend io.unix.launcher io.unix.select -namespaces kernel assocs unix.process ; +namespaces kernel assocs unix.process init ; TUPLE: linux-io ; INSTANCE: linux-io unix-io M: linux-io init-io ( -- ) - mx set-global - start-wait-thread ; + mx set-global ; T{ linux-io } set-io-backend + +[ start-wait-thread ] "io.unix.linux" add-init-hook \ No newline at end of file From 1d7ba3363eb9cbb5110084995bd26c1160e55304 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sun, 27 Jan 2008 19:32:23 -0800 Subject: [PATCH 114/216] OpenGL capability checking words (require-gl-version, require-gl-extensions, and friends) --- extra/cel-shading/cel-shading.factor | 1 + extra/line-art/line-art.factor | 3 ++ extra/opengl/opengl-docs.factor | 63 ++++++++++++++++++++++++++-- extra/opengl/opengl.factor | 62 ++++++++++++++++++++++++++- 4 files changed, 123 insertions(+), 6 deletions(-) diff --git a/extra/cel-shading/cel-shading.factor b/extra/cel-shading/cel-shading.factor index 54664fc011..c89fd0e244 100644 --- a/extra/cel-shading/cel-shading.factor +++ b/extra/cel-shading/cel-shading.factor @@ -58,6 +58,7 @@ main() ; M: cel-shading-gadget graft* ( gadget -- ) + "2.0" { "GL_ARB_shader_objects" } require-gl-version-or-extensions 0.0 0.0 0.0 1.0 glClearColor GL_CULL_FACE glEnable GL_DEPTH_TEST glEnable diff --git a/extra/line-art/line-art.factor b/extra/line-art/line-art.factor index 921c9e16d5..054f07f63f 100644 --- a/extra/line-art/line-art.factor +++ b/extra/line-art/line-art.factor @@ -187,6 +187,9 @@ main() ] if ; M: line-art-gadget graft* ( gadget -- ) + "2.0" { "GL_ARB_draw_buffers" "GL_ARB_shader_objects" "GL_ARB_multitexture" } + require-gl-version-or-extensions + { "GL_EXT_framebuffer_object" } require-gl-extensions GL_CULL_FACE glEnable GL_DEPTH_TEST glEnable (line-art-step1-program) over set-line-art-gadget-step1-program diff --git a/extra/opengl/opengl-docs.factor b/extra/opengl/opengl-docs.factor index 756507dace..cc8221baa1 100644 --- a/extra/opengl/opengl-docs.factor +++ b/extra/opengl/opengl-docs.factor @@ -39,7 +39,7 @@ HELP: gl-rect HELP: rect-vertices { $values { "lower-left" "A pair of numbers indicating the lower-left coordinates of the rectangle." } { "upper-right" "The upper-right coordinates of the rectangle." } } -{ $description "Emits" { $link glVertex2d } " calls outlining the axis-aligned rectangle from " { $snippet "lower-left" } to { $snippet "upper-right" } " on the z=0 plane in counterclockwise order." } ; +{ $description "Emits" { $link glVertex2d } " calls outlining the axis-aligned rectangle from " { $snippet "lower-left" } " to " { $snippet "upper-right" } " on the z=0 plane in counterclockwise order." } ; HELP: gl-fill-poly { $values { "points" "a sequence of pairs of integers" } } @@ -99,14 +99,14 @@ HELP: check-framebuffer HELP: with-framebuffer { $values { "id" "The id of a framebuffer object." } { "quot" "a quotation" } } -{ $description "Binds framebuffer " { $snippet "id" } " while calling " { $snippet "quot" } ", restoring the window framebuffer when finished." } ; +{ $description "Binds framebuffer " { $snippet "id" } " in the dynamic extent of " { $snippet "quot" } ", restoring the window framebuffer when finished." } ; HELP: bind-texture-unit { $values { "id" "The id of a texture object." } { "target" "The texture target (e.g., " { $snippet "GL_TEXTURE_2D" } ")" } { "unit" "The texture unit to bind (e.g., " { $snippet "GL_TEXTURE0" } ")" } } { $description "Binds texture " { $snippet "id" } " to texture target " { $snippet "target" } " of texture unit " { $snippet "unit" } ". Equivalent to " { $snippet "unit glActiveTexture target id glBindTexture" } "." } ; HELP: set-draw-buffers -{ $values { "buffers" "A sequence of buffer words (e.g. " { $snippet GL_BACK } ", " { $snippet GL_COLOR_ATTACHMENT0_EXT } ")"} } +{ $values { "buffers" "A sequence of buffer words (e.g. " { $snippet "GL_BACK" } ", " { $snippet "GL_COLOR_ATTACHMENT0_EXT" } ")"} } { $description "Wrapper for " { $link glDrawBuffers } ". Sets up the buffers named in the sequence for simultaneous drawing." } ; HELP: do-attribs @@ -242,11 +242,66 @@ HELP: delete-gl-program HELP: with-gl-program { $values { "program" "A " { $link gl-program } " object" } { "quot" "A quotation" } } -{ $description "Enables " { $snippet "program" } " for all OpenGL calls made in " { $snippet "quot" } ". The fixed-function pipeline is restored at the end of " { $snippet "quot" } "." } ; +{ $description "Enables " { $snippet "program" } " for all OpenGL calls made in the dynamic extent of " { $snippet "quot" } ". The fixed-function pipeline is restored at the end of " { $snippet "quot" } "." } ; + +HELP: gl-version +{ $values { "version" "The version string from the OpenGL implementation" } } +{ $description "Wrapper for " { $snippet "GL_VERSION glGetString" } " that removes the vendor-specific information from the version string." } ; + +HELP: gl-vendor-version +{ $values { "version" "The vendor-specific version information from the OpenGL implementation" } } +{ $description "Wrapper for " { $snippet "GL_VERSION glGetString" } " that returns only the vendor-specific information from the version string." } ; + +HELP: has-gl-version? +{ $values { "version" "A version string" } { "?" "A boolean value" } } +{ $description "Compares the version string returned by " { $link gl-version } " to " { $snippet "version" } ". Returns true if the implementation version meets or exceeds " { $snippet "version" } "." } ; + +HELP: require-gl-version +{ $values { "version" "A version string" } } +{ $description "Throws an exception if " { $link has-gl-version? } " returns false for " { $snippet "version" } "." } ; + +HELP: glsl-version +{ $values { "version" "The GLSL version string from the OpenGL implementation" } } +{ $description "Wrapper for " { $snippet "GL_SHADING_LANGUAGE_VERSION glGetString" } " that removes the vendor-specific information from the version string." } ; + +HELP: glsl-vendor-version +{ $values { "version" "The vendor-specific GLSL version information from the OpenGL implementation" } } +{ $description "Wrapper for " { $snippet "GL_SHADING_LANGUAGE_VERSION glGetString" } " that returns only the vendor-specific information from the version string." } ; + +HELP: has-glsl-version? +{ $values { "version" "A version string" } { "?" "A boolean value" } } +{ $description "Compares the version string returned by " { $link glsl-version } " to " { $snippet "version" } ". Returns true if the implementation version meets or exceeds " { $snippet "version" } "." } ; + +HELP: require-glsl-version +{ $values { "version" "A version string" } } +{ $description "Throws an exception if " { $link has-glsl-version? } " returns false for " { $snippet "version" } "." } ; + +HELP: gl-extensions +{ $values { "seq" "A sequence of strings naming the implementation-supported OpenGL extensions" } } +{ $description "Wrapper for " { $snippet "GL_EXTENSIONS glGetString" } " that returns a sequence of extension names supported by the OpenGL implementation." } ; + +HELP: has-gl-extensions? +{ $values { "extensions" "A sequence of extension name strings" } { "?" "A boolean value" } } +{ $description "Returns true if the set of " { $snippet "extensions" } " is a subset of the implementation-supported extensions returned by " { $link gl-extensions } "." } ; + +HELP: require-gl-extensions +{ $values { "extensions" "A sequence of extension name strings" } } +{ $description "Throws an exception if " { $link has-gl-extensions? } " returns false for " { $snippet "extensions" } "." } ; + +HELP: require-gl-version-or-extensions +{ $values { "version" "A version string" } { "extensions" "A sequence of extension name strings" } } +{ $description "Throws an exception if neither " { $link has-gl-version? } " nor " { $link has-gl-extensions? } " returns true for " { $snippet "version" } " or " { $snippet "extensions" } ", respectively. Intended for use when required OpenGL functionality can be verified either by a minimum version, or a set of equivalent extensions." } ; + +{ require-gl-version require-glsl-version require-gl-extensions require-gl-version-or-extensions has-gl-version? has-glsl-version? has-gl-extensions? gl-version glsl-version gl-extensions } related-words ARTICLE: "gl-utilities" "OpenGL utility words" "In addition to the full OpenGL API, the " { $vocab-link "opengl" } " vocabulary includes some utility words to give OpenGL a more Factor-like feel." $nl +"Checking implementation capabilities:" +{ $subsection require-gl-version } +{ $subsection require-gl-extensions } +{ $subsection require-glsl-version } +{ $subsection require-gl-version-or-extensions } "Wrappers:" { $subsection gl-color } { $subsection gl-vertex } diff --git a/extra/opengl/opengl.factor b/extra/opengl/opengl.factor index 63a7370238..2f3b87827a 100644 --- a/extra/opengl/opengl.factor +++ b/extra/opengl/opengl.factor @@ -2,8 +2,8 @@ ! Portions copyright (C) 2007 Eduardo Cavazos. ! See http://factorcode.org/license.txt for BSD license. USING: alien alien.c-types continuations kernel libc math macros namespaces -math.vectors math.constants math.functions opengl.gl opengl.glu words -combinators arrays sequences ; +math.vectors math.constants math.functions math.parser opengl.gl opengl.glu +combinators arrays sequences splitting words ; IN: opengl : coordinates [ first2 ] 2apply ; @@ -351,3 +351,61 @@ PREDICATE: integer gl-program (gl-program?) ; r> check-gl-shader 2array check-gl-program ; +: (require-gl) ( thing require-quot make-error-quot -- ) + >r dupd call + [ r> 2drop ] + [ r> " " make throw ] + if ; inline + +: gl-extensions ( -- seq ) + GL_EXTENSIONS glGetString " " split ; +: has-gl-extensions? ( extensions -- ? ) + gl-extensions subseq? ; +: (make-gl-extensions-error) ( required-extensions -- ) + gl-extensions swap seq-diff + "Required OpenGL extensions not supported:\n" % + [ " " % % "\n" % ] each ; +: require-gl-extensions ( extensions -- ) + [ has-gl-extensions? ] + [ (make-gl-extensions-error) ] + (require-gl) ; + +: version-seq ( version-string -- version-seq ) + "." split [ string>number ] map ; + +: version<=> ( version1 version2 -- n ) + swap version-seq swap version-seq <=> ; + +: (gl-version) ( -- version vendor ) + GL_VERSION glGetString " " split1 ; +: gl-version ( -- version ) + (gl-version) drop ; +: gl-vendor-version ( -- version ) + (gl-version) nip ; +: has-gl-version? ( version -- ? ) + gl-version version<=> 0 <= ; +: (make-gl-version-error) ( required-version -- ) + "Required OpenGL version " % % " not supported (" % gl-version % " available)" % ; +: require-gl-version ( version -- ) + [ has-gl-version? ] + [ (make-gl-version-error) ] + (require-gl) ; + +: (glsl-version) ( -- version vendor ) + GL_SHADING_LANGUAGE_VERSION glGetString " " split1 ; +: glsl-version ( -- version ) + (glsl-version) drop ; +: glsl-vendor-version ( -- version ) + (glsl-version) nip ; +: has-glsl-version? ( version -- ? ) + glsl-version version<=> 0 <= ; +: require-glsl-version ( version -- ) + [ has-glsl-version? ] + [ "Required GLSL version " % % " not supported (" % glsl-version % " available)" % ] + (require-gl) ; + +: require-gl-version-or-extensions ( version extensions -- ) + 2array [ first2 has-gl-extensions? swap has-gl-version? or ] + [ dup first (make-gl-version-error) "\n" % + second (make-gl-extensions-error) "\n" % ] + (require-gl) ; From 5031cca224fde5e41767a11cb651c503ace6965e Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sun, 27 Jan 2008 23:30:24 -0600 Subject: [PATCH 115/216] Fix indentation --- extra/assocs/lib/lib.factor | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/extra/assocs/lib/lib.factor b/extra/assocs/lib/lib.factor index 00f330f0fc..849f88023f 100755 --- a/extra/assocs/lib/lib.factor +++ b/extra/assocs/lib/lib.factor @@ -9,16 +9,12 @@ IN: assocs.lib : ref-at ( table key -- value ) swap at ; -! set-at with alternative stack effects - : put-at* ( table key value -- ) swap rot set-at ; : put-at ( table key value -- table ) swap pick set-at ; -! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - : set-assoc-stack ( value key seq -- ) - dupd [ key? ] with find-last nip set-at ; + dupd [ key? ] with find-last nip set-at ; : at-default ( key assoc -- value/key ) dupd at [ nip ] when* ; From 8e2cc99d4e0fdd8f0ef615b355c0ae2c3ae279f1 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sun, 27 Jan 2008 21:50:42 -0800 Subject: [PATCH 116/216] Revert "Catch exceptions thrown by graft* and ungraft* in the notify loop so that the gadgets' graft states remain consistent" This reverts commit ca6247f3b3e7956bb8e76773bf7534654730e333. --- extra/ui/ui.factor | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/extra/ui/ui.factor b/extra/ui/ui.factor index 4daadd2765..febb56e10f 100755 --- a/extra/ui/ui.factor +++ b/extra/ui/ui.factor @@ -120,12 +120,12 @@ SYMBOL: ui-hook [ dup update-hand draw-world ] each ; : notify ( gadget -- ) - dup gadget-graft-state [ dup { - { { f t } [ over activate-control over graft* ] } - { { t f } [ over activate-control over ungraft* ] } - } case ] - [ first { f f } { t t } ? - swap set-gadget-graft-state ] [ ] cleanup ; + dup gadget-graft-state { + { { f t } [ dup activate-control dup graft* ] } + { { t f } [ dup activate-control dup ungraft* ] } + } case + dup gadget-graft-state first { f f } { t t } ? + swap set-gadget-graft-state ; : notify-queued ( -- ) graft-queue [ notify ] dlist-slurp ; From 7b7987f4767f380adabb42bd50804cb550d05b37 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sun, 27 Jan 2008 21:52:14 -0800 Subject: [PATCH 117/216] Remove redundant [ call ] from cleanups in opengl.factor. Back out graft*/ungraft* cleanup for performance --- extra/opengl/opengl.factor | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/extra/opengl/opengl.factor b/extra/opengl/opengl.factor index 2f3b87827a..221b866a15 100644 --- a/extra/opengl/opengl.factor +++ b/extra/opengl/opengl.factor @@ -135,7 +135,6 @@ IN: opengl : with-framebuffer ( id quot -- ) GL_FRAMEBUFFER_EXT rot glBindFramebufferEXT - [ call ] [ GL_FRAMEBUFFER_EXT 0 glBindFramebufferEXT ] [ ] cleanup ; inline : bind-texture-unit ( id target unit -- ) @@ -342,7 +341,7 @@ PREDICATE: gl-shader fragment-shader (fragment-shader?) ; delete-gl-program-only ; : with-gl-program ( program quot -- ) - swap glUseProgram [ call ] [ 0 glUseProgram ] [ ] cleanup ; inline + swap glUseProgram [ 0 glUseProgram ] [ ] cleanup ; inline PREDICATE: integer gl-program (gl-program?) ; From cf299210838b5cdb485f3c213589ce0f47fe157b Mon Sep 17 00:00:00 2001 From: Daniel Ehrenberg Date: Sun, 27 Jan 2008 23:54:38 -0600 Subject: [PATCH 118/216] Unicode breaks fix and deletion of repetition in syntax --- extra/unicode/breaks/breaks-tests.factor | 4 +- extra/unicode/breaks/breaks.factor | 47 ++++++++++-------------- extra/unicode/syntax/syntax.factor | 8 ---- 3 files changed, 22 insertions(+), 37 deletions(-) diff --git a/extra/unicode/breaks/breaks-tests.factor b/extra/unicode/breaks/breaks-tests.factor index c183c3a86e..26f419ff0e 100644 --- a/extra/unicode/breaks/breaks-tests.factor +++ b/extra/unicode/breaks/breaks-tests.factor @@ -3,5 +3,5 @@ USING: tools.test unicode.breaks sequences math kernel ; [ "\u1112\u1161\u11abA\u0300a\r\r\n" ] [ "\r\n\raA\u0300\u1112\u1161\u11ab" string-reverse ] unit-test [ "dcba" ] [ "abcd" string-reverse ] unit-test -[ 3 ] [ "\u1112\u1161\u11abA\u0300a" [ length 1- ] keep - [ prev-grapheme ] keep prev-grapheme ] unit-test +[ 3 ] [ "\u1112\u1161\u11abA\u0300a" + dup last-grapheme head last-grapheme ] unit-test diff --git a/extra/unicode/breaks/breaks.factor b/extra/unicode/breaks/breaks.factor index fb893ed51b..9c9242edc3 100644 --- a/extra/unicode/breaks/breaks.factor +++ b/extra/unicode/breaks/breaks.factor @@ -85,45 +85,38 @@ DEFER: grapheme-table : chars ( i str n -- str[i] str[i+n] ) swap >r dupd + r> [ ?nth ] curry 2apply ; -: next-grapheme-step ( i str -- i+1 str prev-class ) - 2dup nth grapheme-class >r >r 1+ r> r> ; +: find-index ( seq quot -- i ) find drop ; inline +: find-last-index ( seq quot -- i ) find-last drop ; inline -: (next-grapheme) ( i str prev-class -- next-i ) - 3dup drop bounds-check? [ - >r next-grapheme-step r> over grapheme-break? - [ 2drop 1- ] [ (next-grapheme) ] if - ] [ 2drop ] if ; +: first-grapheme ( str -- i ) + unclip-slice grapheme-class over + [ grapheme-class tuck grapheme-break? ] find-index + nip swap length or 1+ ; -: next-grapheme ( i str -- next-i ) - next-grapheme-step (next-grapheme) ; +: (>graphemes) ( str -- ) + dup empty? [ drop ] [ + dup first-grapheme cut-slice + swap , (>graphemes) + ] if ; -: (>graphemes) ( i str -- ) - 2dup bounds-check? [ - dupd [ next-grapheme ] keep - [ subseq , ] 2keep (>graphemes) - ] [ 2drop ] if ; : >graphemes ( str -- graphemes ) - [ 0 swap (>graphemes) ] { } make* ; + [ (>graphemes) ] { } make ; : string-reverse ( str -- rts ) >graphemes reverse concat ; -: prev-grapheme-step ( i str -- i-1 str prev-class ) - 2dup nth grapheme-class >r >r 1- r> r> ; +: unclip-last-slice ( seq -- beginning last ) + dup 1 head-slice* swap peek ; -: (prev-grapheme) ( i str next-class -- prev-i ) - pick zero? [ - >r prev-grapheme-step r> dupd grapheme-break? - [ 2drop 1- ] [ (prev-grapheme) ] if - ] [ 2drop ] if ; +: last-grapheme ( str -- i ) + unclip-last-slice grapheme-class swap + [ grapheme-class dup rot grapheme-break? ] find-last-index + nip -1 or 1+ ; -: prev-grapheme ( i str -- prev-i ) - prev-grapheme-step (prev-grapheme) ; - -[ +<< other-extend-lines process-other-extend \ other-extend define-value init-grapheme-table table [ make-grapheme-table finish-table ] with-variable \ grapheme-table define-value -] with-compilation-unit +>> diff --git a/extra/unicode/syntax/syntax.factor b/extra/unicode/syntax/syntax.factor index 91d46d179f..5119663872 100644 --- a/extra/unicode/syntax/syntax.factor +++ b/extra/unicode/syntax/syntax.factor @@ -47,14 +47,6 @@ IN: unicode.syntax CREATE ";" parse-tokens categories swap seq-minus define-category ; parsing -TUPLE: code-point lower title upper ; - -C: code-point - -: set-code-point ( seq -- ) - 4 head [ multihex ] map first4 - swap first set ; - : UNICHAR: ! This should be part of CHAR: scan name>char [ parsed ] [ "Invalid character" throw ] if* ; parsing From c79b8d84713850646d00d9f9d2e2cb6a091cd821 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sun, 27 Jan 2008 23:59:36 -0600 Subject: [PATCH 119/216] Clean up Windows I/O --- extra/io/windows/ce/backend/backend.factor | 2 +- extra/io/windows/nt/backend/backend.factor | 32 +++---- extra/io/windows/nt/files/files.factor | 18 ++-- extra/io/windows/nt/monitor/monitor.factor | 97 +++++++++++----------- extra/io/windows/nt/sockets/sockets.factor | 49 +++++------ extra/io/windows/windows.factor | 5 +- 6 files changed, 90 insertions(+), 113 deletions(-) diff --git a/extra/io/windows/ce/backend/backend.factor b/extra/io/windows/ce/backend/backend.factor index 142447fe0c..e90a9f16e2 100755 --- a/extra/io/windows/ce/backend/backend.factor +++ b/extra/io/windows/ce/backend/backend.factor @@ -8,7 +8,7 @@ IN: io.windows.ce.backend win32-error-string swap set-port-error ; M: windows-ce-io io-multiplex ( ms -- ) (sleep) ; -M: windows-ce-io add-completion ( port -- ) drop ; +M: windows-ce-io add-completion ( handle -- ) drop ; GENERIC: wince-read ( port port-handle -- ) diff --git a/extra/io/windows/nt/backend/backend.factor b/extra/io/windows/nt/backend/backend.factor index 82d609c371..0aaa935a7e 100755 --- a/extra/io/windows/nt/backend/backend.factor +++ b/extra/io/windows/nt/backend/backend.factor @@ -43,7 +43,7 @@ M: windows-nt-io normalize-pathname ( string -- string ) SYMBOL: io-hash -TUPLE: io-callback continuation port ; +TUPLE: io-callback port continuation ; C: io-callback @@ -59,12 +59,6 @@ C: io-callback >r (make-overlapped) r> port-handle win32-file-ptr [ over set-OVERLAPPED-offset ] when* ; -: port-overlapped ( port -- overlapped ) - port-handle win32-file-overlapped ; - -: set-port-overlapped ( overlapped port -- ) - port-handle set-win32-file-overlapped ; - : ( handle existing -- handle ) f 1 CreateIoCompletionPort dup win32-error=0/f ; @@ -90,21 +84,16 @@ M: windows-nt-io add-completion ( handle -- ) drop t ] if ; -: get-overlapped-result ( port -- bytes-transferred ) - dup - port-handle - dup win32-file-handle - swap win32-file-overlapped - 0 [ - 0 - GetOverlappedResult overlapped-error? drop - ] keep *uint ; +: get-overlapped-result ( overlapped port -- bytes-transferred ) + dup port-handle win32-file-handle rot 0 + [ 0 GetOverlappedResult overlapped-error? drop ] keep *uint ; -: save-callback ( port -- ) +: save-callback ( overlapped port -- ) [ - [ ] keep port-handle win32-file-overlapped + swap + dup alien? [ "bad overlapped in save-callback" throw ] unless io-hash get-global set-at stop - ] curry callcc0 ; + ] callcc0 2drop ; : wait-for-overlapped ( ms -- overlapped ? ) >r master-completion-port get-global r> ! port ms @@ -113,8 +102,9 @@ M: windows-nt-io add-completion ( handle -- ) f ! overlapped [ roll GetQueuedCompletionStatus ] keep *void* swap zero? ; -: lookup-callback ( GetQueuedCompletion-args -- callback ) - io-hash get-global delete-at* drop ; +: lookup-callback ( overlapped -- callback ) + io-hash get-global delete-at* drop + dup io-callback? [ "no callback in io-hash" throw ] unless ; : handle-overlapped ( timeout -- ? ) wait-for-overlapped [ diff --git a/extra/io/windows/nt/files/files.factor b/extra/io/windows/nt/files/files.factor index 375f35176c..06edd8b3ee 100755 --- a/extra/io/windows/nt/files/files.factor +++ b/extra/io/windows/nt/files/files.factor @@ -17,22 +17,19 @@ M: windows-nt-io FileArgs-overlapped ( port -- overlapped ) 2drop ] if* ; -: finish-flush ( port -- ) +: finish-flush ( overlapped port -- ) dup pending-error - dup get-overlapped-result + tuck get-overlapped-result dup pick update-file-ptr swap buffer-consume ; -: save-overlapped-and-callback ( fileargs port -- ) - swap FileArgs-lpOverlapped over set-port-overlapped - save-callback ; - : (flush-output) ( port -- ) dup touch-port dup make-FileArgs tuck setup-write WriteFile dupd overlapped-error? [ - [ save-overlapped-and-callback ] keep + >r FileArgs-lpOverlapped r> + [ save-callback ] 2keep [ finish-flush ] keep dup buffer-empty? [ drop ] [ (flush-output) ] if ] [ @@ -45,9 +42,9 @@ M: windows-nt-io FileArgs-overlapped ( port -- overlapped ) M: port port-flush dup buffer-empty? [ dup flush-output ] unless drop ; -: finish-read ( port -- ) +: finish-read ( overlapped port -- ) dup pending-error - dup get-overlapped-result dup zero? [ + tuck get-overlapped-result dup zero? [ drop t swap set-port-eof? ] [ dup pick n>buffer @@ -59,7 +56,8 @@ M: port port-flush dup make-FileArgs tuck setup-read ReadFile dupd overlapped-error? [ - [ save-overlapped-and-callback ] keep + >r FileArgs-lpOverlapped r> + [ save-callback ] 2keep finish-read ] [ 2drop diff --git a/extra/io/windows/nt/monitor/monitor.factor b/extra/io/windows/nt/monitor/monitor.factor index 746b02a3cb..c8714b33cc 100755 --- a/extra/io/windows/nt/monitor/monitor.factor +++ b/extra/io/windows/nt/monitor/monitor.factor @@ -1,55 +1,58 @@ ! Copyright (C) 2008 Doug Coleman, Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: alien.c-types destructors io.windows kernel math windows -windows.kernel32 windows.types libc assocs alien namespaces -continuations io.monitor sequences hashtables sorting arrays ; +USING: alien.c-types destructors io.windows +io.windows.nt.backend kernel math windows windows.kernel32 +windows.types libc assocs alien namespaces continuations +io.monitor io.nonblocking io.buffers io.files io sequences +hashtables sorting arrays ; IN: io.windows.nt.monitor -TUPLE: monitor handle recursive? buffer queue closed? ; +TUPLE: monitor path recursive? queue closed? ; : open-directory ( path -- handle ) - [ - FILE_LIST_DIRECTORY - share-mode - f - OPEN_EXISTING - FILE_FLAG_BACKUP_SEMANTICS FILE_FLAG_OVERLAPPED bitor - f - CreateFile dup invalid-handle? dup close-later - ] with-destructors ; - -: buffer-size 65536 ; inline + FILE_LIST_DIRECTORY + share-mode + f + OPEN_EXISTING + FILE_FLAG_BACKUP_SEMANTICS FILE_FLAG_OVERLAPPED bitor + f + CreateFile + dup invalid-handle? + dup close-later + dup add-completion + f ; M: windows-nt-io ( path recursive? -- monitor ) [ - >r open-directory r> - buffer-size malloc dup free-later f - ] with-destructors - f monitor construct-boa ; + >r dup open-directory monitor r> { + set-monitor-path + set-delegate + set-monitor-recursive? + } monitor construct + ] with-destructors ; : check-closed ( monitor -- ) - monitor-closed? [ "Monitor closed" throw ] when ; + port-type closed eq? [ "Monitor closed" throw ] when ; -M: windows-nt-io close-monitor ( monitor -- ) - dup check-closed - dup monitor-buffer free - dup monitor-handle CloseHandle drop - t swap set-monitor-closed? ; +M: windows-nt-io close-monitor ( monitor -- ) stream-close ; -: fill-buffer ( monitor -- bytes ) +: begin-reading-changes ( monitor -- overlapped ) [ - dup monitor-handle - over monitor-buffer - buffer-size + dup port-handle win32-file-handle + over buffer-ptr + pick buffer-size roll monitor-recursive? 1 0 ? FILE_NOTIFY_CHANGE_ALL - 0 [ - f - f - ReadDirectoryChangesW win32-error=0/f - ] keep *uint + 0 + f + (make-overlapped) + [ ReadDirectoryChangesW win32-error=0/f ] keep ] with-destructors ; +: read-changes ( monitor -- bytes ) + dup begin-reading-changes swap [ save-callback ] 2keep + get-overlapped-result ; + : parse-action-flag ( action mask symbol -- action ) >r over bitand 0 > [ r> , ] [ r> drop ] if ; @@ -68,34 +71,30 @@ M: windows-nt-io close-monitor ( monitor -- ) drop ] { } make ; -: changed-file ( buffer -- changes path ) +: changed-file ( directory buffer -- changes path ) { FILE_NOTIFY_INFORMATION-FileName FILE_NOTIFY_INFORMATION-FileNameLength FILE_NOTIFY_INFORMATION-Action - } get-slots parse-action -rot memory>u16-string ; + } get-slots >r memory>u16-string path+ r> parse-action swap ; -: (changed-files) ( buffer -- ) - dup changed-file namespace [ append ] change-at - dup FILE_NOTIFY_INFORMATION-NextEntryOffset - dup zero? [ 2drop ] [ - swap (changed-files) - ] if ; +: (changed-files) ( directory buffer -- ) + 2dup changed-file namespace [ append ] change-at + dup FILE_NOTIFY_INFORMATION-NextEntryOffset dup zero? + [ 3drop ] [ swap (changed-files) ] if ; -: changed-files ( buffer len -- assoc ) - [ - zero? [ drop ] [ (changed-files) ] if - ] H{ } make-assoc ; +: changed-files ( directory buffer len -- assoc ) + [ zero? [ 2drop ] [ (changed-files) ] if ] H{ } make-assoc ; : fill-queue ( monitor -- ) - dup monitor-buffer - over fill-buffer changed-files + dup monitor-path over buffer-ptr pick read-changes + changed-files swap set-monitor-queue ; M: windows-nt-io next-change ( monitor -- path changes ) dup check-closed dup monitor-queue dup assoc-empty? [ - drop dup fill-queue next-change + drop dup fill-queue next-change ] [ nip delete-any prune natural-sort >array ] if ; diff --git a/extra/io/windows/nt/sockets/sockets.factor b/extra/io/windows/nt/sockets/sockets.factor index ae15e404d9..901ef9f170 100755 --- a/extra/io/windows/nt/sockets/sockets.factor +++ b/extra/io/windows/nt/sockets/sockets.factor @@ -44,12 +44,11 @@ TUPLE: ConnectEx-args port "stdcall" alien-indirect drop winsock-error-string [ throw ] when* ; -: check-connect-error ( ConnectEx -- ) - ConnectEx-args-port duplex-stream-in get-overlapped-result drop ; - : connect-continuation ( ConnectEx -- ) - [ ConnectEx-args-port duplex-stream-in save-callback ] keep - check-connect-error ; + dup ConnectEx-args-lpOverlapped* + swap ConnectEx-args-port duplex-stream-in + [ save-callback ] 2keep + get-overlapped-result drop ; M: windows-nt-io (client) ( addrspec -- duplex-stream ) [ @@ -64,10 +63,6 @@ M: windows-nt-io (client) ( addrspec -- duplex-stream ) dup ConnectEx-args-s* dup handle>duplex-stream over set-ConnectEx-args-port - [ - dup ConnectEx-args-lpOverlapped* - swap ConnectEx-args-port duplex-stream-in set-port-overlapped - ] keep dup connect-continuation ConnectEx-args-port [ duplex-stream-in pending-error ] keep @@ -93,8 +88,7 @@ TUPLE: AcceptEx-args port over set-AcceptEx-args-sAcceptSocket* 0 over set-AcceptEx-args-dwReceiveDataLength* f over set-AcceptEx-args-lpdwBytesReceived* - (make-overlapped) over set-AcceptEx-args-lpOverlapped* - dup AcceptEx-args-lpOverlapped* swap AcceptEx-args-port set-port-overlapped ; + (make-overlapped) swap set-AcceptEx-args-lpOverlapped* ; : (accept) ( AcceptEx -- ) \ AcceptEx-args >tuple*< @@ -102,10 +96,12 @@ TUPLE: AcceptEx-args port winsock-error-string [ throw ] when* ; : make-accept-continuation ( AcceptEx -- ) - AcceptEx-args-port save-callback ; + dup AcceptEx-args-lpOverlapped* + swap AcceptEx-args-port save-callback ; : check-accept-error ( AcceptEx -- ) - AcceptEx-args-port get-overlapped-result drop ; + dup AcceptEx-args-lpOverlapped* + swap AcceptEx-args-port get-overlapped-result drop ; : extract-remote-host ( AcceptEx -- addrspec ) [ @@ -184,21 +180,18 @@ TUPLE: WSARecvFrom-args port 1 over set-WSARecvFrom-args-dwBufferCount* 0 malloc-int dup free-always over set-WSARecvFrom-args-lpFlags* 0 malloc-int dup free-always over set-WSARecvFrom-args-lpNumberOfBytesRecvd* - (make-overlapped) [ over set-WSARecvFrom-args-lpOverlapped* ] keep - swap WSARecvFrom-args-port set-port-overlapped ; + (make-overlapped) swap set-WSARecvFrom-args-lpOverlapped* ; -: make-WSARecvFrom-continuation ( WSARecvFrom -- ) - WSARecvFrom-args-port save-callback ; +: WSARecvFrom-continuation ( WSARecvFrom -- n ) + dup WSARecvFrom-args-lpOverlapped* + swap WSARecvFrom-args-port [ save-callback ] 2keep + get-overlapped-result ; : call-WSARecvFrom ( WSARecvFrom -- ) \ WSARecvFrom-args >tuple*< WSARecvFrom socket-error* ; -: WSARecvFrom-continuation ( WSARecvFrom -- n ) - [ make-WSARecvFrom-continuation ] keep - WSARecvFrom-args-port get-overlapped-result ; - : parse-WSARecvFrom ( n WSARecvFrom -- packet addrspec ) [ WSARecvFrom-args-lpBuffers* WSABUF-buf @@ -225,7 +218,7 @@ TUPLE: WSASendTo-args port : init-WSASendTo ( packet addrspec datagram WSASendTo -- ) [ set-WSASendTo-args-port ] 2keep [ - >r delegate port-handle delegate win32-file-handle r> + >r delegate port-handle win32-file-handle r> set-WSASendTo-args-s* ] keep [ >r make-sockaddr/size >r @@ -242,15 +235,13 @@ TUPLE: WSASendTo-args port ] keep 1 over set-WSASendTo-args-dwBufferCount* 0 over set-WSASendTo-args-dwFlags* - (make-overlapped) [ over set-WSASendTo-args-lpOverlapped* ] keep - swap WSASendTo-args-port set-port-overlapped ; - -: make-WSASendTo-continuation ( WSASendTo -- ) - WSASendTo-args-port save-callback ; + (make-overlapped) swap set-WSASendTo-args-lpOverlapped* ; : WSASendTo-continuation ( WSASendTo -- ) - [ make-WSASendTo-continuation ] keep - WSASendTo-args-port get-overlapped-result drop ; + dup WSASendTo-args-lpOverlapped* + swap WSASendTo-args-port + [ save-callback ] 2keep + get-overlapped-result drop ; : call-WSASendTo ( WSASendTo -- ) \ WSASendTo-args >tuple*< diff --git a/extra/io/windows/windows.factor b/extra/io/windows/windows.factor index efac6cb1cc..03cb3be9ae 100755 --- a/extra/io/windows/windows.factor +++ b/extra/io/windows/windows.factor @@ -15,10 +15,9 @@ M: windows-io destruct-handle CloseHandle drop ; M: windows-io destruct-socket closesocket drop ; -TUPLE: win32-file handle ptr overlapped ; +TUPLE: win32-file handle ptr ; -: ( handle ptr -- obj ) - f win32-file construct-boa ; +C: win32-file : ( in out -- stream ) >r f r> f handle>duplex-stream ; From afb8ac566e3c7aac9c2a2e6abed520ccb53e6beb Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sun, 27 Jan 2008 22:11:05 -0800 Subject: [PATCH 120/216] Reorder the ui notify loop to update graft state before calling graft*/ungraft*, avoiding the death problem without sacrificing performance --- extra/line-art/line-art.factor | 5 ++++- extra/ui/ui.factor | 10 ++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/extra/line-art/line-art.factor b/extra/line-art/line-art.factor index 054f07f63f..9eb3dc2dda 100644 --- a/extra/line-art/line-art.factor +++ b/extra/line-art/line-art.factor @@ -187,7 +187,10 @@ main() ] if ; M: line-art-gadget graft* ( gadget -- ) - "2.0" { "GL_ARB_draw_buffers" "GL_ARB_shader_objects" "GL_ARB_multitexture" } + "2.0" { "GL_ARB_draw_buffers" + "GL_ARB_shader_objects" + "GL_ARB_multitexture" + "GL_ARB_texture_float" } require-gl-version-or-extensions { "GL_EXT_framebuffer_object" } require-gl-extensions GL_CULL_FACE glEnable diff --git a/extra/ui/ui.factor b/extra/ui/ui.factor index febb56e10f..8fc7247257 100755 --- a/extra/ui/ui.factor +++ b/extra/ui/ui.factor @@ -120,12 +120,10 @@ SYMBOL: ui-hook [ dup update-hand draw-world ] each ; : notify ( gadget -- ) - dup gadget-graft-state { - { { f t } [ dup activate-control dup graft* ] } - { { t f } [ dup activate-control dup ungraft* ] } - } case - dup gadget-graft-state first { f f } { t t } ? - swap set-gadget-graft-state ; + dup gadget-graft-state dup first { f f } { t t } ? pick set-gadget-graft-state { + { { f t } [ dup activate-control graft* ] } + { { t f } [ dup activate-control ungraft* ] } + } case ; : notify-queued ( -- ) graft-queue [ notify ] dlist-slurp ; From 7e0674bf03ee07bbe3dce874ecc54810e98074e0 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sun, 27 Jan 2008 22:17:11 -0800 Subject: [PATCH 121/216] 64 characters per line or death!!!! --- extra/ui/ui.factor | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/extra/ui/ui.factor b/extra/ui/ui.factor index 8fc7247257..0baa4df65b 100755 --- a/extra/ui/ui.factor +++ b/extra/ui/ui.factor @@ -120,7 +120,9 @@ SYMBOL: ui-hook [ dup update-hand draw-world ] each ; : notify ( gadget -- ) - dup gadget-graft-state dup first { f f } { t t } ? pick set-gadget-graft-state { + dup gadget-graft-state + dup first { f f } { t t } ? + pick set-gadget-graft-state { { { f t } [ dup activate-control graft* ] } { { t f } [ dup activate-control ungraft* ] } } case ; From 47e991649c5d6f6122a6192e2ba42c8aee2f934f Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Mon, 28 Jan 2008 01:06:01 -0600 Subject: [PATCH 122/216] USE byte-arrays in opengl --- extra/opengl/opengl.factor | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/extra/opengl/opengl.factor b/extra/opengl/opengl.factor index f84aac56de..4ea91b867b 100755 --- a/extra/opengl/opengl.factor +++ b/extra/opengl/opengl.factor @@ -2,9 +2,10 @@ ! Portions copyright (C) 2007 Eduardo Cavazos. ! Portions copyright (C) 2008 Joe Groff. ! See http://factorcode.org/license.txt for BSD license. -USING: alien alien.c-types continuations kernel libc math macros namespaces -math.vectors math.constants math.functions math.parser opengl.gl opengl.glu -combinators arrays sequences splitting words ; +USING: alien alien.c-types continuations kernel libc math macros +namespaces math.vectors math.constants math.functions +math.parser opengl.gl opengl.glu combinators arrays sequences +splitting words byte-arrays ; IN: opengl : coordinates [ first2 ] 2apply ; From 417e47585790efd54e04c3a8514413845bb61381 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Mon, 28 Jan 2008 01:06:27 -0600 Subject: [PATCH 123/216] Clean up UDP a little --- extra/io/windows/nt/sockets/sockets.factor | 32 ++++++++++++---------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/extra/io/windows/nt/sockets/sockets.factor b/extra/io/windows/nt/sockets/sockets.factor index 901ef9f170..6c7db33ee3 100755 --- a/extra/io/windows/nt/sockets/sockets.factor +++ b/extra/io/windows/nt/sockets/sockets.factor @@ -162,6 +162,11 @@ TUPLE: WSARecvFrom-args port s* lpBuffers* dwBufferCount* lpNumberOfBytesRecvd* lpFlags* lpFrom* lpFromLen* lpOverlapped* lpCompletionRoutine* ; +: make-receive-buffer ( -- WSABUF ) + "WSABUF" malloc-object dup free-always + default-buffer-size get over set-WSABUF-len + default-buffer-size get malloc dup free-always over set-WSABUF-buf ; + : init-WSARecvFrom ( datagram WSARecvFrom -- ) [ set-WSARecvFrom-args-port ] 2keep [ @@ -172,11 +177,7 @@ TUPLE: WSARecvFrom-args port 2dup >r malloc dup free-always r> set-WSARecvFrom-args-lpFrom* >r malloc-int dup free-always r> set-WSARecvFrom-args-lpFromLen* ] keep - "WSABUF" malloc-object dup free-always - 2dup swap set-WSARecvFrom-args-lpBuffers* - default-buffer-size get [ malloc dup free-always ] keep - pick set-WSABUF-len - swap set-WSABUF-buf + make-receive-buffer over set-WSARecvFrom-args-lpBuffers* 1 over set-WSARecvFrom-args-dwBufferCount* 0 malloc-int dup free-always over set-WSARecvFrom-args-lpFlags* 0 malloc-int dup free-always over set-WSARecvFrom-args-lpNumberOfBytesRecvd* @@ -215,26 +216,29 @@ TUPLE: WSASendTo-args port s* lpBuffers* dwBufferCount* lpNumberOfBytesSent* dwFlags* lpTo* iToLen* lpOverlapped* lpCompletionRoutine* ; +: make-send-buffer ( packet -- WSABUF ) + "WSABUF" malloc-object dup free-always + over malloc-byte-array dup free-always over set-WSABUF-buf + swap length over set-WSABUF-len ; + : init-WSASendTo ( packet addrspec datagram WSASendTo -- ) [ set-WSASendTo-args-port ] 2keep [ - >r delegate port-handle win32-file-handle r> - set-WSASendTo-args-s* - ] keep [ + >r port-handle win32-file-handle r> set-WSASendTo-args-s* + ] keep + [ >r make-sockaddr/size >r malloc-byte-array dup free-always r> r> [ set-WSASendTo-args-iToLen* ] keep set-WSASendTo-args-lpTo* - ] keep [ - "WSABUF" malloc-object dup free-always - dup rot set-WSASendTo-args-lpBuffers* - swap [ malloc-byte-array dup free-always ] keep length - rot [ set-WSABUF-len ] keep - set-WSABUF-buf + ] keep + [ + >r make-send-buffer r> set-WSASendTo-args-lpBuffers* ] keep 1 over set-WSASendTo-args-dwBufferCount* 0 over set-WSASendTo-args-dwFlags* + 0 over set-WSASendTo-args-lpNumberOfBytesSent* (make-overlapped) swap set-WSASendTo-args-lpOverlapped* ; : WSASendTo-continuation ( WSASendTo -- ) From 840c401cb5fb8d2fc1739708589e960e0035bb50 Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Mon, 28 Jan 2008 02:19:04 -0500 Subject: [PATCH 124/216] Solution to Project Euler problem 33 --- extra/project-euler/033/033.factor | 55 ++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 extra/project-euler/033/033.factor diff --git a/extra/project-euler/033/033.factor b/extra/project-euler/033/033.factor new file mode 100644 index 0000000000..6f29c3519e --- /dev/null +++ b/extra/project-euler/033/033.factor @@ -0,0 +1,55 @@ +! Copyright (c) 2008 Aaron Schaefer. +! See http://factorcode.org/license.txt for BSD license. +USING: kernel math math.ranges project-euler.common sequences ; +IN: project-euler.033 + +! http://projecteuler.net/index.php?section=problems&id=33 + +! DESCRIPTION +! ----------- + +! The fraction 49/98 is a curious fraction, as an inexperienced mathematician +! in attempting to simplify it may incorrectly believe that 49/98 = 4/8, which +! is correct, is obtained by cancelling the 9s. + +! We shall consider fractions like, 30/50 = 3/5, to be trivial examples. + +! There are exactly four non-trivial examples of this type of fraction, less +! than one in value, and containing two digits in the numerator and +! denominator. + +! If the product of these four fractions is given in its lowest common terms, +! find the value of the denominator. + + +! SOLUTION +! -------- + +! Through analysis, you only need to check fractions fitting the pattern ax/xb + + + +: euler033 ( -- answer ) + source-033 curious-fractions product denominator ; + +! [ euler033 ] 100 ave-time +! 5 ms run / 0 ms GC ave time - 100 trials + +MAIN: euler033 From 19555da91c6e90f198afb07dc2d7b56da7b45a4e Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Mon, 28 Jan 2008 01:21:44 -0600 Subject: [PATCH 125/216] Non-blocking directory change notification support for Windows --- extra/io/windows/nt/backend/backend.factor | 7 +----- extra/io/windows/nt/monitor/monitor.factor | 25 +++++++++++----------- 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/extra/io/windows/nt/backend/backend.factor b/extra/io/windows/nt/backend/backend.factor index 0aaa935a7e..3b10ddd935 100755 --- a/extra/io/windows/nt/backend/backend.factor +++ b/extra/io/windows/nt/backend/backend.factor @@ -48,12 +48,7 @@ TUPLE: io-callback port continuation ; C: io-callback : (make-overlapped) ( -- overlapped-ext ) - "OVERLAPPED" malloc-object dup free-always - 0 over set-OVERLAPPED-internal - 0 over set-OVERLAPPED-internal-high - 0 over set-OVERLAPPED-offset-high - 0 over set-OVERLAPPED-offset - f over set-OVERLAPPED-event ; + "OVERLAPPED" malloc-object dup free-always ; : make-overlapped ( port -- overlapped-ext ) >r (make-overlapped) r> port-handle win32-file-ptr diff --git a/extra/io/windows/nt/monitor/monitor.factor b/extra/io/windows/nt/monitor/monitor.factor index c8714b33cc..bd3debecad 100755 --- a/extra/io/windows/nt/monitor/monitor.factor +++ b/extra/io/windows/nt/monitor/monitor.factor @@ -37,21 +37,20 @@ M: windows-nt-io ( path recursive? -- monitor ) M: windows-nt-io close-monitor ( monitor -- ) stream-close ; : begin-reading-changes ( monitor -- overlapped ) - [ - dup port-handle win32-file-handle - over buffer-ptr - pick buffer-size - roll monitor-recursive? 1 0 ? - FILE_NOTIFY_CHANGE_ALL - 0 - f - (make-overlapped) - [ ReadDirectoryChangesW win32-error=0/f ] keep - ] with-destructors ; + dup port-handle win32-file-handle + over buffer-ptr + pick buffer-size + roll monitor-recursive? 1 0 ? + FILE_NOTIFY_CHANGE_ALL + 0 + (make-overlapped) + [ f ReadDirectoryChangesW win32-error=0/f ] keep ; : read-changes ( monitor -- bytes ) - dup begin-reading-changes swap [ save-callback ] 2keep - get-overlapped-result ; + [ + dup begin-reading-changes swap [ save-callback ] 2keep + get-overlapped-result + ] with-destructors ; : parse-action-flag ( action mask symbol -- action ) >r over bitand 0 > [ r> , ] [ r> drop ] if ; From 38bc7d7f7542af4b90f6d1803fea4c9c00f18f77 Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Mon, 28 Jan 2008 03:37:14 -0500 Subject: [PATCH 126/216] Solution to Project Euler problem 34 --- extra/project-euler/034/034.factor | 47 ++++++++++++++++++++++++ extra/project-euler/common/common.factor | 4 +- extra/project-euler/project-euler.factor | 5 ++- 3 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 extra/project-euler/034/034.factor diff --git a/extra/project-euler/034/034.factor b/extra/project-euler/034/034.factor new file mode 100644 index 0000000000..83cffeb248 --- /dev/null +++ b/extra/project-euler/034/034.factor @@ -0,0 +1,47 @@ +! Copyright (c) 2008 Aaron Schaefer. +! See http://factorcode.org/license.txt for BSD license. +USING: combinators.lib kernel math.ranges project-euler.common sequences ; +IN: project-euler.034 + +! http://projecteuler.net/index.php?section=problems&id=34 + +! DESCRIPTION +! ----------- + +! 145 is a curious number, as 1! + 4! + 5! = 1 + 24 + 120 = 145. + +! Find the sum of all numbers which are equal to the sum of the factorial of +! their digits. + +! Note: as 1! = 1 and 2! = 2 are not sums they are not included. + + +! SOLUTION +! -------- + +! We can reduce the upper bound a little by calculating 7 * 9! = 2540160, and +! then reducing one of the 9! to 2! (since the 7th digit cannot exceed 2), so we +! get 2! + 6 * 9! = 2177282 as an upper bound. + +! We can then take that one more step, and notice that the largest factorial +! sum a 7 digit number starting with 21 or 20 is 2! + 1! + 5 * 9! or 1814403. +! So there can't be any 7 digit solutions starting with 21 or 20, and therefore +! our numbers must be less that 2000000. + +digits [ digit-factorial ] sigma = ; + +PRIVATE> + +: euler034 ( -- answer ) + 3 2000000 [a,b] [ factorion? ] subset sum ; + +! [ euler034 ] 10 ave-time +! 15089 ms run / 725 ms GC ave time - 10 trials + +MAIN: euler034 diff --git a/extra/project-euler/common/common.factor b/extra/project-euler/common/common.factor index c875a440ba..2e718ab5a2 100644 --- a/extra/project-euler/common/common.factor +++ b/extra/project-euler/common/common.factor @@ -7,11 +7,11 @@ IN: project-euler.common ! Problems using each public word ! ------------------------------- -! cartesian-product - #4, #27 +! cartesian-product - #4, #27, #29, #32, #33 ! collect-consecutive - #8, #11 ! log10 - #25, #134 ! max-path - #18, #67 -! number>digits - #16, #20, #30 +! number>digits - #16, #20, #30, #34 ! propagate-all - #18, #67 ! sum-proper-divisors - #21 ! tau* - #12 diff --git a/extra/project-euler/project-euler.factor b/extra/project-euler/project-euler.factor index 329a1b9668..74577debd9 100644 --- a/extra/project-euler/project-euler.factor +++ b/extra/project-euler/project-euler.factor @@ -1,4 +1,4 @@ -! Copyright (c) 2007 Aaron Schaefer. +! Copyright (c) 2007, 2008 Aaron Schaefer. ! See http://factorcode.org/license.txt for BSD license. USING: definitions io io.files kernel math.parser sequences vocabs vocabs.loader project-euler.ave-time project-euler.common math @@ -9,7 +9,8 @@ USING: definitions io io.files kernel math.parser sequences vocabs project-euler.017 project-euler.018 project-euler.019 project-euler.020 project-euler.021 project-euler.022 project-euler.023 project-euler.024 project-euler.025 project-euler.026 project-euler.027 project-euler.028 - project-euler.029 project-euler.030 project-euler.067 project-euler.134 + project-euler.029 project-euler.030 project-euler.031 project-euler.032 + project-euler.033 project-euler.034 project-euler.067 project-euler.134 project-euler.169 project-euler.173 project-euler.175 ; IN: project-euler From bc67dbb2f29a05e9fe092628d856b64e6aeb7453 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Mon, 28 Jan 2008 18:13:35 -0600 Subject: [PATCH 127/216] Working on Ruby.mn talk --- extra/calendar/calendar.factor | 24 +-- extra/calendar/model/model.factor | 15 ++ extra/catalyst-talk/catalyst-talk.factor | 121 -------------- extra/lcd/lcd.factor | 20 +-- .../authors.txt | 0 .../deploy.factor | 0 .../minneapolis-talk/minneapolis-talk.factor | 149 ++++++++++++++++++ extra/minneapolis-talk/minneapolis-talk.txt | 116 ++++++++++++++ .../summary.txt | 0 .../tags.txt | 0 extra/ui/gadgets/labels/labels.factor | 2 +- 11 files changed, 304 insertions(+), 143 deletions(-) create mode 100755 extra/calendar/model/model.factor delete mode 100644 extra/catalyst-talk/catalyst-talk.factor mode change 100644 => 100755 extra/lcd/lcd.factor rename extra/{catalyst-talk => minneapolis-talk}/authors.txt (100%) rename extra/{catalyst-talk => minneapolis-talk}/deploy.factor (100%) create mode 100755 extra/minneapolis-talk/minneapolis-talk.factor create mode 100755 extra/minneapolis-talk/minneapolis-talk.txt rename extra/{catalyst-talk => minneapolis-talk}/summary.txt (100%) rename extra/{catalyst-talk => minneapolis-talk}/tags.txt (100%) diff --git a/extra/calendar/calendar.factor b/extra/calendar/calendar.factor index 8c1c2fb3a6..a1fe0a55ea 100755 --- a/extra/calendar/calendar.factor +++ b/extra/calendar/calendar.factor @@ -333,16 +333,18 @@ M: integer year. ( n -- ) M: timestamp year. ( timestamp -- ) timestamp-year year. ; -: pad-00 number>string 2 CHAR: 0 pad-left write ; +: pad-00 number>string 2 CHAR: 0 pad-left ; + +: write-00 pad-00 write ; : (timestamp>string) ( timestamp -- ) dup day-of-week day-abbreviations3 nth write ", " write dup timestamp-day number>string write bl dup timestamp-month month-abbreviations nth write bl dup timestamp-year number>string write bl - dup timestamp-hour pad-00 ":" write - dup timestamp-minute pad-00 ":" write - timestamp-second >fixnum pad-00 ; + dup timestamp-hour write-00 ":" write + dup timestamp-minute write-00 ":" write + timestamp-second >fixnum write-00 ; : timestamp>string ( timestamp -- str ) [ (timestamp>string) ] string-out ; @@ -357,11 +359,11 @@ M: timestamp year. ( timestamp -- ) : (timestamp>rfc3339) ( timestamp -- ) dup timestamp-year number>string write CHAR: - write1 - dup timestamp-month pad-00 CHAR: - write1 - dup timestamp-day pad-00 CHAR: T write1 - dup timestamp-hour pad-00 CHAR: : write1 - dup timestamp-minute pad-00 CHAR: : write1 - timestamp-second >fixnum pad-00 CHAR: Z write1 ; + dup timestamp-month write-00 CHAR: - write1 + dup timestamp-day write-00 CHAR: T write1 + dup timestamp-hour write-00 CHAR: : write1 + dup timestamp-minute write-00 CHAR: : write1 + timestamp-second >fixnum write-00 CHAR: Z write1 ; : timestamp>rfc3339 ( timestamp -- str ) >gmt [ (timestamp>rfc3339) ] string-out ; @@ -390,8 +392,8 @@ M: timestamp year. ( timestamp -- ) [ timestamp-month month-abbreviations nth write ] keep bl [ timestamp-day number>string 2 32 pad-left write ] keep bl dup now [ timestamp-year ] 2apply = [ - [ timestamp-hour pad-00 ] keep ":" write - timestamp-minute pad-00 + [ timestamp-hour write-00 ] keep ":" write + timestamp-minute write-00 ] [ timestamp-year number>string 5 32 pad-left write ] if diff --git a/extra/calendar/model/model.factor b/extra/calendar/model/model.factor new file mode 100755 index 0000000000..d07f4b4559 --- /dev/null +++ b/extra/calendar/model/model.factor @@ -0,0 +1,15 @@ +! Copyright (C) 2008 Slava Pestov +! See http://factorcode.org/license.txt for BSD license. +USING: calendar namespaces models threads ; +IN: calendar.model + +SYMBOL: time + +: (time-thread) ( -- ) + now time get set-model + 1000 sleep (time-thread) ; + +: time-thread ( -- ) [ (time-thread) ] in-thread ; + +f time set-global +time-thread diff --git a/extra/catalyst-talk/catalyst-talk.factor b/extra/catalyst-talk/catalyst-talk.factor deleted file mode 100644 index f76ef4db9e..0000000000 --- a/extra/catalyst-talk/catalyst-talk.factor +++ /dev/null @@ -1,121 +0,0 @@ -USING: slides help.markup math arrays hashtables namespaces -sequences kernel sequences parser ; -IN: catalyst-talk - -: catalyst-slides -{ - { $slide "What is Factor?" - "Originally scripting for a Java game" - "Language dev more fun than game dev" - "Start with ideas which were mostly dead" - "Throw in features from crazy languages" - "Develop practical libraries and tools" - } - { $slide "Factor: a stack language" - "Implicit parameter passing" - { "Each " { $emphasis "word" } " is a function call" } - { $code ": sq dup * ;" } - { $code "2 3 + sq ." } - "Minimal syntax and semantics = easy meta-programming" - { "Related languages: Forth, Joy, PostScript" } - } - { $slide "Factor: a functional language" - { { $emphasis "Quotations" } " can be passed around, constructed..." } - { $code "[ sq 3 + ]" } - { { $emphasis "Combinators" } " are words which take quotations, eg " { $link if } } - { "For FP buffs: " { $link each } ", " { $link map } ", " { $link reduce } ", " { $link accumulate } ", " { $link interleave } ", " { $link subset } } - { $code "{ 42 69 666 } [ sq 3 + ] map ." } - } - { $slide "Factor: an object-oriented language" - { "Everything is an " { $emphasis "object" } } - { "An object is an instance of a " { $emphasis "class" } } - "Methods" - "Generic words" - "For CLOS buffs: we allow custom method combination, classes are objects too, there's a MOP" - } - - STRIP-TEASE: - $slide "Primary school geometry recap" - { $code - "GENERIC: area ( shape -- meters^2 )" - "TUPLE: square dimension ;" - "M: square area square-dimension sq ;" - "TUPLE: circle radius ;" - "M: circle area circle-radius sq pi * ;" - "TUPLE: rectangle width height ;" - "M: rectangle area" - " dup rectangle-width" - " swap rectangle-height" - " * ;" - } - ; - - { $slide "Geometry example" - { $code "10 area ." } - { $code "18 area ." } - { $code "20 40 area ." } - } -! { $slide "Factor: a meta language" -! "Writing code which writes code" -! "Extensible parser: define new syntax" -! "Compiler transforms" -! "Here's an inefficient word:" -! { $code -! ": fib ( x -- y )" -! " dup 1 > [" -! " 1 - dup fib swap 1 - fib +" -! " ] when ;" -! } -! } -! { $slide "Memoization" -! { { $link POSTPONE: : } " is just another word" } -! "What if we could define a word which caches its results?" -! { "The " { $vocab-link "memoize" } " library provides such a feature" } -! { "Just change " { $link POSTPONE: : } " to " { $link POSTPONE: MEMO: } } -! { $code -! "MEMO: fib ( x -- y )" -! " dup 1 > [" -! " 1 - dup fib swap 1 - fib +" -! " ] when ;" -! } -! } - { $slide "Factor: a tool-building language" - "Tools are not monolithic, but are themselves just sets of words" - "Examples: parser, compiler, etc" - "Parser: turns strings into objects" - { $code "\"1\" contents parse" } - "Prettyprinter: turns objects into strings" - { $code "\"2\" [ . ] with-stream" } - } - { $slide "Factor: an interactive language" - { "Let's hack " { $vocab-link "tetris" } } - "Editor integration" - { $code "\\ tetrominoes edit" } - "Inspector" - { $code "\\ tetrominoes get inspect" } - } - { $slide "C library interface" - "No need to write C glue code!" - "Callbacks from C to Factor" - "Factor can be embedded in C apps" - { "Example: " { $vocab-link "ogg.vorbis" } } - { "Other bindings: OpenGL, OpenAL, X11, Win32, Cocoa, OpenSSL, memory mapped files, ..." } - } - { $slide "Native libraries" - "XML, HTTP, SMTP, Unicode, calendar, ..." - "Lazy lists, pattern matching, packed arrays, ..." - } - { $slide "Factor: a fun language" - { "Let's play " - { $vocab-link "space-invaders" } - } - { $url "http://factorcode.org" } - { $url "http://factor-language.blogspot.com" } - "irc.freenode.net #concatenative" - "Have fun!" - } -} ; - -: catalyst-talk catalyst-slides slides-window ; - -MAIN: catalyst-talk diff --git a/extra/lcd/lcd.factor b/extra/lcd/lcd.factor old mode 100644 new mode 100755 index 192e4053d4..605ac4cd59 --- a/extra/lcd/lcd.factor +++ b/extra/lcd/lcd.factor @@ -1,19 +1,19 @@ USING: sequences kernel math io ; IN: lcd -: lcd-digit ( digit row -- str ) - { - " _ _ _ _ _ _ _ _ " - " | | | _| _| |_| |_ |_ | |_| |_| " - " |_| | |_ _| | _| |_| | |_| | " +: lcd-digit ( row digit -- str ) + dup CHAR: : = [ drop 10 ] [ CHAR: 0 - ] if swap { + " _ _ _ _ _ _ _ _ " + " | | | _| _| |_| |_ |_ | |_| |_| * " + " |_| | |_ _| | _| |_| | |_| | * " } nth >r 4 * dup 4 + r> subseq ; -: lcd-row ( num row -- ) - swap [ CHAR: 0 - swap lcd-digit write ] with each ; +: lcd-row ( num row -- string ) + [ swap lcd-digit ] curry { } map-as concat ; -: lcd ( digit-str -- ) - 3 [ lcd-row nl ] with each ; +: lcd ( digit-str -- string ) + 3 [ lcd-row ] with map "\n" join ; -: lcd-demo ( -- ) "31337" lcd ; +: lcd-demo ( -- ) "31337" lcd print ; MAIN: lcd-demo diff --git a/extra/catalyst-talk/authors.txt b/extra/minneapolis-talk/authors.txt similarity index 100% rename from extra/catalyst-talk/authors.txt rename to extra/minneapolis-talk/authors.txt diff --git a/extra/catalyst-talk/deploy.factor b/extra/minneapolis-talk/deploy.factor similarity index 100% rename from extra/catalyst-talk/deploy.factor rename to extra/minneapolis-talk/deploy.factor diff --git a/extra/minneapolis-talk/minneapolis-talk.factor b/extra/minneapolis-talk/minneapolis-talk.factor new file mode 100755 index 0000000000..149451721f --- /dev/null +++ b/extra/minneapolis-talk/minneapolis-talk.factor @@ -0,0 +1,149 @@ +USING: slides help.markup math arrays hashtables namespaces +sequences kernel sequences parser ; +IN: minneapolis-talk + +: minneapolis-slides +{ + { $slide "What is Factor?" + "Dynamically typed, stack language" + "Have our cake and eat it too" + "Research -vs- production" + "High level -vs- performance" + "Interactive -vs- stand-alone apps" + } + { $slide "The view from 10,000 feet" + "Influenced by Forth, Lisp, Joy, Smalltalk, even Java..." + "Vocabularies: modules" + "Words: named functions, classes, variables" + "Combinators: higher-order functions" + "Quotations: anonymous functions" + "Other concepts are familiar: classes, objects, etc" + } + { $slide "Stack-based programming" + { "Most languages are " { $emphasis "applicative" } } + "Words pop inputs from the stack and push outputs on the stack" + "Literals are pushed on the stack" + { $code "{ 1 2 } { 7 } append reverse sum ." } + "With the stack you can omit unnecessary names" + "You can still name things: lexical/dynamic variables, sequences, associations, objects, ..." + } + { $slide "Functional programming" + "A quotation is a sequence of literals and words" + "Combinators replace imperative-style loops" + "A simple example:" + { $code "10 [ \"Hello world\" print ] times" } + { "Partial application: " { $link curry } } + { $code "{ 3 1 3 3 7 } [ 5 + ] map ." } + { $code "{ 3 1 3 3 7 } 5 [ + ] curry map ." } + } + { $slide "Word definitions" + { $code ": name ( inputs -- outputs ) definition ;" } + "Stack effect comments document stack inputs and outputs." + "Example from previous slide:" + { $code ": add-each ( seq n -- newseq ) [ + ] curry map ;" } + { $code "{ 3 1 3 3 7 } add-each ." } + "Copy and paste factoring" + } + { $slide "Object-oriented programming" + "Define a tuple class and a constructor:" + { $code + "TUPLE: person name address ;" + "C: person" + } + "Create an instance:" + { $code "\"Cosmo Kramer\" \"100 Blah blah St, New York\" " } + "We can inspect it and edit it" + "We can reshape the class:" + { $code "TUPLE: person name address age phone-number ;" } + { $code "TUPLE: person name address phone-number age ;" } + } + STRIP-TEASE: + $slide "Primary school geometry recap" + { $code + "TUPLE: square dimension ;" + "TUPLE: circle radius ;" + "TUPLE: rectangle width height ;" + "" + "GENERIC: area ( shape -- meters^2 )" + "M: square area square-dimension sq ;" + "M: circle area circle-radius sq pi * ;" + "M: rectangle area" + " { rectangle-width rectangle-height } get-slots * ;" + } + ; + + { $slide "Geometry example" + { $code "10 area ." } + { $code "18 area ." } + { $code "20 40 area ." } + } + { $slide "Factor: a meta language" + "Here's fibonacci:" + { $code + ": fib ( x -- y )" + " dup 1 > [" + " 1 - dup fib swap 1 - fib +" + " ] when ;" + } + "It is slow:" + { $code + "20 [ fib ] map ." + } + "Let's profile it!" + } + { $slide "Memoization" + { { $link POSTPONE: : } " is just another word" } + "What if we could define a word which caches its results?" + { "The " { $vocab-link "memoize" } " library provides such a feature" } + { "Just change " { $link POSTPONE: : } " to " { $link POSTPONE: MEMO: } } + { $code + "MEMO: fib ( x -- y )" + " dup 1 > [" + " 1 - dup fib swap 1 - fib +" + " ] when ;" + } + "It is faster:" + { $code + "20 [ fib ] map ." + } + } + { $slide "The Factor UI" + "Written in Factor" + "Renders with OpenGL" + "Backends for Windows, X11, Cocoa" + "You can call Windows, X11, Cocoa APIs directly too" + "OpenGL 2.1 shaders, OpenAL 3D audio..." + } + { $slide "Implementation" + "Very small C core" + "Non-optimizing compiler" + "Optimizing compiler" + "Generational garbage collector" + "Non-blocking I/O" + } + { $slide "Live coding demo" + + } + { $slide "C library interface" + "Efficient" + "No need to write C code" + "Supports floats, structs, unions, ..." + "Function pointers, callbacks" + } + { $slide "Live coding demo" + + } + { $slide "Community" + "Factor development began in 2003" + "About a dozen contributors" + "Handful of \"core contributors\"" + { "Web site: " { $url "http://factorcode.org" } } + "IRC: #concatenative on irc.freenode.net" + "Mailing list: factor-talk@lists.sf.net" + { "Let's play " { $vocab-link "space-invaders" } } + } +} ; + +: minneapolis-talk minneapolis-slides slides-window ; + +MAIN: minneapolis-talk diff --git a/extra/minneapolis-talk/minneapolis-talk.txt b/extra/minneapolis-talk/minneapolis-talk.txt new file mode 100755 index 0000000000..5310accf5b --- /dev/null +++ b/extra/minneapolis-talk/minneapolis-talk.txt @@ -0,0 +1,116 @@ +- how to create a small module +- editor integration +- presentations +- module system +- copy and paste factoring, inverse +- help system +- tetris +- memoization +- editing inspector demo +- dynamic scope, lexical scope + +Factor: contradictions? +----------------------- + +Have our cake and eat it too + +Research -vs- practical +High level -vs- fast +Interactive -vs- deployment + +Factor from 10,000 feet +----------------------- + +word: named function +vocabulary: module +quotation: anonymous function +classes, objects, etc. + +The stack +--------- + +- Stack -vs- applicative +- Pass by reference, dynamically typed +- Stack languages: you can omit names where they're not needed +- More compositional style +- If you need to name things for clarity, you can: + lexical vars, dynamic vars, sequences, assocs, objects... + +Functional programming +---------------------- + +Quotations +Curry +Continuations + +Object-oriented programming +--------------------------- + +Generic words: sort of like open classes +Tuple reshaping +Editing inspector + +Meta programming +---------------- + +Simple, orthogonal core + +Why use a stack at all? +----------------------- + +Nice idioms: 10 days ago +Copy and paste factoring +Easy meta-programming +Sequence operations correspond to functional operations: +- curry is adding at the front +- compose is append + +UI +-- + +Written in Factor +renders with OpenGL +Windows, X11, Cocoa backends +You can call Windows, X11, Cocoa APIs directly +OpenGL 2.1 shaders, OpenAL 3D audio... + +Tools +----- + +Edit +Usages +Profiler +Easy to make your own tools + +Implementation +-------------- + +Two compilers +Generational garbage collector +Non-blocking I/O + +Hands on +-------- + +Community +--------- + +Factor started in 2003 +About a dozen contributors +Handful of "core contributors" +Web site: http://factorcode.org +IRC: #concatenative on irc.freenode.net +Mailing list: factor-talk@lists.sf.net + +C library interface +------------------- + +Efficient +No need to write C code +Supports floats, structs, unions, ... +Function pointers, callbacks +Here is an example + +TerminateProcess + +process-handle TerminateProcess diff --git a/extra/catalyst-talk/summary.txt b/extra/minneapolis-talk/summary.txt similarity index 100% rename from extra/catalyst-talk/summary.txt rename to extra/minneapolis-talk/summary.txt diff --git a/extra/catalyst-talk/tags.txt b/extra/minneapolis-talk/tags.txt similarity index 100% rename from extra/catalyst-talk/tags.txt rename to extra/minneapolis-talk/tags.txt diff --git a/extra/ui/gadgets/labels/labels.factor b/extra/ui/gadgets/labels/labels.factor index 2ac0240ed1..5e5801dd02 100755 --- a/extra/ui/gadgets/labels/labels.factor +++ b/extra/ui/gadgets/labels/labels.factor @@ -40,7 +40,7 @@ M: label gadget-text* label-string % ; TUPLE: label-control ; M: label-control model-changed - swap model-value over set-label-text relayout ; + swap model-value over set-label-string relayout ; : ( model -- gadget ) ""