Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
/**************************************************************************
  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;
}
Ejemplo n.º 3
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;
}