User Tools

Site Tools


cdc:nos2.source:nam5871:kptypin

KPTYPIN

Table Of Contents

  • [00012] PRGM KPTYPIN
  • [00073] PROC OMSG
  • [00074] PROC OVLCALL
  • [00075] PROC XTRACE

Source Code

KPTYPIN.txt
  1. *DECK KPTYPIN
  2. USETEXT NIPDEF
  3. USETEXT PARAMP
  4. USETEXT PARAMS
  5. USETEXT DRHDR
  6. USETEXT FREETAB
  7. USETEXT OVERLAY
  8. USETEXT KDIS
  9. USETEXT DISTAIL
  10. USETEXT KINITBF
  11. USETEXT SUPMSG
  12. PRGM KPTYPIN; # PROCESS K DISPLAY TYPE INS #
  13. STARTIMS;
  14. #
  15. *1DC KPTYPIN
  16. *
  17. * 1. PROC NAME AUTHOR DATE
  18. * KPTYPIN A. BEN-ARTZI 81/11/09
  19. *
  20. * 2. FUNCTIONAL DESCRIPTION.
  21. *
  22. * PROCESS ALL OPERATOR TYP-INS TO NAM-S K-DISPLAY
  23. *
  24. * 3. METHOD USED.
  25. *
  26. * GET THE INPUT KEY-WORD FROM THE TYPE-IN BUFFER. TEST IT AND
  27. * BRANCH TO THE APPROPRIATE SECTION TO EXECUTE THE COMMAND.
  28. * WHEN EVER NECESSARY BUILD A DATA BLOCK AND USE BLINK TO SEND IT
  29. * TO THE APPLICATION.
  30. *
  31. * SPECIAL MODULES ARE FOR STATUS DISPLAY AND FOR FL CHANGES.
  32. *
  33. * 4. ENTRY PARAMETERS.
  34. * NONE
  35. *
  36. *
  37. * 5. EXIT PARAMETERS.
  38. * PARAMP1 - FLAG TO CALL KDSTIN
  39. *
  40. *
  41. * 6. COMDECKS CALLED AND SYMPL TEXT USED.
  42. *
  43. * NIPDEF OVERLAY KDIS DISTAIL
  44. * KINITBF PARAMP PARAMS
  45. *
  46. * 7. ROUTINES AND OVERLAYS CALLED.
  47. *
  48. * OVLCALL LOAD AND EXECUTE OVERLAY
  49. * OMSG ISSUE DAYFILE MESSAGE
  50. * KPCLNUP OVL K-DISPLAY CLEAN-UP
  51. * KAPPMOD OVL PROCESS K-DISPLAY APPLICATION MODE COMMANDS
  52. * KAPIGP OVL PROCESS "AP" AND "IG" COMMANDS
  53. * KSTPAGE OVL PROCESS STATUS DISPLAY PAGING
  54. * KNAMMOD OVL PROCESS K-DISPLAY NAM MODE COMMANDS
  55. * KNAMDFL OVL PROCESS FIELD LENGTH K-DISPLAY COMMANDS
  56. * XTRACE RECORD PROCESSOR CALLS
  57. *
  58. *
  59. * 8. DAYFILE MESSAGES AND OTHER IMPORTANT INFORMATION
  60. * THIS PRIMARY OVERLAY IS CALLED BY XEXEC.
  61. * W A R N I N G - THIS PROGRAM CANNOT EXCEED THE PRIMARY
  62. *CALL OPSIZE
  63. *
  64. *
  65. *
  66.  #
  67. STOPIMS;
  68. #
  69.   EXTERNAL VARIABLES
  70. #
  71. XREF
  72. BEGIN
  73. PROC OMSG; # DAYFILE MESSAGE #
  74. PROC OVLCALL; # LOAD OVERLAY #
  75. PROC XTRACE; # TRACE ROUTINE CALL #
  76. LABEL RJMAIN;
  77. END
  78. #
  79.   LOCAL DEFINITIONS
  80. #
  81. DEF CHAR$COMMA # "," #;
  82. DEF CHAR$EQUAL # "=" #;
  83. DEF CHAR$PERIOD # "." #;
  84. DEF CHAR$BLANK # " " #;
  85. DEF CHAR$STAR # "*" #;
  86. DEF MAX$KDIS #40 #; # MAX CHARACTERS TO DISPLAY TYPE IN #
  87. #
  88.   INTERNAL VARIABLES
  89. #
  90. ITEM CHRR; # SINGLE CHARACTER #
  91. ITEM CNT; # TOKEN TABLE INDEX #
  92. ITEM COUNT; # TOKEN CHARACTER COUNT #
  93. ITEM I; # INDUCTION VARIABLE #
  94. ITEM INDEX; # INDEX VALUE #
  95. ITEM J; # INDUCTION VARIABLE #
  96. ITEM KCHARS; # CHARACTER COUNT OF TYPE-INS #
  97. ITEM KRC; # ERROR REASON CODE FOR TYPE-IN #
  98. ITEM TC; # TOKEN COUNT #
  99.  
  100. DEF L$TOKENTAB # 25#; # SIZE OF TOKEN TABLE #
  101. ARRAY TOKENTAB [1:L$TOKENTAB] S(1);
  102. BEGIN # TABLE OF NAM K DISPLAY COMMAND TOKENS/SEPARATOR #
  103. ITEM TT$WORD C(00,00,10); # WHOLE WORD #
  104. ITEM TT$TOKEN C(00,00,08); # TOKEN SEPARATOR #
  105. ITEM TT$ATOKEN C(00,00,07); # TOKEN ONLY #
  106. ITEM TT$SEP C(00,42,01); # SEPARATOR #
  107. END
  108.  
  109. DEF MAX$KINPUT # 4 #; # MAX WORD COUNT - 1 FOR TYPE-IN #
  110. BASED ARRAY KDIS$INPUT [0:MAX$KINPUT] S(1);
  111. BEGIN
  112. ITEM KI$WORD C(00,00,10); # TYPE-IN WORD #
  113. END
  114.  
  115. BASED ARRAY KARRAY [0:0] S(1);
  116. BEGIN
  117. ITEM KAWRD C(00,00,10);
  118. END
  119.  
  120. DEF MAX$NAMCMDS # 24 #; # MAXIMUM NAM COMMANDS ALLOWED #
  121. ARRAY NAMCMDVERB [0:MAX$NAMCMDS] S(1);
  122. BEGIN # VALID NAM COMMAND VERB TABLE #
  123. ITEM NC$WORD C(00,00,10); # WHOLE WORD #
  124. ITEM NC$KEYWORD C(00,00,08) = [ # VALID COMMAND KEYWORDS #
  125. "ST ",
  126. "AP =",
  127. "AP ",
  128. "END ",
  129. "IG =",
  130. "IG ",
  131. "+ ",
  132. "- ",
  133. "* ",
  134. "/ ",
  135. "DB =",
  136. "DE =",
  137. "DU =",
  138. "FL =",
  139. "LE =",
  140. "RS =",
  141. "LB =",
  142. "LR =",
  143. "MO =",
  144. "SEND ",
  145. "TB =",
  146. "TE =",
  147. "( ",
  148. "HELP ",
  149. 0,
  150. ];
  151. ITEM NC$TOKENCT U(00,48,06) = [ # TOKEN COUNT ALLOWED FOR CMD #
  152. 1,2,1,1,2,1,1,1,1,1,2,2,2,2,2,2,2,2,2,3,2,2,1,1,0
  153. ];
  154. ITEM NC$CMDORD S:NCT(00,54,06) = [ # CORR COMMAND ORDINAL #
  155. S"CMD$ST",
  156. S"CMD$AP",
  157. S"CMD$AP",
  158. S"CMD$END",
  159. S"CMD$IG",
  160. S"CMD$IG",
  161. S"CMD$PFORWD",
  162. S"CMD$PBACK",
  163. S"CMD$IGNORE",
  164. S"CMD$IGNORE",
  165. S"CMD$DB",
  166. S"CMD$DE",
  167. S"CMD$DU",
  168. S"CMD$FL",
  169. S"CMD$LE",
  170. S"CMD$RS",
  171. S"CMD$LB",
  172. S"CMD$LR",
  173. S"CMD$MO",
  174. S"CMD$SEND",
  175. S"CMD$TB",
  176. S"CMD$TE",
  177. S"CMD$RFORWD",
  178. S"CMD$HELP",
  179. S"CMD$ERROR",
  180. ];
  181. END
  182.  
  183. SWITCH NAMCMDCASE:NCT # SWITCH FOR VALID NAM COMMANDS #
  184. LB$ST:CMD$ST,
  185. LB$AP:CMD$AP,
  186. LB$END:CMD$END,
  187. LB$IG:CMD$IG,
  188. LB$EXIT:CMD$IGNORE,
  189. LB$PF:CMD$PFORWD,
  190. LB$PB:CMD$PBACK,
  191. LB$DB:CMD$DB,
  192. LB$DE:CMD$DE,
  193. LB$DU:CMD$DU,
  194. LB$LE:CMD$LE,
  195. LB$RS:CMD$RS,
  196. LB$LB:CMD$LB,
  197. LB$LR:CMD$LR,
  198. LB$FL:CMD$FL,
  199. LB$MO:CMD$MO,
  200. LB$SEND:CMD$SEND,
  201. LB$TB:CMD$TB,
  202. LB$TE:CMD$TE,
  203. LB$RPF:CMD$RFORWD,
  204. LB$HELP:CMD$HELP,
  205. LB$ERR:CMD$ERROR;
  206.  
  207. CONTROL EJECT;
  208.  
  209. BEGIN # KPTYPIN #
  210.  
  211. CONTROL IFEQ DEBUG,1;
  212. XTRACE("KPTYP"); # TRACE CALL #
  213. CONTROL FI;
  214.  
  215. PARAMP1 = 0;
  216. KREPEAT[0] = CHAR$BLANK;
  217. KRC = 0;
  218. #
  219.   COMPUTE CHARACTER COUNT OF K DISPLAY TYPE-IN
  220. #
  221. P<KDIS$INPUT> = LOC(KBUF1[0]); # FWA OF TYPE-IN #
  222. FOR I=MAX$KINPUT STEP -1 WHILE I GQ 0
  223. AND KI$WORD[I] EQ 0
  224. DO # GET LAST WORD OF TYPE-IN #
  225. BEGIN
  226. END
  227. FOR J=0 STEP 1 WHILE J LS WC
  228. AND B<J*CL,CL>KI$WORD[I] NQ 0
  229. DO # GET LAST CHARACTER OF TYPE-IN #
  230. BEGIN
  231. END
  232. KCHARS = I*10 + J; # CHARACTER COUNT OF TYPE-IN #
  233. #
  234.   DISPLAY K DISPLAY TYPE INS
  235. #
  236. P<KARRAY> = LOC(KBFD1[0]); # FWA OF DISPLAY #
  237. FOR I=0 STEP 1 UNTIL 3
  238. DO # BLANK-FILL DISPLAY BUFFER #
  239. KAWRD[I] = CHAR$BLANK;
  240. FOR I=0 STEP 1 WHILE I LS KCHARS
  241. AND I LS MAX$KDIS
  242. DO # DISPLAY UP TO 40 CHARACTERS OF TYPE-INS #
  243. BEGIN
  244. INDEX = I/10; # WORD INDEX #
  245. J = I-INDEX*10;
  246. C<J>KAWRD[INDEX] = C<J>KI$WORD[INDEX];
  247. END
  248. #
  249.   APPLCATION MODE PROCESSING
  250. #
  251. IF KDAM[0]
  252. THEN
  253. BEGIN
  254. IF C<0>KBUF[0] EQ CHAR$STAR
  255. AND (KCHARS EQ 1
  256. OR (KCHARS EQ 2
  257. AND C<1>KBUF[0] EQ CHAR$PERIOD))
  258. THEN # TERMINATE APPLCATION MODE #
  259. OVLNAME = KPCLNUPP;
  260. ELSE # PROCESS APPLICATION K DISPLAY COMMAND #
  261. BEGIN
  262. PARAMS1 = KCHARS; # CHARACTER COUNT OF COMMAND #
  263. OVLNAME = KAPPMODP;
  264. END
  265. OVLCALL;
  266. END
  267. #
  268.   NAM MODE PROCESSING
  269. #
  270. ELSE
  271. BEGIN
  272. IF KDORIG[0] THEN # FIND THE ORIGINAL BUFFER (HAS ERROR LINE) #
  273. P<KINITBF> = KDBP[0];
  274. ELSE
  275. P<KINITBF> = KORIGFP[0];
  276. P<KINITBF>=P<KINITBF>+BLKHSIZE+KHDRSIZE;
  277. CNT = KLSIZE-KERRL-2;
  278. KERROR1[CNT] = CHAR$BLANK;
  279. KERROR1[CNT+1] = CHAR$BLANK;
  280. KERROR1[CNT+2] = CHAR$BLANK;
  281. KERROR1[CNT+3] = CHAR$BLANK;
  282. KERROR2[CNT+4] = CHAR$BLANK;
  283. KREADY[KLSIZE-2] = CHAR$BLANK; # CLEAR READY.. PROMPT #
  284. P<KARRAY> = LOC(KDMES); # FWA OF TYPE IN COMMAND #
  285. OMSG(KARRAY,0); # LOG IN NETWORK LOG FILE - NIP DAYFILE #
  286. #
  287.   TOKENIZE K DISPLAY TYPE INS
  288. #
  289. TC = 0; # INITIALIZE TOKEN COUNT #
  290. CNT = 1; # INITIALIZE TOKEN TABLE INDEX #
  291. COUNT = 0; # INITIALIZE CHARACTER COUNT OF TOKEN #
  292.  
  293. FOR I=1 STEP 1 UNTIL L$TOKENTAB
  294. DO # INITIALIZE TOKEN TABLE #
  295. TT$WORD[I] = CHAR$BLANK; # BLANK-FILLED #
  296.  
  297. FOR I=0 STEP 1 WHILE I LS KCHARS
  298. AND KRC EQ 0 # NO ERROR OCCURRED #
  299. DO # UNPACK COMMAND TEXT INTO TOKENS/SEPARATOR #
  300. BEGIN
  301. INDEX = I/10; # WORD INDEX OF COMMAND TEXT #
  302. J = I - INDEX*10; # CHARACTER POSITION #
  303. CHRR = C<J>KI$WORD[INDEX]; # CURRENT CHARACTER #
  304.  
  305. IF CHRR EQ CHAR$COMMA
  306. OR CHRR EQ CHAR$EQUAL
  307. THEN # LEGAL SEPARATOR #
  308. BEGIN
  309. IF TT$WORD[CNT] NQ CHAR$BLANK
  310. THEN # TOKEN EXISTS #
  311. BEGIN
  312. IF CHRR EQ CHAR$EQUAL
  313. THEN # STORE EQUAL ONLY IN TOKEN TABLE #
  314. TT$SEP[CNT] = CHAR$EQUAL;
  315. COUNT = 0; # RESET TOKEN CHARACTER COUNT #
  316. CNT = CNT + 1; # INCREMENT TOKEN TABLE INDEX #
  317. TC = TC + 1; # INCREMENT TOKEN COUNT #
  318. END
  319. ELSE # TWO SEPARATORS IN A ROW, ERROR #
  320. KRC = 4; # SYNTAX ERROR, UNRECOGNIZED COMMAND #
  321. END
  322.  
  323. ELSE
  324. BEGIN
  325. IF CHRR EQ CHAR$PERIOD
  326. THEN # ITS A PERIOD - TERMINATOR #
  327. I = KCHARS; # TERMINATE UNPACKING COMMAND #
  328. ELSE # ASSEMBLE CHARACTER INTO TOKEN #
  329. BEGIN
  330. IF CNT LQ L$TOKENTAB
  331. THEN # COMMAND WITHIN TOKEN TABLE SIZE #
  332. BEGIN
  333. C<COUNT>TT$WORD[CNT] = CHRR;
  334. COUNT = COUNT + 1; # INCREMENT TOKEN CHARACTER COUNT #
  335. IF COUNT GQ 10
  336. THEN # RESUME TOKEN ASSEMBLY IN NEXT WORD #
  337. BEGIN
  338. COUNT = 0;
  339. CNT = CNT + 1;
  340. END
  341. END
  342. END
  343. END
  344. END # END FOR LOOP #
  345.  
  346. IF KRC EQ 0
  347. THEN # NO ERROR OCCURRED #
  348. #
  349.   RECOGNIZE NAM K DISPLAY COMMAND
  350. #
  351. BEGIN
  352. TC = TC + 1; # TOKEN COUNT #
  353. NC$TOKENCT[MAX$NAMCMDS] = TC; # FORCE TOKEN COUNT MATCH #
  354. NC$KEYWORD[MAX$NAMCMDS] = TT$TOKEN[1]; # FORCE KEYWORD MATCH #
  355. FOR I=0 STEP 1 WHILE NC$KEYWORD[I] NQ TT$TOKEN[1]
  356. DO # NO KEYWORD MATCH #
  357. BEGIN
  358. END
  359. INDEX = NC$CMDORD[I]; # COMMAND ORDINAL #
  360. IF TC NQ NC$TOKENCT[I]
  361. THEN # TOKEN COUNT MISMATCH #
  362. KRC = 4; # SYNTAX ERROR, UNRECOGNIZED COMMAND #
  363. ELSE # SYNTAX CHECK OK #
  364. BEGIN
  365. IF HRL EQ 0
  366. AND INDEX NQ NCT"CMD$FL"
  367. AND INDEX NQ NCT"CMD$DU"
  368. THEN # ONLY FL COMMAND IS ALLOWED IN MAX FL #
  369. KRC = 6;
  370. END
  371. END
  372. #
  373.   SWITCH ON COMMAND ORDINAL TO PROCESS COMMAND
  374. #
  375. IF KRC EQ 0
  376. THEN
  377. BEGIN
  378.  
  379. GOTO NAMCMDCASE[INDEX];
  380. CONTROL EJECT;
  381.  
  382. LB$ST: # PROCESS ST - NAM STATUS COMMAND #
  383. IF NOT KDST[0]
  384. THEN # STATUS DISPLAY CURRENTLY NOT ON #
  385. KDIS$STAT = STM"STM$CREATE"; # BUILD STATUS DISPLAY #
  386. GOTO LB$EXIT;
  387.  
  388. LB$AP: # PROCESS AP COMMAND #
  389. PARAMS2 = 0;
  390. PARAMS6 = TT$WORD[2]; # APPLICATIONS NAME #
  391. OVLNAME = KAPIGPP;
  392. OVLCALL;
  393. KRC = PARAMS7; # COMMAND ERROR CODE #
  394. IF KRC EQ 0
  395. THEN
  396. BEGIN
  397. OVLNAME = KPCLNUPP;
  398. OVLCALL;
  399. KDAPNM[0] = PARAMS6;
  400. KDAN[0] = PARAMS4;
  401. KSHOW[0]=FALSE;
  402. KDAM[0] = TRUE;
  403. KDNI[0] = TRUE;
  404. KDBK[0] = FALSE;
  405. END
  406. GOTO LB$EXIT;
  407.  
  408. LB$END: # PROCESS END COMMAND #
  409. OVLNAME = KPCLNUPP;
  410. OVLCALL;
  411. GOTO LB$EXIT;
  412.  
  413. LB$IG: # PROCESS IG COMMAND #
  414. PARAMS2 = 1;
  415. PARAMS6 = TT$WORD[2];
  416. OVLNAME = KAPIGPP;
  417. OVLCALL;
  418. KRC = PARAMS7;
  419. GOTO LB$EXIT;
  420.  
  421. LB$DB: # PROCESS DB COMMAND #
  422. LB$DE: # PROCESS DE COMMAND #
  423. LB$DU: # PROCESS DU COMMAND #
  424. LB$LE: # PROCESS LE COMMAND #
  425. LB$RS: # PROCESS RS COMMAND #
  426. LB$LB: # PROCESS LB COMMAND #
  427. LB$LR: # PROCESS LR COMMAND #
  428. PARAMS3 = INDEX; # COMMAND ORDINAL #
  429. PARAMS6 = TT$WORD[2]; # APPLICATION NAME/ALL/NAM #
  430. IF PARAMS6 EQ "NAM" OR PARAMS6 EQ "ALL"
  431. THEN
  432. BEGIN
  433. OVLNAME = KNAMCOMP; # PROCESS NAM K-DISPLAY COMMAND #
  434. OVLCALL;
  435. END
  436. IF PARAMS6 NQ "NAM"
  437. THEN
  438. BEGIN
  439. OVLNAME = KNAMMODP; # PROCESS APPL K-DISPLAY COMMAND #
  440. OVLCALL;
  441. END
  442. KRC = PARAMS7;
  443. GOTO LB$EXIT;
  444.  
  445. LB$FL: # PROCESS FL COMMAND #
  446. PARAMS6 = TT$WORD[2]; # FL VALUE #
  447. OVLNAME = KNAMDFLP;
  448. OVLCALL;
  449. KRC = PARAMS7;
  450. GOTO LB$EXIT;
  451.  
  452. LB$MO: # PROCESS MO COMMAND #
  453. IF TT$WORD[2] EQ "FAST"
  454. THEN
  455. BEGIN
  456. KFAST[0] = TRUE; # SET STATUS DISPLAY TO REAL TIME UPDATE #
  457. IF KDST[0]
  458. THEN # STATUS DISPLAY IS ON, UPDATE DISPLAY FIRST #
  459. KDIS$STAT = STM"STM$UPDATE";
  460. END
  461. ELSE
  462. BEGIN
  463. IF TT$WORD[2] EQ "SLOW"
  464. THEN
  465. KFAST[0] = FALSE;
  466. ELSE
  467. KRC = 4;
  468. END
  469. KDIS$RT = KDST[0] AND KFAST[0];
  470. GOTO LB$EXIT;
  471.  
  472. LB$SEND: # PROCESS SEND COMMAND #
  473. PARAMS6 = TT$WORD[2]; # DETERMINE DESTINATION NODE NUMBER #
  474. PARAMS2 = LOC(TT$WORD[3]); # FWA OF HOP MESSAGE TEXT #
  475. OVLNAME = KSENDHMP;
  476. OVLCALL;
  477. KRC = PARAMS7; # RETURN CODE #
  478. GOTO LB$EXIT;
  479.  
  480. LB$TB: # PROCESS PIP TRACING ON COMMAND #
  481. LB$TE: # PROCESS PIP TRACING OFF COMMAND #
  482. KRC = 4; # PIP TRACE OPTION NOT AVAILABLE #
  483. GOTO LB$EXIT;
  484.  
  485. LB$PF: # PROCESS STATUS PAGE FORWARD #
  486. IF KDST[0]THEN # PERFORM FORWARD PAGE OPERATION #
  487. BEGIN
  488. PARAMS1 = 1; # SET PARAMETER FOR PAGE FORWARD #
  489. OVLNAME = KSTPAGEP;
  490. OVLCALL;
  491. END
  492.  
  493. GOTO LB$EXIT;
  494.  
  495.  
  496. LB$PB: # PROCESS STATUS PAGE BACKWARD #
  497. IF KDST[0] THEN # PERFORM BACKWARD PAGE OPERATION #
  498. BEGIN
  499. PARAMS1 = 2; # SET PARAMETER FOR PAGE BACKWARD #
  500. OVLNAME = KSTPAGEP;
  501. OVLCALL;
  502. END
  503.  
  504. GOTO LB$EXIT;
  505.  
  506. LB$RPF:
  507. KSHOW[0]=TRUE;
  508. GOTO LB$EXIT;
  509.  
  510. LB$HELP:
  511. IF NOT KDETAIL[0] THEN
  512. BEGIN
  513. KDETAIL[0]=TRUE;
  514. KDRNXT[0]=1;
  515. KSHOW[0]=TRUE;
  516. END
  517. GOTO LB$EXIT;
  518.  
  519. LB$ERR: # PROCESS TYPE IN ERROR #
  520. KRC = 4;
  521. GOTO LB$EXIT;
  522.  
  523. LB$IGNORE: # IGNORE TYPE IN #
  524. LB$EXIT:
  525. END # END NAM K DISPLAY COMMAND SWITCH #
  526.  
  527. IF KRC NQ 0
  528. THEN
  529. BEGIN # ISSUE DIAGNOSTIC TO K DISPLAY #
  530. IF KDST[0] # RELEASE STATUS DISPLAY TO ISSUE ERROR MSG #
  531. THEN
  532. BEGIN
  533. OVLNAME = KPCLNUPP;
  534. OVLCALL;
  535. END
  536. PARAMS1 = KRC;
  537. OVLNAME = KDISRCP;
  538. OVLCALL;
  539. END
  540. END # END NAM MODE PROCESSING #
  541.  
  542. KBUF1[0] = 0;
  543. GOTO RJMAIN;
  544.  
  545. END # KPTYPIN #
  546.  
  547. TERM
cdc/nos2.source/nam5871/kptypin.txt ยท Last modified: 2023/08/05 17:22 by Site Administrator