Path: blob/main_old/src/libGLESv1_CM/libGLESv1_CM.cpp
1693 views
//1// Copyright 2018 The ANGLE Project Authors. All rights reserved.2// Use of this source code is governed by a BSD-style license that can be3// found in the LICENSE file.4//56// libGLESv1_CM.cpp: Implements the exported OpenGL ES 1.0 functions.78#include "angle_gl.h"910#include "libGLESv2/entry_points_gles_1_0_autogen.h"11#include "libGLESv2/entry_points_gles_2_0_autogen.h"12#include "libGLESv2/entry_points_gles_3_2_autogen.h"13#include "libGLESv2/entry_points_gles_ext_autogen.h"1415extern "C" {1617void GL_APIENTRY glAlphaFunc(GLenum func, GLfloat ref)18{19return GL_AlphaFunc(func, ref);20}2122void GL_APIENTRY glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)23{24return GL_ClearColor(red, green, blue, alpha);25}2627void GL_APIENTRY glClearDepthf(GLfloat d)28{29return GL_ClearDepthf(d);30}3132void GL_APIENTRY glClipPlanef(GLenum p, const GLfloat *eqn)33{34return GL_ClipPlanef(p, eqn);35}3637void GL_APIENTRY glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)38{39return GL_Color4f(red, green, blue, alpha);40}4142void GL_APIENTRY glDepthRangef(GLfloat n, GLfloat f)43{44return GL_DepthRangef(n, f);45}4647void GL_APIENTRY glFogf(GLenum pname, GLfloat param)48{49return GL_Fogf(pname, param);50}5152void GL_APIENTRY glFogfv(GLenum pname, const GLfloat *params)53{54return GL_Fogfv(pname, params);55}5657void GL_APIENTRY glFrustumf(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f)58{59return GL_Frustumf(l, r, b, t, n, f);60}6162void GL_APIENTRY glGetClipPlanef(GLenum plane, GLfloat *equation)63{64return GL_GetClipPlanef(plane, equation);65}6667void GL_APIENTRY glGetFloatv(GLenum pname, GLfloat *data)68{69return GL_GetFloatv(pname, data);70}7172void GL_APIENTRY glGetLightfv(GLenum light, GLenum pname, GLfloat *params)73{74return GL_GetLightfv(light, pname, params);75}7677void GL_APIENTRY glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params)78{79return GL_GetMaterialfv(face, pname, params);80}8182void GL_APIENTRY glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params)83{84return GL_GetTexEnvfv(target, pname, params);85}8687void GL_APIENTRY glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params)88{89return GL_GetTexParameterfv(target, pname, params);90}9192void GL_APIENTRY glLightModelf(GLenum pname, GLfloat param)93{94return GL_LightModelf(pname, param);95}9697void GL_APIENTRY glLightModelfv(GLenum pname, const GLfloat *params)98{99return GL_LightModelfv(pname, params);100}101102void GL_APIENTRY glLightf(GLenum light, GLenum pname, GLfloat param)103{104return GL_Lightf(light, pname, param);105}106107void GL_APIENTRY glLightfv(GLenum light, GLenum pname, const GLfloat *params)108{109return GL_Lightfv(light, pname, params);110}111112void GL_APIENTRY glLineWidth(GLfloat width)113{114return GL_LineWidth(width);115}116117void GL_APIENTRY glLoadMatrixf(const GLfloat *m)118{119return GL_LoadMatrixf(m);120}121122void GL_APIENTRY glMaterialf(GLenum face, GLenum pname, GLfloat param)123{124return GL_Materialf(face, pname, param);125}126127void GL_APIENTRY glMaterialfv(GLenum face, GLenum pname, const GLfloat *params)128{129return GL_Materialfv(face, pname, params);130}131132void GL_APIENTRY glMultMatrixf(const GLfloat *m)133{134return GL_MultMatrixf(m);135}136137void GL_APIENTRY glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)138{139return GL_MultiTexCoord4f(target, s, t, r, q);140}141142void GL_APIENTRY glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz)143{144return GL_Normal3f(nx, ny, nz);145}146147void GL_APIENTRY glOrthof(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f)148{149return GL_Orthof(l, r, b, t, n, f);150}151152void GL_APIENTRY glPointParameterf(GLenum pname, GLfloat param)153{154return GL_PointParameterf(pname, param);155}156157void GL_APIENTRY glPointParameterfv(GLenum pname, const GLfloat *params)158{159return GL_PointParameterfv(pname, params);160}161162void GL_APIENTRY glPointSize(GLfloat size)163{164return GL_PointSize(size);165}166167void GL_APIENTRY glPolygonOffset(GLfloat factor, GLfloat units)168{169return GL_PolygonOffset(factor, units);170}171172void GL_APIENTRY glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)173{174return GL_Rotatef(angle, x, y, z);175}176177void GL_APIENTRY glScalef(GLfloat x, GLfloat y, GLfloat z)178{179return GL_Scalef(x, y, z);180}181182void GL_APIENTRY glTexEnvf(GLenum target, GLenum pname, GLfloat param)183{184return GL_TexEnvf(target, pname, param);185}186187void GL_APIENTRY glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params)188{189return GL_TexEnvfv(target, pname, params);190}191192void GL_APIENTRY glTexParameterf(GLenum target, GLenum pname, GLfloat param)193{194return GL_TexParameterf(target, pname, param);195}196197void GL_APIENTRY glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params)198{199return GL_TexParameterfv(target, pname, params);200}201202void GL_APIENTRY glTranslatef(GLfloat x, GLfloat y, GLfloat z)203{204return GL_Translatef(x, y, z);205}206207void GL_APIENTRY glActiveTexture(GLenum texture)208{209return GL_ActiveTexture(texture);210}211212void GL_APIENTRY glAlphaFuncx(GLenum func, GLfixed ref)213{214return GL_AlphaFuncx(func, ref);215}216217void GL_APIENTRY glBindBuffer(GLenum target, GLuint buffer)218{219return GL_BindBuffer(target, buffer);220}221222void GL_APIENTRY glBindTexture(GLenum target, GLuint texture)223{224return GL_BindTexture(target, texture);225}226227void GL_APIENTRY glBlendFunc(GLenum sfactor, GLenum dfactor)228{229return GL_BlendFunc(sfactor, dfactor);230}231232void GL_APIENTRY glBufferData(GLenum target, GLsizeiptr size, const void *data, GLenum usage)233{234return GL_BufferData(target, size, data, usage);235}236237void GL_APIENTRY glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void *data)238{239return GL_BufferSubData(target, offset, size, data);240}241242void GL_APIENTRY glClear(GLbitfield mask)243{244return GL_Clear(mask);245}246247void GL_APIENTRY glClearColorx(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha)248{249return GL_ClearColorx(red, green, blue, alpha);250}251252void GL_APIENTRY glClearDepthx(GLfixed depth)253{254return GL_ClearDepthx(depth);255}256257void GL_APIENTRY glClearStencil(GLint s)258{259return GL_ClearStencil(s);260}261262void GL_APIENTRY glClientActiveTexture(GLenum texture)263{264return GL_ClientActiveTexture(texture);265}266267void GL_APIENTRY glClipPlanex(GLenum plane, const GLfixed *equation)268{269return GL_ClipPlanex(plane, equation);270}271272void GL_APIENTRY glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)273{274return GL_Color4ub(red, green, blue, alpha);275}276277void GL_APIENTRY glColor4x(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha)278{279return GL_Color4x(red, green, blue, alpha);280}281282void GL_APIENTRY glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)283{284return GL_ColorMask(red, green, blue, alpha);285}286287void GL_APIENTRY glColorPointer(GLint size, GLenum type, GLsizei stride, const void *pointer)288{289return GL_ColorPointer(size, type, stride, pointer);290}291292void GL_APIENTRY glCompressedTexImage2D(GLenum target,293GLint level,294GLenum internalformat,295GLsizei width,296GLsizei height,297GLint border,298GLsizei imageSize,299const void *data)300{301return GL_CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize,302data);303}304305void GL_APIENTRY glCompressedTexSubImage2D(GLenum target,306GLint level,307GLint xoffset,308GLint yoffset,309GLsizei width,310GLsizei height,311GLenum format,312GLsizei imageSize,313const void *data)314{315return GL_CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format,316imageSize, data);317}318319void GL_APIENTRY glCopyTexImage2D(GLenum target,320GLint level,321GLenum internalformat,322GLint x,323GLint y,324GLsizei width,325GLsizei height,326GLint border)327{328return GL_CopyTexImage2D(target, level, internalformat, x, y, width, height, border);329}330331void GL_APIENTRY glCopyTexSubImage2D(GLenum target,332GLint level,333GLint xoffset,334GLint yoffset,335GLint x,336GLint y,337GLsizei width,338GLsizei height)339{340return GL_CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);341}342343void GL_APIENTRY glCullFace(GLenum mode)344{345return GL_CullFace(mode);346}347348void GL_APIENTRY glDeleteBuffers(GLsizei n, const GLuint *buffers)349{350return GL_DeleteBuffers(n, buffers);351}352353void GL_APIENTRY glDeleteTextures(GLsizei n, const GLuint *textures)354{355return GL_DeleteTextures(n, textures);356}357358void GL_APIENTRY glDepthFunc(GLenum func)359{360return GL_DepthFunc(func);361}362363void GL_APIENTRY glDepthMask(GLboolean flag)364{365return GL_DepthMask(flag);366}367368void GL_APIENTRY glDepthRangex(GLfixed n, GLfixed f)369{370return GL_DepthRangex(n, f);371}372373void GL_APIENTRY glDisable(GLenum cap)374{375return GL_Disable(cap);376}377378void GL_APIENTRY glDisableClientState(GLenum array)379{380return GL_DisableClientState(array);381}382383void GL_APIENTRY glDrawArrays(GLenum mode, GLint first, GLsizei count)384{385return GL_DrawArrays(mode, first, count);386}387388void GL_APIENTRY glDrawElements(GLenum mode, GLsizei count, GLenum type, const void *indices)389{390return GL_DrawElements(mode, count, type, indices);391}392393void GL_APIENTRY glEnable(GLenum cap)394{395return GL_Enable(cap);396}397398void GL_APIENTRY glEnableClientState(GLenum array)399{400return GL_EnableClientState(array);401}402403void GL_APIENTRY glFinish(void)404{405return GL_Finish();406}407408void GL_APIENTRY glFlush(void)409{410return GL_Flush();411}412413void GL_APIENTRY glFogx(GLenum pname, GLfixed param)414{415return GL_Fogx(pname, param);416}417418void GL_APIENTRY glFogxv(GLenum pname, const GLfixed *param)419{420return GL_Fogxv(pname, param);421}422423void GL_APIENTRY glFrontFace(GLenum mode)424{425return GL_FrontFace(mode);426}427428void GL_APIENTRY glFrustumx(GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f)429{430return GL_Frustumx(l, r, b, t, n, f);431}432433void GL_APIENTRY glGetBooleanv(GLenum pname, GLboolean *data)434{435return GL_GetBooleanv(pname, data);436}437438void GL_APIENTRY glGetBufferParameteriv(GLenum target, GLenum pname, GLint *params)439{440return GL_GetBufferParameteriv(target, pname, params);441}442443void GL_APIENTRY glGetClipPlanex(GLenum plane, GLfixed *equation)444{445return GL_GetClipPlanex(plane, equation);446}447448void GL_APIENTRY glGenBuffers(GLsizei n, GLuint *buffers)449{450return GL_GenBuffers(n, buffers);451}452453void GL_APIENTRY glGenTextures(GLsizei n, GLuint *textures)454{455return GL_GenTextures(n, textures);456}457458GLenum GL_APIENTRY glGetError(void)459{460return GL_GetError();461}462463void GL_APIENTRY glGetFixedv(GLenum pname, GLfixed *params)464{465return GL_GetFixedv(pname, params);466}467468void GL_APIENTRY glGetIntegerv(GLenum pname, GLint *data)469{470return GL_GetIntegerv(pname, data);471}472473void GL_APIENTRY glGetLightxv(GLenum light, GLenum pname, GLfixed *params)474{475return GL_GetLightxv(light, pname, params);476}477478void GL_APIENTRY glGetMaterialxv(GLenum face, GLenum pname, GLfixed *params)479{480return GL_GetMaterialxv(face, pname, params);481}482483void GL_APIENTRY glGetPointerv(GLenum pname, void **params)484{485return GL_GetPointerv(pname, params);486}487488const GLubyte *GL_APIENTRY glGetString(GLenum name)489{490return GL_GetString(name);491}492493void GL_APIENTRY glGetTexEnviv(GLenum target, GLenum pname, GLint *params)494{495return GL_GetTexEnviv(target, pname, params);496}497498void GL_APIENTRY glGetTexEnvxv(GLenum target, GLenum pname, GLfixed *params)499{500return GL_GetTexEnvxv(target, pname, params);501}502503void GL_APIENTRY glGetTexParameteriv(GLenum target, GLenum pname, GLint *params)504{505return GL_GetTexParameteriv(target, pname, params);506}507508void GL_APIENTRY glGetTexParameterxv(GLenum target, GLenum pname, GLfixed *params)509{510return GL_GetTexParameterxv(target, pname, params);511}512513void GL_APIENTRY glHint(GLenum target, GLenum mode)514{515return GL_Hint(target, mode);516}517518GLboolean GL_APIENTRY glIsBuffer(GLuint buffer)519{520return GL_IsBuffer(buffer);521}522523GLboolean GL_APIENTRY glIsEnabled(GLenum cap)524{525return GL_IsEnabled(cap);526}527528GLboolean GL_APIENTRY glIsTexture(GLuint texture)529{530return GL_IsTexture(texture);531}532533void GL_APIENTRY glLightModelx(GLenum pname, GLfixed param)534{535return GL_LightModelx(pname, param);536}537538void GL_APIENTRY glLightModelxv(GLenum pname, const GLfixed *param)539{540return GL_LightModelxv(pname, param);541}542543void GL_APIENTRY glLightx(GLenum light, GLenum pname, GLfixed param)544{545return GL_Lightx(light, pname, param);546}547548void GL_APIENTRY glLightxv(GLenum light, GLenum pname, const GLfixed *params)549{550return GL_Lightxv(light, pname, params);551}552553void GL_APIENTRY glLineWidthx(GLfixed width)554{555return GL_LineWidthx(width);556}557558void GL_APIENTRY glLoadIdentity(void)559{560return GL_LoadIdentity();561}562563void GL_APIENTRY glLoadMatrixx(const GLfixed *m)564{565return GL_LoadMatrixx(m);566}567568void GL_APIENTRY glLogicOp(GLenum opcode)569{570return GL_LogicOp(opcode);571}572573void GL_APIENTRY glMaterialx(GLenum face, GLenum pname, GLfixed param)574{575return GL_Materialx(face, pname, param);576}577578void GL_APIENTRY glMaterialxv(GLenum face, GLenum pname, const GLfixed *param)579{580return GL_Materialxv(face, pname, param);581}582583void GL_APIENTRY glMatrixMode(GLenum mode)584{585return GL_MatrixMode(mode);586}587588void GL_APIENTRY glMultMatrixx(const GLfixed *m)589{590return GL_MultMatrixx(m);591}592593void GL_APIENTRY glMultiTexCoord4x(GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q)594{595return GL_MultiTexCoord4x(texture, s, t, r, q);596}597598void GL_APIENTRY glNormal3x(GLfixed nx, GLfixed ny, GLfixed nz)599{600return GL_Normal3x(nx, ny, nz);601}602603void GL_APIENTRY glNormalPointer(GLenum type, GLsizei stride, const void *pointer)604{605return GL_NormalPointer(type, stride, pointer);606}607608void GL_APIENTRY glOrthox(GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f)609{610return GL_Orthox(l, r, b, t, n, f);611}612613void GL_APIENTRY glPixelStorei(GLenum pname, GLint param)614{615return GL_PixelStorei(pname, param);616}617618void GL_APIENTRY glPointParameterx(GLenum pname, GLfixed param)619{620return GL_PointParameterx(pname, param);621}622623void GL_APIENTRY glPointParameterxv(GLenum pname, const GLfixed *params)624{625return GL_PointParameterxv(pname, params);626}627628void GL_APIENTRY glPointSizex(GLfixed size)629{630return GL_PointSizex(size);631}632633void GL_APIENTRY glPolygonOffsetx(GLfixed factor, GLfixed units)634{635return GL_PolygonOffsetx(factor, units);636}637638void GL_APIENTRY glPopMatrix(void)639{640return GL_PopMatrix();641}642643void GL_APIENTRY glPushMatrix(void)644{645return GL_PushMatrix();646}647648void GL_APIENTRY glReadPixels(GLint x,649GLint y,650GLsizei width,651GLsizei height,652GLenum format,653GLenum type,654void *pixels)655{656return GL_ReadPixels(x, y, width, height, format, type, pixels);657}658659void GL_APIENTRY glRotatex(GLfixed angle, GLfixed x, GLfixed y, GLfixed z)660{661return GL_Rotatex(angle, x, y, z);662}663664void GL_APIENTRY glSampleCoverage(GLfloat value, GLboolean invert)665{666return GL_SampleCoverage(value, invert);667}668669void GL_APIENTRY glSampleCoveragex(GLclampx value, GLboolean invert)670{671return GL_SampleCoveragex(value, invert);672}673674void GL_APIENTRY glScalex(GLfixed x, GLfixed y, GLfixed z)675{676return GL_Scalex(x, y, z);677}678679void GL_APIENTRY glScissor(GLint x, GLint y, GLsizei width, GLsizei height)680{681return GL_Scissor(x, y, width, height);682}683684void GL_APIENTRY glShadeModel(GLenum mode)685{686return GL_ShadeModel(mode);687}688689void GL_APIENTRY glStencilFunc(GLenum func, GLint ref, GLuint mask)690{691return GL_StencilFunc(func, ref, mask);692}693694void GL_APIENTRY glStencilMask(GLuint mask)695{696return GL_StencilMask(mask);697}698699void GL_APIENTRY glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)700{701return GL_StencilOp(fail, zfail, zpass);702}703704void GL_APIENTRY glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const void *pointer)705{706return GL_TexCoordPointer(size, type, stride, pointer);707}708709void GL_APIENTRY glTexEnvi(GLenum target, GLenum pname, GLint param)710{711return GL_TexEnvi(target, pname, param);712}713714void GL_APIENTRY glTexEnvx(GLenum target, GLenum pname, GLfixed param)715{716return GL_TexEnvx(target, pname, param);717}718719void GL_APIENTRY glTexEnviv(GLenum target, GLenum pname, const GLint *params)720{721return GL_TexEnviv(target, pname, params);722}723724void GL_APIENTRY glTexEnvxv(GLenum target, GLenum pname, const GLfixed *params)725{726return GL_TexEnvxv(target, pname, params);727}728729void GL_APIENTRY glTexImage2D(GLenum target,730GLint level,731GLint internalformat,732GLsizei width,733GLsizei height,734GLint border,735GLenum format,736GLenum type,737const void *pixels)738{739return GL_TexImage2D(target, level, internalformat, width, height, border, format, type,740pixels);741}742743void GL_APIENTRY glTexParameteri(GLenum target, GLenum pname, GLint param)744{745return GL_TexParameteri(target, pname, param);746}747748void GL_APIENTRY glTexParameterx(GLenum target, GLenum pname, GLfixed param)749{750return GL_TexParameterx(target, pname, param);751}752753void GL_APIENTRY glTexParameteriv(GLenum target, GLenum pname, const GLint *params)754{755return GL_TexParameteriv(target, pname, params);756}757758void GL_APIENTRY glTexParameterxv(GLenum target, GLenum pname, const GLfixed *params)759{760return GL_TexParameterxv(target, pname, params);761}762763void GL_APIENTRY glTexSubImage2D(GLenum target,764GLint level,765GLint xoffset,766GLint yoffset,767GLsizei width,768GLsizei height,769GLenum format,770GLenum type,771const void *pixels)772{773return GL_TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);774}775776void GL_APIENTRY glTranslatex(GLfixed x, GLfixed y, GLfixed z)777{778return GL_Translatex(x, y, z);779}780781void GL_APIENTRY glVertexPointer(GLint size, GLenum type, GLsizei stride, const void *pointer)782{783return GL_VertexPointer(size, type, stride, pointer);784}785786void GL_APIENTRY glViewport(GLint x, GLint y, GLsizei width, GLsizei height)787{788return GL_Viewport(x, y, width, height);789}790791// GL_OES_draw_texture792void GL_APIENTRY glDrawTexfOES(GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height)793{794return GL_DrawTexfOES(x, y, z, width, height);795}796797void GL_APIENTRY glDrawTexfvOES(const GLfloat *coords)798{799return GL_DrawTexfvOES(coords);800}801802void GL_APIENTRY glDrawTexiOES(GLint x, GLint y, GLint z, GLint width, GLint height)803{804return GL_DrawTexiOES(x, y, z, width, height);805}806807void GL_APIENTRY glDrawTexivOES(const GLint *coords)808{809return GL_DrawTexivOES(coords);810}811812void GL_APIENTRY glDrawTexsOES(GLshort x, GLshort y, GLshort z, GLshort width, GLshort height)813{814return GL_DrawTexsOES(x, y, z, width, height);815}816817void GL_APIENTRY glDrawTexsvOES(const GLshort *coords)818{819return GL_DrawTexsvOES(coords);820}821822void GL_APIENTRY glDrawTexxOES(GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height)823{824return GL_DrawTexxOES(x, y, z, width, height);825}826827void GL_APIENTRY glDrawTexxvOES(const GLfixed *coords)828{829return GL_DrawTexxvOES(coords);830}831832// GL_OES_matrix_palette833void GL_APIENTRY glCurrentPaletteMatrixOES(GLuint matrixpaletteindex)834{835return GL_CurrentPaletteMatrixOES(matrixpaletteindex);836}837838void GL_APIENTRY glLoadPaletteFromModelViewMatrixOES()839{840return GL_LoadPaletteFromModelViewMatrixOES();841}842843void GL_APIENTRY glMatrixIndexPointerOES(GLint size,844GLenum type,845GLsizei stride,846const void *pointer)847{848return GL_MatrixIndexPointerOES(size, type, stride, pointer);849}850851void GL_APIENTRY glWeightPointerOES(GLint size, GLenum type, GLsizei stride, const void *pointer)852{853return GL_WeightPointerOES(size, type, stride, pointer);854}855856// GL_OES_point_size_array857void GL_APIENTRY glPointSizePointerOES(GLenum type, GLsizei stride, const void *pointer)858{859return GL_PointSizePointerOES(type, stride, pointer);860}861862// GL_OES_query_matrix863GLbitfield GL_APIENTRY glQueryMatrixxOES(GLfixed *mantissa, GLint *exponent)864{865return GL_QueryMatrixxOES(mantissa, exponent);866}867868} // extern "C"869870871