static int os_getenv (lua_State *L) { #define MAX_VALUE_LEN 32767 /* according to MSDN */ const char *name = luaL_checkstring(L, 1); wchar_t *utf16_name; wchar_t *utf16_value; char *utf8_value; int error, result; utf16_name = convert_to_utf16(name,&error); if(utf16_name == NULL){ if(error == ERROR_COMMITMENT_LIMIT || error == ERROR_NOT_ENOUGH_MEMORY){ return luaL_error(L, "not enough memory"); } else { return luaL_error(L, "unable to convert %s to " "utf-16: error code = 0x%p", name, (void *)(ULONG_PTR)error); } } utf16_value = malloc(MAX_VALUE_LEN * sizeof(wchar_t)); if(utf16_value == NULL){ free(utf16_name); return luaL_error(L, "not enough memory"); } result = GetEnvironmentVariableW(utf16_name,utf16_value,MAX_VALUE_LEN); error = GetLastError(); free(utf16_name); if(result == 0){ free(utf16_value); if(error == ERROR_ENVVAR_NOT_FOUND){ lua_pushnil(L); return 1; } return luaL_error(L, "GetEnvironmentVariableW " "failed: error code = 0x%p", (void *)(ULONG_PTR)error); } utf8_value = convert_to_utf8(utf16_value,&error); free(utf16_value); if(utf8_value == NULL){ if(error == ERROR_COMMITMENT_LIMIT || error == ERROR_NOT_ENOUGH_MEMORY){ return luaL_error(L, "not enough memory"); } else { return luaL_error(L, "unable to convert value to " "utf-8: error code = 0x%p", (void *)(ULONG_PTR)error); } } lua_pushstring(L, utf8_value); free(utf8_value); return 1; }
/************************************************************************** Create Edit Field surface ( with Text) and blit them to Main.screen, on position 'pEdit_Widget->size.x , pEdit_Widget->size.y' Graphic is taken from 'pEdit_Widget->theme' Text is taken from 'pEdit_Widget->sting16' if flag 'FW_DRAW_THEME_TRANSPARENT' is set theme will be blit transparent ( Alpha = 128 ) function return Hight of created surfaces or (-1) if theme surface can't be created. **************************************************************************/ static int redraw_edit(struct widget *pEdit_Widget) { int ret; if (get_wstate(pEdit_Widget) == FC_WS_PRESSED) { return redraw_edit_chain((struct EDIT *)pEdit_Widget->data.ptr); } else { int iRet = 0; SDL_Rect rDest = {pEdit_Widget->size.x, pEdit_Widget->size.y, 0, 0}; SDL_Surface *pEdit = NULL; SDL_Surface *pText; ret = (*baseclass_redraw)(pEdit_Widget); if (ret != 0) { return ret; } if (pEdit_Widget->string16->text && get_wflags(pEdit_Widget) & WF_PASSWD_EDIT) { Uint16 *backup = pEdit_Widget->string16->text; size_t len = unistrlen(backup) + 1; char *cBuf = fc_calloc(1, len); memset(cBuf, '*', len - 1); cBuf[len - 1] = '\0'; pEdit_Widget->string16->text = convert_to_utf16(cBuf); pText = create_text_surf_from_str16(pEdit_Widget->string16); FC_FREE(pEdit_Widget->string16->text); FC_FREE(cBuf); pEdit_Widget->string16->text = backup; } else { pText = create_text_surf_from_str16(pEdit_Widget->string16); } pEdit = create_bcgnd_surf(pEdit_Widget->theme, get_wstate(pEdit_Widget), pEdit_Widget->size.w, pEdit_Widget->size.h); if (!pEdit) { return -1; } /* blit theme */ alphablit(pEdit, NULL, pEdit_Widget->dst->surface, &rDest); /* set position and blit text */ if (pText) { rDest.y += (pEdit->h - pText->h) / 2; /* blit centred text to botton */ if (pEdit_Widget->string16->style & SF_CENTER) { rDest.x += (pEdit->w - pText->w) / 2; } else { if (pEdit_Widget->string16->style & SF_CENTER_RIGHT) { rDest.x += pEdit->w - pText->w - adj_size(5); } else { rDest.x += adj_size(5); /* cennter left */ } } alphablit(pText, NULL, pEdit_Widget->dst->surface, &rDest); } /* pText */ iRet = pEdit->h; /* Free memory */ FREESURFACE(pText); FREESURFACE(pEdit); return iRet; } return 0; }
static int os_setenv (lua_State *L) { const char *name = luaL_checkstring(L, 1); const char *value; wchar_t *utf16_name; wchar_t *utf16_value; int error, result; if(name[0] == 0){ /* nothing to do */ lua_pushboolean(L, 1); return 1; } if(lua_isnoneornil(L, 2)){ value = ""; } else { value = luaL_checkstring(L, 2); } utf16_name = convert_to_utf16(name,&error); if(utf16_name == NULL){ if(error == ERROR_COMMITMENT_LIMIT || error == ERROR_NOT_ENOUGH_MEMORY){ return luaL_error(L, "not enough memory"); } else { return luaL_error(L, "unable to convert %s to " "utf-16: error code = 0x%p", name, (void *)(ULONG_PTR)error); } } utf16_value = convert_to_utf16(value,&error); if(utf16_value == NULL){ free(utf16_name); if(error == ERROR_COMMITMENT_LIMIT || error == ERROR_NOT_ENOUGH_MEMORY){ return luaL_error(L, "not enough memory"); } else { return luaL_error(L, "unable to convert %s to " "utf-16: error code = 0x%p", value, (void *)(ULONG_PTR)error); } } /* * Being mixed with SetEnvironmentVariable * calls _wputenv might cause an application * crash (confirmed on XP SP2 x86): * _wputenv(L"TEST=Hello"); * SetEnvironmentVariableW(L"TEST",NULL); * _wputenv(L"TEST="); */ if(utf16_value[0] != 0) result = SetEnvironmentVariableW(utf16_name,utf16_value); else result = SetEnvironmentVariableW(utf16_name,NULL); error = GetLastError(); free(utf16_name); free(utf16_value); if(result == 0 && error != ERROR_ENVVAR_NOT_FOUND){ return luaL_error(L, "SetEnvironmentVariableW " "failed: error code = 0x%p", (void *)(ULONG_PTR)error); } lua_pushboolean(L, 1); return 1; }