var.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475
  1. /*+-------------------------------------------------------------------------
  2. var.c - ecu variable routines
  3. wht@wht.net
  4. Defined functions:
  5. alloc_MKV(name)
  6. build_mkvi(param)
  7. build_mkvi_primitive(name)
  8. build_mkvs(param)
  9. build_mkvs_primitive(name, length)
  10. find_mkvi(name, pplong, auto_create)
  11. find_mkvs(name, ppesd, auto_create)
  12. free_mkvi(mkv)
  13. free_mkvs(mkv)
  14. get_ivptr(param, ppiv, auto_create)
  15. get_subscript(param, psubscript)
  16. get_svptr(param, ppsv, auto_create)
  17. mkv_proc_starting(pcb)
  18. mkv_proc_terminating(pcb)
  19. pcmd_mkvar(param)
  20. var_init()
  21. --------------------------------------------------------------------------*/
  22. /*+:EDITS:*/
  23. /*:04-26-2000-11:16-wht@bob-RELEASE 4.42 */
  24. /*:01-24-1997-02:38-wht@yuriatin-SOURCE RELEASE 4.00 */
  25. /*:09-11-1996-20:01-wht@yuriatin-3.48-major telnet,curses,structural overhaul */
  26. /*:12-06-1995-13:30-wht@n4hgf-termecu w/errno -1 consideration */
  27. /*:11-23-1995-11:20-wht@kepler-source control 3.37 for tsx-11 */
  28. /*:11-14-1995-10:23-wht@kepler-3.37.80-source control point: SOCKETS */
  29. /*:05-04-1994-04:40-wht@n4hgf-ECU release 3.30 */
  30. /*:09-10-1992-14:00-wht@n4hgf-ECU release 3.20 */
  31. /*:08-22-1992-15:39-wht@n4hgf-ECU release 3.20 BETA */
  32. /*:07-25-1991-12:59-wht@n4hgf-ECU release 3.10 */
  33. /*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
  34. #include "ecu.h"
  35. #include "esd.h"
  36. #define VDECL
  37. #include "var.h"
  38. #include "procedure.h"
  39. #include "ecukey.h"
  40. #include "ecuerror.h"
  41. #include "termecu.h"
  42. typedef union mkvu_type
  43. {
  44. ESD *sv;
  45. long iv;
  46. }
  47. MKVU;
  48. typedef struct mkv_type
  49. {
  50. MKVU item; /* pointer to esd if sv or long if iv */
  51. struct mkv_type *next; /* next MKV in chain; if NULL, no more in
  52. * chain */
  53. struct mkv_type *prev; /* previous MKV in chain; if NULL, top of
  54. * chain */
  55. char *name; /* name of variable */
  56. }
  57. MKV;
  58. MKV *mkvi_last = (MKV *) 0;
  59. MKV *mkvs_last = (MKV *) 0;
  60. /*+-------------------------------------------------------------------------
  61. var_init()
  62. --------------------------------------------------------------------------*/
  63. void
  64. var_init()
  65. {
  66. int itmp;
  67. for (itmp = 0; itmp < SVQUAN; itmp++)
  68. {
  69. if ((sv[itmp] = esdalloc(SVLEN)) == (ESD *) 0)
  70. {
  71. pputs("out of memory during variable initialization\n");
  72. errno = -1;
  73. termecu(TERMECU_MALLOC);
  74. }
  75. }
  76. for (itmp = 0; itmp < IVQUAN; itmp++)
  77. iv[itmp] = 0;
  78. } /* end of var_init */
  79. /*+-------------------------------------------------------------------------
  80. alloc_MKV(name)
  81. --------------------------------------------------------------------------*/
  82. MKV *
  83. alloc_MKV(name)
  84. char *name;
  85. {
  86. MKV *mkv;
  87. if (!(mkv = (MKV *) malloc(sizeof(MKV))))
  88. return ((MKV *) 0);
  89. if (!(mkv->name = malloc(strlen(name) + 1)))
  90. {
  91. free((char *)mkv);
  92. return ((MKV *) 0);
  93. }
  94. strcpy(mkv->name, name);
  95. mkv->item.iv = 0;
  96. return (mkv);
  97. } /* end of alloc_MKV */
  98. /*+-------------------------------------------------------------------------
  99. build_mkvi_primitive(name)
  100. --------------------------------------------------------------------------*/
  101. build_mkvi_primitive(name)
  102. char *name;
  103. {
  104. MKV *mkv;
  105. if ((mkv = alloc_MKV(name)) == (MKV *) 0)
  106. return (eNoMemory);
  107. if (mkvi_last)
  108. mkvi_last->next = mkv;
  109. mkv->prev = mkvi_last;
  110. mkv->next = (MKV *) 0;
  111. mkvi_last = mkv;
  112. return (0);
  113. } /* end of build_mkvi_primitive */
  114. /*+-------------------------------------------------------------------------
  115. build_mkvi(param)
  116. --------------------------------------------------------------------------*/
  117. build_mkvi(param)
  118. ESD *param;
  119. {
  120. int erc;
  121. char name[16];
  122. if (erc = get_alphanum_zstr(param, name, sizeof(name)))
  123. return (erc);
  124. return (build_mkvi_primitive(name));
  125. } /* end of build_mkvi */
  126. /*+-------------------------------------------------------------------------
  127. build_mkvs_primitive(name,length)
  128. trusts caller not to exceed ESD_MAXSZ
  129. --------------------------------------------------------------------------*/
  130. build_mkvs_primitive(name, length)
  131. char *name;
  132. int length;
  133. {
  134. MKV *mkv;
  135. ESD *text;
  136. if ((text = esdalloc((int)length)) == (ESD *) 0)
  137. return (eNoMemory);
  138. if ((mkv = alloc_MKV(name)) == (MKV *) 0)
  139. {
  140. esdfree(text);
  141. return (eNoMemory);
  142. }
  143. mkv->item.sv = text;
  144. if (mkvs_last)
  145. mkvs_last->next = mkv;
  146. mkv->prev = mkvs_last;
  147. mkv->next = (MKV *) 0;
  148. mkvs_last = mkv;
  149. return (0);
  150. } /* end of build_mkvs_primitive */
  151. /*+-------------------------------------------------------------------------
  152. build_mkvs(param)
  153. --------------------------------------------------------------------------*/
  154. build_mkvs(param)
  155. ESD *param;
  156. {
  157. int erc;
  158. char name[16];
  159. UINT32 length;
  160. if (erc = get_alphanum_zstr(param, name, sizeof(name)))
  161. return (erc);
  162. if (erc = skip_paren(param, 1))
  163. return (erc);
  164. if (erc = gint(param, &length))
  165. return (erc);
  166. if (length > ESD_MAXSZ)
  167. {
  168. pprintf("max string size is %d ... cannot make %lu byte string\n",
  169. ESD_MAXSZ, length);
  170. return (eFATAL_ALREADY);
  171. }
  172. if (erc = skip_paren(param, 0))
  173. return (erc);
  174. return (build_mkvs_primitive(name, (int)length));
  175. } /* end of build_mkvs */
  176. /*+-------------------------------------------------------------------------
  177. pcmd_mkvar(param)
  178. mkvar i<name>
  179. mkvar s<name>(<size-int>)
  180. --------------------------------------------------------------------------*/
  181. int
  182. pcmd_mkvar(param)
  183. ESD *param;
  184. {
  185. int erc;
  186. char vartype;
  187. if (!proc_level)
  188. return (eNotExecutingProc);
  189. do
  190. {
  191. if (erc = get_cmd_char(param, &vartype))
  192. return (erc);
  193. if (vartype == '$')
  194. {
  195. if (erc = get_cmd_char(param, &vartype))
  196. return (erc);
  197. }
  198. vartype = to_lower(vartype);
  199. switch (vartype)
  200. {
  201. case 'i':
  202. erc = build_mkvi(param);
  203. break;
  204. case 's':
  205. erc = build_mkvs(param);
  206. break;
  207. default:
  208. return (eIllegalVarType);
  209. }
  210. if (erc)
  211. return (erc);
  212. }
  213. while (!skip_comma(param));
  214. if (!end_of_cmd(param))
  215. return (eSyntaxError);
  216. return (0);
  217. } /* end of pcmd_mkvar */
  218. /*+-------------------------------------------------------------------------
  219. free_mkvi(mkv)
  220. --------------------------------------------------------------------------*/
  221. void
  222. free_mkvi(mkv)
  223. MKV *mkv;
  224. {
  225. free(mkv->name);
  226. free((char *)mkv);
  227. } /* end of free_mkvi */
  228. /*+-------------------------------------------------------------------------
  229. free_mkvs(mkv)
  230. --------------------------------------------------------------------------*/
  231. void
  232. free_mkvs(mkv)
  233. MKV *mkv;
  234. {
  235. esdfree(mkv->item.sv);
  236. free(mkv->name);
  237. free((char *)mkv);
  238. } /* end of free_mkvs */
  239. /*+-------------------------------------------------------------------------
  240. mkv_proc_starting(pcb)
  241. --------------------------------------------------------------------------*/
  242. void
  243. mkv_proc_starting(pcb)
  244. PCB *pcb;
  245. {
  246. pcb->mkvs_last = (char *)mkvs_last;
  247. pcb->mkvi_last = (char *)mkvi_last;
  248. } /* end of mkv_proc_starting */
  249. /*+-------------------------------------------------------------------------
  250. mkv_proc_terminating(pcb)
  251. --------------------------------------------------------------------------*/
  252. void
  253. mkv_proc_terminating(pcb)
  254. PCB *pcb;
  255. {
  256. MKV *pmkv;
  257. while (mkvi_last != (MKV *) pcb->mkvi_last)
  258. {
  259. pmkv = mkvi_last->prev;
  260. free_mkvi(mkvi_last);
  261. mkvi_last = pmkv;
  262. }
  263. while (mkvs_last != (MKV *) pcb->mkvs_last)
  264. {
  265. pmkv = mkvs_last->prev;
  266. free_mkvs(mkvs_last);
  267. mkvs_last = pmkv;
  268. }
  269. } /* end of mkv_proc_terminating */
  270. /*+-------------------------------------------------------------------------
  271. find_mkvs(name,ppesd,auto_create)
  272. --------------------------------------------------------------------------*/
  273. int
  274. find_mkvs(name, ppesd, auto_create)
  275. char *name;
  276. ESD **ppesd;
  277. int auto_create;
  278. {
  279. int erc;
  280. MKV *mkv = mkvs_last;
  281. while (mkv)
  282. {
  283. if (!strcmp(name, mkv->name))
  284. {
  285. *ppesd = mkv->item.sv;
  286. return (0);
  287. }
  288. mkv = mkv->prev;
  289. }
  290. if (auto_create)
  291. {
  292. if (proc_trace)
  293. pprintf("automatic creation $s%s(256)\n", name);
  294. if (erc = build_mkvs_primitive(name, 256))
  295. return (erc);
  296. *ppesd = mkvs_last->item.sv;
  297. return (0);
  298. }
  299. return (eNoSuchVariable);
  300. } /* end of find_mkvs */
  301. /*+-------------------------------------------------------------------------
  302. find_mkvi(name,pplong,auto_create)
  303. --------------------------------------------------------------------------*/
  304. int
  305. find_mkvi(name, pplong, auto_create)
  306. char *name;
  307. long **pplong;
  308. int auto_create;
  309. {
  310. int erc;
  311. MKV *mkv = mkvi_last;
  312. while (mkv)
  313. {
  314. if (!strcmp(name, mkv->name))
  315. {
  316. *pplong = &mkv->item.iv;
  317. return (0);
  318. }
  319. mkv = mkv->prev;
  320. }
  321. if (auto_create)
  322. {
  323. if (proc_trace)
  324. pprintf("creating $i%s\n", name);
  325. if (erc = build_mkvi_primitive(name))
  326. return (erc);
  327. *pplong = &mkvi_last->item.iv;
  328. return (0);
  329. }
  330. return (eNoSuchVariable);
  331. } /* end of find_mkvi */
  332. /*+-------------------------------------------------------------------------
  333. get_subscript(param,psubscript)
  334. only called when '[' at pb + index
  335. --------------------------------------------------------------------------*/
  336. get_subscript(param, psubscript)
  337. ESD *param;
  338. UINT32 *psubscript;
  339. {
  340. int erc;
  341. param->index++;
  342. if (erc = gint(param, psubscript))
  343. return (erc);
  344. if (skip_cmd_char(param, ']'))
  345. return (eSyntaxError);
  346. return (0);
  347. } /* end of get_subscript */
  348. /*+-------------------------------------------------------------------------
  349. get_ivptr(param,ppiv,auto_create)
  350. called with index set to $i.....
  351. ^
  352. --------------------------------------------------------------------------*/
  353. get_ivptr(param, ppiv, auto_create)
  354. ESD *param;
  355. long **ppiv;
  356. int auto_create;
  357. {
  358. int erc;
  359. UINT32 varnum;
  360. char name[16];
  361. if (end_of_cmd(param))
  362. return (eSyntaxError);
  363. else if (!get_numeric_value(param, &varnum))
  364. goto TEST_VARNUM;
  365. else if (*(param->pb + param->index) == '[')
  366. {
  367. if (erc = get_subscript(param, &varnum))
  368. return (erc);
  369. TEST_VARNUM:
  370. if (varnum >= IVQUAN)
  371. return (eIllegalVarNumber);
  372. *ppiv = &iv[(int)varnum];
  373. return (0);
  374. }
  375. else if (get_alphanum_zstr(param, name, sizeof(name)))
  376. return (eInvalidVarName);
  377. return (find_mkvi(name, ppiv, auto_create));
  378. } /* end of get_ivptr */
  379. /*+-------------------------------------------------------------------------
  380. get_svptr(param,ppsv,auto_create)
  381. called with index set to $s.....
  382. --------------------------------------------------------------------------*/
  383. int
  384. get_svptr(param, ppsv, auto_create)
  385. ESD *param;
  386. ESD **ppsv;
  387. int auto_create;
  388. {
  389. int erc;
  390. UINT32 varnum;
  391. char name[16];
  392. if (end_of_cmd(param))
  393. return (eSyntaxError);
  394. else if (!get_numeric_value(param, &varnum))
  395. goto TEST_VARNUM;
  396. else if (*(param->pb + param->index) == '[')
  397. {
  398. if (erc = get_subscript(param, &varnum))
  399. return (erc);
  400. TEST_VARNUM:
  401. if (varnum >= SVQUAN)
  402. return (eIllegalVarNumber);
  403. *ppsv = sv[(int)varnum];
  404. return (0);
  405. }
  406. if (get_alphanum_zstr(param, name, sizeof(name)))
  407. return (eInvalidVarName);
  408. return (find_mkvs(name, ppsv, auto_create));
  409. } /* end of get_svptr */
  410. /* vi: set tabstop=4 shiftwidth=4: */
  411. /* end of var.c */