예제 #1
0
파일: md5lib.c 프로젝트: chensihao1/Alice
/**
*  Encrypts a string. Uses the hash function md5 in CFB (Cipher-feedback
*  mode).
*  @param message: arbitrary binary string to be encrypted.
*  @param key: arbitrary binary string to be used as a key.
*  @param [seed]: optional arbitrary binary string to be used as a seed.
*  if no seed is provided, the function uses the result of
*  <code>time()</code> as a seed.  
*  @return  The cyphertext (as a binary string).
*/
static int crypt (lua_State *L) {
  size_t lmsg;
  const char *msg = luaL_checklstring(L, 1, &lmsg);
  size_t lseed;
  const char *seed;
  int lblock;
  char block[BLOCKSIZE+MAXKEY];
  checkseed(L);
  seed = luaL_checklstring(L, 3, &lseed);
  if (lseed > BLOCKSIZE)
    luaL_error(L, "seed too long (> %d)", BLOCKSIZE);
  /* put seed and seed length at the beginning of result */
  block[0] = (char)lseed;
  memcpy(block+1, seed, lseed);
  lua_pushlstring(L, block, lseed+1);  /* to concat with result */
  lblock = initblock(L, seed, lseed, block);
  codestream(L, msg, lmsg, block, lblock);
  lua_concat(L, 2);
  return 1;
}
예제 #2
0
	Function(std::string code){
		is_function = true;
		if (code.find("...") != std::string::npos){
			is_function = false;
			return;
		}

		while(code.find(" ") == 0){
			code.erase(0, 1);
		}

		std::stringstream codestream(code);
		std::getline(codestream, return_type, ' ');
		if (return_type.find("static") != std::string::npos){
			std::getline(codestream, return_type, ' ');
		}

		std::getline(codestream, name, '(');
		name = replace_all(name, " ", "");
		if (name.empty()){
			std::cout << code << std::endl;
		}

		if (has_substring(name, "*")){ // Our return type is actually a pointer
			name.erase(name.find("*"), 1); // Remove it from the name
			return_type += "*"; // And add it to the return type
		}
		if (name.empty()){
			std::getline(codestream, name, '(');
		}
		if (has_substring(name, "*")){ // * is from the function pointer, not the return type
			name.erase(name.find("*"), 1); // Just delete it and don't add it to the return type
		}
		name = replace_all(name, ")", "");

		// This somehow happens, and I don't understand.
		if (name.empty()){
			is_function = false;
			return;
		}

		std::string segment;
		while(std::getline(codestream, segment, ',')){
			if (segment.find("(") != std::string::npos){
				is_function = false;
				return;
			}

			// Cut off spaces in the beginning
			while(segment.find(" ") == 0){
				segment.erase(0, 1);
			}
			// Cut off after spaces
			if (has_substring(segment, "*")){
				segment.erase(segment.find("*") + 1, std::string::npos);
			}
			else if (has_substring(segment, "const") || has_substring(segment, "unsigned")){
				size_t cutoff = std::min(segment.find(" ", segment.find(" ") + 1), segment.find(")"));
				if (cutoff != std::string::npos){
					segment.erase(cutoff, std::string::npos); // Cut off after second space
				}
			}
			else if (has_substring(segment, " ")){
				segment.erase(segment.find(" "), std::string::npos);
			}
			replace_all(segment, ")", "");

			// Only the type is left -- TODO
			if (!segment.empty() && !has_substring(segment, "void") && segment.size() > 1){
				arguments.push_back(segment);
			}
		}
	}