	! ----- 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
