! ----- VALID_UIC.FUN ----- ! ! ----- FUNCTION TO VERIFY A USER-ENTERED UIC ----- ! ! ---------- PASSED: ---------- ! ! ----- VERIFY_UIC = UIC string to be verified (format of ! ----- ggg,mmm or [ggg,mmm]) ! ! ---------- RETURNED: ---------- ! ! ----- VALID_UIC returns FALSE if valid UIC, otherwise TRUE ! ----- CHANGED_UIC_GRP = Decimal UIC group (if VALID_UIC is ! ----- False and DISPLAY_MATCHING_GROUP_UICS is False) ! ----- CHANGED_UIC_MBR = Decimal UIC member (if VALID_UIC is ! ----- False and DISPLAY_MATCHING_GROUP_UICS is False) ! ----- GRP = Decimal UIC group (if VALID_UIC is False) ! ----- MBR = Decimal UIC member (if VALID_UIC is False) ! ! ----- Last Change 07/13/93 by Brian Lomasky ----- ! FUNCTION WORD VALID_UIC(WORD DISPLAY_MATCHING_GROUP_UICS, & STRING VERIFY_UIC) %INCLUDE "NUSER.INC" DECLARE WORD COMMA_POS ! POSITION OF COMMA WITHIN UIC DECLARE WORD ERR_FLAG ! TRUE IF DONE READING SYSUAF DECLARE WORD MATCH_FOUND ! TRUE IF MATCH FOUND DECLARE WORD TEMP ! TEMPORARY WORD VARIABLE DECLARE STRING TEMP_STRING ! TEMPORARY STRING DECLARE LONG THE_GRP ! CONVERTED GROUP UIC VALUE DECLARE LONG THE_MBR ! CONVERTED MEMBER UIC VALUE DECLARE WORD UIC_LENGTH ! LENGTH OF UIC DECLARE STRING UIC_TO_VERIFY ! UIC TO BE VERIFIED EXTERNAL LONG FUNCTION DEC_TO_OCT( & LONG) ! CONVERT DECIMAL TO OCTAL EXTERNAL WORD FUNCTION NUMERIC( & STRING) ! CHECK FOR NUMERIC STRING EXTERNAL LONG FUNCTION OCT_TO_DEC( & LONG) ! CONVERT OCTAL TO DECIMAL VALID_UIC = TRUE ! ASSUME INVALID UIC UIC_TO_VERIFY = VERIFY_UIC ! MOVE TO LOCAL VARIABLE ! ----- BETTER HAVE A COMMA ----- IF POS(UIC_TO_VERIFY, ",", 1%) = 0% THEN PRINT PRINT "Error - No comma found in UIC" + & TRM$(PLEASE_TRY_AGAIN) PRINT EXIT FUNCTION END IF ! ----- ENSURE SURROUNDED BY BRACKETS ----- TEMP = POS(UIC_TO_VERIFY, "[", 1%) IF TEMP = 0% THEN UIC_TO_VERIFY = "[" + UIC_TO_VERIFY TEMP = 1% END IF IF TEMP <> 1% THEN PRINT PRINT "Error - Invalid bracket found in UIC" + & TRM$(PLEASE_TRY_AGAIN) PRINT EXIT FUNCTION END IF TEMP = POS(UIC_TO_VERIFY, "]", 1%) IF TEMP = 0% THEN UIC_TO_VERIFY = UIC_TO_VERIFY + "]" TEMP = LEN(UIC_TO_VERIFY) END IF IF TEMP <> LEN(UIC_TO_VERIFY) THEN PRINT PRINT "Error - Invalid bracket found in UIC" + & TRM$(PLEASE_TRY_AGAIN) PRINT EXIT FUNCTION END IF UIC_LENGTH = LEN(UIC_TO_VERIFY) IF UIC_LENGTH < 3% OR UIC_LENGTH > 14% THEN PRINT PRINT "Error - Invalid UIC length" + & TRM$(PLEASE_TRY_AGAIN) PRINT EXIT FUNCTION END IF COMMA_POS = POS(UIC_TO_VERIFY, ",", 1%) IF COMMA_POS <= 1% OR COMMA_POS >= UIC_LENGTH - 1% THEN PRINT PRINT "Error - Invalid comma found in UIC" + & TRM$(PLEASE_TRY_AGAIN) PRINT EXIT FUNCTION END IF ! ----- EXTRACT AND VERIFY UIC GROUP ----- TEMP_STRING = SEG$(UIC_TO_VERIFY, 2%, COMMA_POS - 1%) IF NOT NUMERIC(TEMP_STRING) THEN PRINT PRINT "Error - Non-Numeric UIC group" + & TRM$(PLEASE_TRY_AGAIN) PRINT EXIT FUNCTION END IF IF LEN(TEMP_STRING) < 1% OR LEN(TEMP_STRING) > 5% THEN PRINT PRINT "Error - Invalid range for UIC group" + & TRM$(PLEASE_TRY_AGAIN) PRINT EXIT FUNCTION END IF IF POS(TEMP_STRING, "8", 1%) <> 0% OR & POS(TEMP_STRING, "9", 1%) <> 0% THEN PRINT PRINT "Error - Non-Octal digit found in UIC" + & " group" + TRM$(PLEASE_TRY_AGAIN) PRINT EXIT FUNCTION END IF ! ----- CONVERT UIC GROUP TO DECIMAL VALUE ----- GRP = OCT_TO_DEC(INTEGER(TEMP_STRING, LONG)) ! ----- ALLOW OCTAL UIC GROUPS FROM 1 -> 37776 ----- ! ----- (1 -> 16382 DECIMAL) ----- IF GRP < 1% OR GRP > 16382% THEN PRINT PRINT "Error - Invalid range for UIC group" + & TRM$(PLEASE_TRY_AGAIN) PRINT EXIT FUNCTION END IF ! ----- EXTRACT AND VERIFY UIC MEMBER ----- TEMP_STRING = SEG$(UIC_TO_VERIFY, COMMA_POS + 1%, & UIC_LENGTH - 1%) IF NOT NUMERIC(TEMP_STRING) THEN PRINT PRINT "Error - Non-Numeric UIC member" + & TRM$(PLEASE_TRY_AGAIN) PRINT EXIT FUNCTION END IF IF LEN(TEMP_STRING) < 1% OR LEN(TEMP_STRING) > 6% THEN PRINT PRINT "Error - Invalid range for UIC member" + & TRM$(PLEASE_TRY_AGAIN) PRINT EXIT FUNCTION END IF IF POS(TEMP_STRING, "8", 1%) <> 0% OR & POS(TEMP_STRING, "9", 1%) <> 0% THEN PRINT PRINT "Error - Non-Octal digit found in UIC" + & " member" + TRM$(PLEASE_TRY_AGAIN) PRINT EXIT FUNCTION END IF ! ----- CONVERT UIC MEMBER TO DECIMAL VALUE ----- MBR = OCT_TO_DEC(INTEGER(TEMP_STRING, LONG)) ! ----- ALLOW OCTAL UIC MEMBERS FROM 0 -> 177776 ----- ! ----- (0 -> 65534 DECIMAL) ----- IF MBR < 0% OR MBR > 65534% THEN PRINT PRINT "Error - Invalid range for UIC member" + & TRM$(PLEASE_TRY_AGAIN) PRINT EXIT FUNCTION END IF ! ----- CONVERT SO IT WILL FIT INTO A WORD VALUE ----- MBR = MBR - 65536% IF MBR > 32767% ! ----- DONE IF NO UIC DISPLAY IS WANTED ----- IF NOT DISPLAY_MATCHING_GROUP_UICS THEN ! ----- STORE OCTAL UIC GROUP AND MEMBER ----- THE_GRP = DEC_TO_OCT((GRP)) THE_MBR = DEC_TO_OCT((MBR)) IF DEBUG_MODE THEN PRINT "DEBUG>Valid UIC of [" + & NUM1$(THE_GRP) + "," + & NUM1$(THE_MBR) + "] was found" END IF ! ----- STORE DECIMAL UIC VALUE TO CHANGE TO ----- CHANGED_UIC_GRP = GRP CHANGED_UIC_MBR = MBR VALID_UIC = FALSE ! RETURN VALID UIC STATUS EXIT FUNCTION END IF ! ----- STORE INITIAL UIC SEARCH VALUE ----- IF DEBUG_MODE THEN PRINT "DEBUG>SEARCH FOR ANY (DEC) UIC GROUP OF "; GRP END IF OCT_UIC_GROUP = GRP ! DECIMAL GROUP TO SEARCH FOR OCT_UIC_MEMBER = 0% ! START SEARCH WITH FIRST MEMBER MATCH_FOUND = FALSE ! ASSUME NO MATCHING UIC GROUP ERR_FLAG = FALSE ! SET SO LOOP WILL EXECUTE WHEN ERROR IN FIND #50%, KEY #1% GE UIC, REGARDLESS USE IF ERR = BUCKET_LOCKED THEN SLEEP 1% RETRY END IF ERR_FLAG = TRUE ! SET END-OF-FILE FLAG CONTINUE IF ERR = REC_NOT_FOUND EXIT HANDLER END WHEN WHILE NOT ERR_FLAG ! LOOP TILL WE'RE DONE WHEN ERROR IN ! ----- READ NEXT SEQUENTIAL RECORD ----- GET #50%, REGARDLESS USE IF ERR = BUCKET_LOCKED THEN SLEEP 1% RETRY END IF ERR_FLAG = TRUE ! SET END-OF-FILE FLAG CONTINUE IF ERR = REC_NOT_FOUND EXIT HANDLER END WHEN ITERATE IF ERR_FLAG ! DONE IF END-OF-FILE FLAG SET UNLOCK #50% IF DEBUG_MODE THEN PRINT "DEBUG> FOUND (DEC) UIC GROUP" + & " OF "; OCT_UIC_GROUP END IF SELECT GRP CASE > OCT_UIC_GROUP ! FOUND UIC LESS THAN SEARCH UIC ITERATE ! READ NEXT RECORD CASE < OCT_UIC_GROUP ! FOUND UIC MORE THAN SEARCH UIC ERR_FLAG = TRUE ! SET TO EXIT LOOP ITERATE ! SKIP TO END OF LOOP END SELECT ! ----- CONVERT DECIMAL UIC GROUP NUMBER TO ITS ----- ! ----- OCTAL VALUE (EXPRESSED AS A DECIMAL) ----- THE_GRP = DEC_TO_OCT((OCT_UIC_GROUP)) ! ----- CONVERT DECIMAL UIC MEMBER NUMBER TO ITS ----- ! ----- OCTAL VALUE (EXPRESSED AS A DECIMAL) ----- THE_MBR = DEC_TO_OCT((OCT_UIC_MEMBER)) ! ----- UIC GROUPS MATCH ----- IF NOT MATCH_FOUND THEN PRINT PRINT "(Displaying existing users" + & " having this UIC Group...)" PRINT PRINT "Owner " + & " Username UIC Dept" MATCH_FOUND = TRUE END IF PRINT LEFT(OWNER_NAME, OWNER_NAME_LENGTH); & TAB(33%); TRM$(USER_NAME); TAB(46%); & "[" + NUM1$(THE_GRP) + "," + & NUM1$(THE_MBR) + "]"; TAB(60%); & TRM$(ACCOUNT_NAME); PRINT " Disuser"; IF (FLAGS(0%) AND 16%) <> 0% PRINT NEXT IF DEBUG_MODE THEN PRINT "DEBUG>EXIT SEARCH - MATCH_FOUND="; MATCH_FOUND END IF PRINT IF MATCH_FOUND VALID_UIC = FALSE ! RETURN VALID UIC STATUS END FUNCTION