1. STRING
STRING statement는 2개 이상의 데이터 항목이나 리터럴의 내용 일부 또는 전부를 하나로 합쳐서 하나의 데이터 항목으로 만든다. 비슷한 작업을 위해 MOVE statement를 여러 개 사용하는 대신에 하나의 STRING statement를 사용할 수 있다.
다음은 statement의 각 설정 항목에 대한 설명이다.
-
identifier-1, literal-1
-
소스가 되는 데이터 필드를 지정한다. USAGE DISPLAY 또는 USAGE DISPLAY-1이 명시적 또는 암묵적으로 지정된 데이터 항목이어야 한다. Alphanumeric type의 special register가 올 수 있다.
-
literal-1은 alphanumeric 카테고리에 속해 있어야 한다. ALL이라는 워드로 시작하지 않는 임의의 Figurative constant(NULL 제외)를 지정할 수 있다. Figurative constant는 각각 1문자의 영숫자 리터럴로 간주된다.
-
-
DELIMITED BY phrase
-
문자열을 구분짓는 구분자를 지정한다.
-
다음 항목을 설정한다.
항목 설명 identifier-2, literal-2
문자열을 구분짓는 구분자를 지정한다.
MOVE할 때 구분될 문자를 타나낸다. SIZE 지정이 있을 경우에는 identifier-1 또는 literal-1에 지정된 데이터 항목 모두가 MOVE된다.
Figurative constant(단, ALL 제외)를 지정했을 경우에는 1byte 문자 하나를 지정했음을 의미한다. literal-2는 alphanumeric이어야 한다.
SIZE
주어진 문자열 전체를 지정한 것을 의미한다.
-
-
INTO phrase
-
destination 필드를 지정한다.
-
다음 항목을 설정한다.
항목 설명 identifier-3
destination 문자열을 지정한다. 최종적으로 만들어진 문자열이 담길 데이터 항목을 지정한다. JUSTIFIED clause를 지정할 수 없다.
identifier-3가 USAGE DISPLAY일 경우, identifier-1 및 identifier-2는 USAGE DISPLAY이어야 하고, alphanumeric 리터럴을 가져야 한다. ALL을 제외한 모든 Figurative Constant가 나올 수 있다. Figurative constant는 각각 1문자의 영숫자 리터럴로 간주된다.
identifier-3가 USAGE DISPLAY-1일 경우, identifier-1 및 identifier-2는 USAGE DISPLAY-1이어야 하고, DBCS 리터럴을 가져야 한다. SPACE 외의 모든 Figurative constant는 올 수 없다.
-
-
WITH POINTER phrase
-
결과 데이터를 담는 데이터 필드의 문자 길이를 가리킨다. 포인터 필드는 소스 문자열의 USAGE가 DISPLAY, DISPLAY-1일 때 상대적인 문자의 길이 정보다.
-
포인터 필드는 결과 데이터의 길이보다 1을 더한 값을 담을 수 있는 충분한 크기의 데이터 필드를 지정한다.
-
다음 항목을 설정한다.
항목 설명 identifier-4
포인터 필드를 지정한다. 지정할 경우 프로그래머가 명시적으로 이용할 수 있지만, 초기값 설정에 주의를 기울여야 한다.
identifier-4의 초기값은 1 이상의 값이어야 한다. 초기값이 설정되어 있지 않거나 1 이상의 값이 아닐 경우에는 값을 보장하지 않는다.
-
identifier-4를 제외한 모든 항목은 USAGE DISPLAY, DISPLAY-1중 하나여야 한다.
identifier-1,2가 numeric 카테고리의 데이터 항목을 참조할 경우 각각의 숫자 항목은 PICTURE 문자열 내에 기호 P를 지정하지 않은 정수로 기술해야 한다.
identifier-1,2가 elementary 데이터이면서 USAGE DISPLAY 타입을 가지고있고, numeric, numeric-edited, alphanumeric-edited 항목이면 이는 alphanumeric 항목인것으로 취급된다.
subscript, reference modification, variable-length, function identifier등의 모든것의 evaluation은 STRING statement의 시작과 함께 진행된다.
-
ON OVERFLOW phrase
-
오버플로우는 다음과 같은 상황에서 발생한다.
-
포인터 필드의 값이 1보다 작을 경우
-
포인터 필드의 값이 입력으로 받은 데이터 필드보다 클 경우
오버플로우가 발생하면 데이터는 더 이상 MOVE되지 않는다. 오버플로우가 발생한 시점에 ON OVERFLOW와 함께 지정된 명령어로 제어가 흘러간다.
-
-
명령어에서 명시적으로 제어의 이동이 있을 경우에는 해당 명령어의 규칙에 따라 그렇지 않을 경우에는 명령어를 실행 후 STRING statement의 끝이 수행된다.
-
STRING statement를 실행할 때 오버플로우 조건이 발생하지 않았다면 ON OVERFLOW는 무시 된다. 이때 프로그램의 제어권은 STRING statement의 끝 또는 NOT ON OVERFLOW 지정이 있을 경우엔 함께 지정된 명령어로 제어가 이동된다.
-
다음 항목을 설정한다.
항목 설명 imperative-statement-1
오버플로우가 발생하는 경우 실행될 statement를 기술한다.
-
-
END-STRING phrase
-
STRING statement 범위의 끝을 명시적으로 지정한다.
-
END-STRING phrase를 사용하여 다른 조건문에 STRING statement를 조건식으로 중첩하여 사용할 수 있다.
-
데이터 흐름
STRING statement는 소스가 되는 필드에서 최종 결과물이 담기는 목표 필드로 문자를 전송한다. 소스 필드는 STRING statement에 기술된 순서에 따라 처리된다.
다음 규칙이 적용된다.
-
소스 필드에서 receiving필드로 문자는 다음과 같은 방법으로 전송된다.
-
2byte 문자일 경우에는 2byte 문자간의 MOVE 규칙이 적용된다.
-
그 이외의 경우 영숫자간의 기본 이동에 관한 MOVE 규칙이 적용된다.
-
-
DELIMITED BY identifier-2 또는 literal-2을 지정했을 경우, 각각 소스 필드는 가장 왼쪽에 위치한 문자에서 시작해서 한 문자씩 다음에 해당되는 지점까지 MOVE된다.
-
해당 소스 필드의 분리문자를 만났을 경우(분리문자 자체는 MOVE되지 않는다)
-
해당 소스 필드의 가장 오른쪽 문자까지 MOVE됐을 경우
-
-
DELIMITED BY SIZE 지정이 있을 경우에는 해당 소스 필드의 전체가 MOVE 다.
-
receiving 필드가 꽉차거나 또는 모든 소스 필드에 대한 처리가 끝날 때까지 데이터 전송 조작이 이루어진다.
-
POINTER를 지정할 경우 사용자는 소스가 되는 필드의 포인터 값을 명시적으로 설정해야 한다.
STRING statement에서 데이터 처리가 완료되고 나면 목표 필드는 데이터가 이동된 부분만 변경된다. 목표 필드에서 변경되지 않은 부분에는 STRING statement 실행 전의 데이터가 들어 있다.