pike.git / src / modules / _Roxen / roxen.c

version» Context lines:

pike.git/src/modules/_Roxen/roxen.c:668:    {    case 0: REPLACE(p_wchar0); break;    case 1: REPLACE(p_wchar1); break;    case 2: REPLACE(p_wchar2); break;    }    pop_stack();    push_string( low_end_shared_string( res ) );    }   }    + /*! @decl string websocket_mask(string(8bit) str, string(8bit) mask) +  *! +  *! Returns @expr{str@} XOR @expr{mask@}. +  */ + static void f_websocket_mask( INT32 args ) { +  struct pike_string *str, *mask, *ret; +  const unsigned char *src; +  unsigned char * restrict dst; +  size_t len; +  unsigned INT32 m; +  +  get_all_args("websocket_mask", args, "%n%n", &str, &mask); +  +  if (mask->len != 4) Pike_error("Wrong mask length.\n"); +  +  ret = begin_shared_string(str->len); +  +  len = str->len; +  m = get_unaligned32(STR0(mask)); +  +  dst = STR0(ret); +  src = STR0(str); +  +  for (;len >= 4; len -= 4, dst += 4, src += 4) +  set_unaligned32(dst, get_unaligned32(src) ^ m); +  +  if (len) { + #if PIKE_BYTEORDER == 4321 +  m = bswap32(m); + #endif +  +  do { +  *dst++ = *src++ ^ m; +  m >>= 8; +  len --; +  } while (len); +  } +  +  push_string(end_shared_string(ret)); + } +    /*! @endmodule    */      PIKE_MODULE_INIT   {    ADD_FUNCTION("make_http_headers", f_make_http_headers,    tFunc(tMap(tStr,tOr(tStr,tArr(tStr))) tOr(tInt01,tVoid), tStr),    0);       ADD_FUNCTION("http_decode_string", f_http_decode_string,    tFunc(tStr,tStr), 0 );       ADD_FUNCTION("html_encode_string", f_html_encode_string,    tFunc(tMix,tStr), 0 );    -  +  ADD_FUNCTION("websocket_mask", f_websocket_mask, tFunc(tStr0 tStr0, tStr0), 0); +     start_new_program();    ADD_STORAGE( struct header_buf );    set_init_callback( f_hp_init );    set_exit_callback( f_hp_exit );    ADD_FUNCTION("feed", f_hp_feed,    tFunc(tStr tOr(tInt01,tVoid),tArr(tOr(tStr,tMapping))), 0);    ADD_FUNCTION( "create", f_hp_create, tFunc(tOr(tInt,tVoid) tOr(tInt,tVoid) tOr(tInt,tVoid),tVoid), ID_PROTECTED );    end_class( "HeaderParser", 0 );   }      PIKE_MODULE_EXIT   {   }