Files
secondo/apis/python2/SecondoAPI/.ipynb_checkpoints/write_nl_to_binary-checkpoint.ipynb

270 lines
10 KiB
Plaintext
Raw Normal View History

2026-01-23 17:03:45 +08:00
{
"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
}