270 lines
10 KiB
Plaintext
270 lines
10 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"\n",
|
|
"#returns the type of the given item of NestedList\n",
|
|
"def AtomType(item):\n",
|
|
" \n",
|
|
" if isinstance(item, str) and item[0] == '\"':\n",
|
|
" return \"string\"\n",
|
|
" if isinstance(item, str) and item[0] != '\"' and item[0] != '<':\n",
|
|
" return \"symbol\"\n",
|
|
" if isinstance(item, int):\n",
|
|
" return \"integer\"\n",
|
|
" if isinstance(item, float):\n",
|
|
" return \"real\"\n",
|
|
" if isinstance(item, bool):\n",
|
|
" return \"boolean\"\n",
|
|
" if (isinstance(item, list) and item[0] == \"<text>\") or (isinstance(item, str) and item.startswith('<text>')):\n",
|
|
" return \"text\"\n",
|
|
" if isinstance(item, list):\n",
|
|
" return \"list\"\n",
|
|
" \n",
|
|
" \n",
|
|
"def BinaryType(item):\n",
|
|
" itemType = AtomType(item)\n",
|
|
" if itemType == \"string\":\n",
|
|
" length = len(item)\n",
|
|
" if length < 256:\n",
|
|
" return 'BIN_SHORTSTRING'\n",
|
|
" if length < 65536:\n",
|
|
" return 'BIN_STRING'\n",
|
|
" return 'BIN_LONGSTRING'\n",
|
|
" if itemType == \"symbol\":\n",
|
|
" length = len(item)\n",
|
|
" if length < 256:\n",
|
|
" return 'BIN_SHORTSYMBOL'\n",
|
|
" if length < 65536:\n",
|
|
" return 'BIN_SYMBOL'\n",
|
|
" return 'BIN_LONGSYMBOL'\n",
|
|
" if itemType == \"integer\":\n",
|
|
" if item in range(-128, 128):\n",
|
|
" return 'BIN_BYTE'\n",
|
|
" if item in range(-32768, 32768):\n",
|
|
" return 'BIN_SHORTINT'\n",
|
|
" return 'BIN_INTEGER'\n",
|
|
" if itemType == \"real\":\n",
|
|
" return 'BIN_DOUBLE'\n",
|
|
" if itemType == \"boolean\":\n",
|
|
" return 'BIN_BOOLEAN'\n",
|
|
" if itemType == \"text\":\n",
|
|
" length = len(item)\n",
|
|
" if length < 256:\n",
|
|
" return 'BIN_SHORTTEXT'\n",
|
|
" if length < 65536:\n",
|
|
" return 'BIN_TEXT'\n",
|
|
" return 'BIN_LONGTEXT'\n",
|
|
" if itemType == \"list\":\n",
|
|
" length = len(item)\n",
|
|
" if length < 256:\n",
|
|
" return 'BIN_SHORTLIST'\n",
|
|
" if length < 65536:\n",
|
|
" return 'BIN_LIST'\n",
|
|
" return 'BIN_LONGLIST'\n",
|
|
" \n",
|
|
" \n",
|
|
"async def WriteListToBinary(writer, NL):\n",
|
|
" if not writer:\n",
|
|
" return False\n",
|
|
" sig = bytearray(\"bnl\")\n",
|
|
" major = pack('>H', 1)\n",
|
|
" minor = pack('>H', 2)\n",
|
|
" writer.write(sig)\n",
|
|
" writer.write(major)\n",
|
|
" writer.write(minor)\n",
|
|
" await writer.drain()\n",
|
|
" ok = await ListToBinary(writer, NL)\n",
|
|
" await writer.drain()\n",
|
|
" return ok\n",
|
|
" \n",
|
|
" \n",
|
|
"async def ListToBinary(writer, NL):\n",
|
|
" Type_dict = {\"BIN_LONGLIST\": 0,\n",
|
|
" \"BIN_INTEGER\": 1,\n",
|
|
" \"BIN_REAL\": 2,\n",
|
|
" \"BIN_BOOLEAN\": 3,\n",
|
|
" \"BIN_LONGSTRING\": 4,\n",
|
|
" \"BIN_LONGSYMBOL\": 5,\n",
|
|
" \"BIN_LONGTEXT\": 6,\n",
|
|
" \"BIN_LIST\": 10,\n",
|
|
" \"BIN_SHORTLIST\": 11,\n",
|
|
" \"BIN_SHORTINT\": 12,\n",
|
|
" \"BIN_BYTE\":13,\n",
|
|
" \"BIN_STRING\": 14,\n",
|
|
" \"BIN_SHORTSTRING\": 15,\n",
|
|
" \"BIN_SYMBOL\": 16,\n",
|
|
" \"BIN_SHORTSYMBOL\": 17,\n",
|
|
" \"BIN_TEXT\": 18,\n",
|
|
" \"BIN_SHORTTEXT\": 19,\n",
|
|
" \"BIN_DOUBLE\": 20}\n",
|
|
" btype = BinaryType(NL)\n",
|
|
" typeCode = None\n",
|
|
" for typ, val in Type_dict.items():\n",
|
|
" if btype == typ:\n",
|
|
" typeCode = val\n",
|
|
" break\n",
|
|
" \n",
|
|
" if btype == 'BIN_BOOLEAN':\n",
|
|
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
|
|
" val = 1 if NL esle 0\n",
|
|
" writer.write(pack('?', val)[0])\n",
|
|
" await writer.drain()\n",
|
|
" return True\n",
|
|
" \n",
|
|
" if btype == 'BIN_INTEGER':\n",
|
|
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
|
|
" writer.write(pack('>I', NL))\n",
|
|
" await writer.drain()\n",
|
|
" return True\n",
|
|
" if btype == 'BIN_SHORTINT':\n",
|
|
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
|
|
" writer.write(pack('>H', NL))\n",
|
|
" await writer.drain()\n",
|
|
" return True\n",
|
|
" if btype == 'BIN_BYTE':\n",
|
|
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
|
|
" writer.write(NL.to_bytes(1, byteorder='big'))\n",
|
|
" await writer.drain()\n",
|
|
" return True\n",
|
|
" \n",
|
|
" if btype == 'BIN_REAL':\n",
|
|
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
|
|
" writer.write(pack('>f', NL)[0])\n",
|
|
" await writer.drain()\n",
|
|
" return True\n",
|
|
" \n",
|
|
" if btype == 'BIN_DOUBLE':\n",
|
|
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
|
|
" writer.write(pack('>d', NL)[0])\n",
|
|
" await writer.drain()\n",
|
|
" return True\n",
|
|
" \n",
|
|
" if btype == 'BIN_DOUBLE':\n",
|
|
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
|
|
" writer.write(pack('>d', NL)[0])\n",
|
|
" await writer.drain()\n",
|
|
" return True\n",
|
|
" \n",
|
|
" if btype == 'BIN_SHORTSTRING':\n",
|
|
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
|
|
" writer.write(len(NL[0]).to_bytes(1, byteorder='big'))\n",
|
|
" writer.write(NL[0].encode())\n",
|
|
" await writer.drain()\n",
|
|
" return True\n",
|
|
"\n",
|
|
" if btype == 'BIN_STRING':\n",
|
|
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
|
|
" writer.write(pack('>H', len(NL[0]))\n",
|
|
" writer.write(NL[0].encode())\n",
|
|
" await writer.drain()\n",
|
|
" return True\n",
|
|
" \n",
|
|
" if btype == 'BIN_LONGSTRING':\n",
|
|
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
|
|
" writer.write(pack('>I', len(NL[0]))\n",
|
|
" writer.write(NL[0].encode())\n",
|
|
" await writer.drain()\n",
|
|
" return True\n",
|
|
" \n",
|
|
" if btype == 'BIN_SHORTSYMBOL':\n",
|
|
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
|
|
" writer.write(len(NL[0]).to_bytes(1, byteorder='big'))\n",
|
|
" writer.write(NL[0].encode())\n",
|
|
" await writer.drain()\n",
|
|
" return True\n",
|
|
"\n",
|
|
" if btype == 'BIN_SYMBOL':\n",
|
|
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
|
|
" writer.write(pack('>H', len(NL[0]))\n",
|
|
" writer.write(NL[0].encode())\n",
|
|
" await writer.drain()\n",
|
|
" return True\n",
|
|
" \n",
|
|
" if btype == 'BIN_LONGSYMBOL':\n",
|
|
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
|
|
" writer.write(pack('>I', len(NL[0]))\n",
|
|
" writer.write(NL[0].encode())\n",
|
|
" await writer.drain()\n",
|
|
" return True\n",
|
|
"\n",
|
|
" if btype == 'BIN_SHORTTEXT':\n",
|
|
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
|
|
" writer.write(len(NL[0]).to_bytes(1, byteorder='big'))\n",
|
|
" writer.write(NL[0].encode())\n",
|
|
" await writer.drain()\n",
|
|
" return True\n",
|
|
" \n",
|
|
" if btype == 'BIN_TEXT':\n",
|
|
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
|
|
" writer.write(pack('>H', len(NL[0]))\n",
|
|
" writer.write(NL[0].encode())\n",
|
|
" await writer.drain()\n",
|
|
" return True\n",
|
|
"\n",
|
|
" if btype == 'BIN_LONGTEXT':\n",
|
|
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
|
|
" writer.write(pack('>I', len(NL[0]))\n",
|
|
" writer.write(NL[0].encode())\n",
|
|
" await writer.drain()\n",
|
|
" return True\n",
|
|
"\n",
|
|
" if btype == 'BIN_SHORTLIST':\n",
|
|
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
|
|
" writer.write(len(NL).to_bytes(1, byteorder='big'))\n",
|
|
" for i in range(len(NL)):\n",
|
|
" res = await ListToBinary(writer, NL[i])\n",
|
|
" if not res:\n",
|
|
" return False\n",
|
|
" await writer.drain()\n",
|
|
" return True\n",
|
|
" \n",
|
|
" if btype == 'BIN_LIST':\n",
|
|
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
|
|
" writer.write(pack('>H', len(NL))\n",
|
|
" for i in range(len(NL)):\n",
|
|
" res = await ListToBinary(writer, NL[i])\n",
|
|
" if not res:\n",
|
|
" return False\n",
|
|
" await writer.drain()\n",
|
|
" return True\n",
|
|
" \n",
|
|
" if btype == 'BIN_LONGLIST':\n",
|
|
" writer.write(typeCode.to_bytes(1, byteorder='big'))\n",
|
|
" writer.write(pack('>I', len(NL))\n",
|
|
" for i in range(len(NL)):\n",
|
|
" res = await ListToBinary(writer, NL[i])\n",
|
|
" if not res:\n",
|
|
" return False\n",
|
|
" await writer.drain()\n",
|
|
" return True\n"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "Python 3",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 3
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython3",
|
|
"version": "3.7.4"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 2
|
|
}
|