Wel help

(Wel Version 1.0)

2002. 8. 8.

Wesoft

차 례

1.  Wel의 소개	7

1.1  Wel에 관하여	7

1.2  Wel 프로그램의 구조	8

1.3  Wel의 특징	8

1.4  Wel의 예약어	8

1.5  Wel의 실행 과정	9

2.  주석문(Comment)	10

3.  상수(Constant)	10

4.  변수(Variable)	13

4.1  변수의 정의	13

4.2  변수명 작성 규칙	13

4.3  Wel 언어 변수의 특징	13

4.4  변수의 종류	14

4.5  배열(Array)	15

4.6  객체(Object)	17

5.  확장열(Escape sequence)	18

6.  인라인 프린트(Inline print)	19

7.  Form macro란?	20

7.1  Form macro의 정의	20

7.2  Form macro의 특징	20

7.3  Form macro의 형식	21

7.4  Form macro의 종류	22

7.4.1  가변길이 출력 매크로	22

7.4.2  고정길이 출력 매크로	23

7.4.3  레이블 매크로	25

7.4.4  명령어 매크로	25

7.4.4.1  echo 명령어	25

7.4.4.2  end 명령어	26

7.4.4.3  endrep 명령어	26

7.4.4.4  goto 명령어	27

7.4.4.5  repeat 명령어	27

7.4.4.6  stop 명령어	28

7.4.5  변수해제 매크로	28

7.4.6  질의 매크로	29

7.4.7  표준입력 매크로	30

7.4.8  Wel 매크로	30

8.  연산자(Operator)	31

8.1  연산순서 및 규칙	31

8.2  대입 연산자( = )	32

8.3  단항 마이너스( - )	32

8.4  산술 연산자( +  -  *  / )	32

8.5  거듭제곱 연산자( ** )	33

8.6  잉여 연산자( % )	33

8.7  증감 연산자( ++  -- )	33

8.8  산술 혼합 연산자( ~=  +=  -=  *=  ... )	34

8.9  관계 연산자( >  >=  ==  !=  <  <= )	35

8.10  논리 연산자( !  &&  || )	36

8.11  문자열 결합 연산자( ~ )	36

8.12  순서 연산자( , )	37

8.13  Bit 연산자( ~  &  | )	37

8.14  Shift 연산자( <<  >> )	39

9.  Wel의 문법(Grammar)	40

9.1  문(Statement)의 종류	40

9.2  형(Type) 선언문	40

9.3  조건문	42

9.4  반복문	44

9.5  분기문	45

9.6  변수 제어문	46

9.7  return문	47

9.8  기능성 문자열	47

9.9  함수의 정의 및 사용	48

9.10  사용자 정의 함수	49

9.11  기억 클래스	51

10.  기본 내장함수	53

10.1  수학함수	53

10.1.1  abs()	53

10.1.2  cos()	53

10.1.3  exp()	54

10.1.4  fix()	54

10.1.5  log()	55

10.1.6  log10()	55

10.1.7  rand()	56

10.1.8  real()	56

10.1.9  sin()	57

10.1.10  sqrt()	57

10.1.11  tan()	58

10.2  문자변환 함수	59

10.2.1  asc()	59

10.2.2  chr()	59

10.2.3  str()	60

10.2.4  val()	60

10.3  진법변환 함수	61

10.3.1  hex()	61

10.3.2  oct()	61

10.4  날짜와 시간 함수	62

10.4.1  date()	62

10.4.2  iday()	63

10.4.3  idayof()	63

10.4.4  imonth()	64

10.4.5  iweek()	64

10.4.6  iyear()	65

10.4.7  sumday()	65

10.4.8  time()	66

10.5  암호화 및 복호화	67

10.5.1  crypt()	67

10.5.2  Wel의 암호체계	68

10.5.3  decode()	70

10.5.4  encode()	71

10.5.5  encodekey()	72

10.6  문자열 함수	73

10.6.1  left()	73

10.6.2  len()	74

10.6.3  lrtrim()	74

10.6.4  ltrim()	75

10.6.5  mid()	75

10.6.6  right()	76

10.6.7  rtrim()	76

10.6.8  split()	77

10.6.9  sprintf()	78

10.6.10  strchange()	78

10.6.11  strchange_preset()	80

10.6.12  strcount()	81

10.6.13  strep()	81

10.6.14  strfind()	82

10.6.15  strfindreplace()	82

10.6.16  strform()	83

10.6.17  strkind()	84

10.6.18  tolower()	85

10.6.19  toupper()	85

10.7  입출력 함수	86

10.7.1  choice()	86

10.7.2  flush()	86

10.7.3  inkey()	87

10.7.4  input()	88

10.7.5  print()	88

10.7.6  printf()	89

10.7.7  putchar()	90

10.8  시스템 함수	91

10.8.1  getenv()	91

10.8.2  getgid()	92

10.8.3  getpid()	92

10.8.4  getuid()	92

10.8.5  keybreak()	93

10.8.6  msleep()	94

10.8.7  passwdseek()	94

10.8.8  putenv()	95

10.8.9  randomize()	95

10.8.10  runtime()	96

10.8.11  setuser()	96

10.8.12  sleep()	97

10.8.13  system()	97

10.8.14  timeout()	98

10.9  부가기능 함수	99

10.9.1  array()	99

10.9.2  element()	99

10.9.3  fparser()	100

10.9.4  header()	101

10.9.5  htmldeltag()	102

10.9.6  htmlquery()	103

10.9.7  include()	104

10.9.8  isarray()	105

10.9.9  isobject()	106

10.9.10  istype()	107

10.9.11  parser()	108

10.9.12  queryencode()	109

10.9.13  setcookie()	110

10.9.14  setlocal()	111

10.9.15  setqueryencode()	112

10.9.16  setwel()	113

11.  ANSI 코드 함수	114

11.1  cls()	114

11.2  locate()	115

12.  File 및 Directory 관련 함수	116

12.1  File 입출력 함수	116

12.1.1  fclose()	116

12.1.2  fdump()	117

12.1.3  feof()	118

12.1.4  fexist()	119

12.1.5  ffield()	120

12.1.6  fflush()	121

12.1.7  finput()	121

12.1.8  flastch()	122

12.1.9  fopen()	123

12.1.10  fprint()	123

12.1.11  fprintf()	124

12.1.12  fputc()	125

12.1.13  fseek()	126

12.1.14  fsizeof()	126

12.1.15  ftell()	127

12.1.16  pclose()	128

12.1.17  popen()	129

12.1.18  rename()	130

12.1.19  unlink()	130

12.2  Directory 관련 함수	131

12.2.1  chdir()	131

12.2.2  getcwd()	131

12.2.3  mkdir()	132

12.2.4  rmdir()	133

12.3  File 과 Directory 관련 함수	134

12.3.1  chmod()	134

12.3.2  getmod()	135

12.3.3  isdir()	136

13.  Form macro 함수	137

13.1  formclose()	137

13.2  formdump()	138

13.3  formgoto()	139

13.4  formmerge()	140

13.5  formopen()	141

13.6  formredir()	142

13.7  listmerge()	143

14.  통신 관련 함수	145

14.1  gethostbyaddr()	145

14.2  gethostbyname()	145

14.3  sockclose()	146

14.4  sockopen()	146

14.5  sockread()	147

14.6  sockwrite()	148

15.  데이터베이스 관련 함수	149

15.1  mSQL 데이터베이스 함수	149

15.1.1  mSQL 사용 절차	149

15.1.2  msqlClose()	150

15.1.3  msqlConnect()	150

15.1.4  msqlDataSeek()	151

15.1.5  msqlError()	152

15.1.6  msqlFetchField()	153

15.1.7  msqlFetchGlobal()	155

15.1.8  msqlFetchObject()	158

15.1.9  msqlFetchRow()	161

15.1.10  msqlFieldSeek()	162

15.1.11  msqlFreeResult()	163

15.1.12  msqlGetHostInfo()	164

15.1.13  msqlGetProtoInfo()	164

15.1.14  msqlGetServerInfo()	165

15.1.15  msqlListDBs()	165

15.1.16  msqlListFields()	166

15.1.17  msqlListTables()	167

15.1.18  msqlNumFields()	168

15.1.19  msqlNumRows()	169

15.1.20  msqlQuery()	170

15.1.21  msqlQueryResult()	171

15.1.22  msqlSelectDB()	172

15.1.23  msqlStoreResult()	173

15.2  MySQL 데이터베이스 함수	174

15.2.1  MySQL 사용 절차	174

15.2.2  mysql_close()	175

15.2.3  mysql_connect()	175

15.2.4  mysql_data_seek()	176

15.2.5  mysql_errno()	177

15.2.6  mysql_error()	177

15.2.7  mysql_fetch_field()	178

15.2.8  mysql_fetch_global()	181

15.2.9  mysql_fetch_object()	184

15.2.10  mysql_fetch_row()	187

15.2.11  mysql_field_seek()	188

15.2.12  mysql_field_tell()	189

15.2.13  mysql_free_result()	190

15.2.14  mysql_get_client_info()	191

15.2.15  mysql_get_host_info()	191

15.2.16  mysql_get_proto_info()	192

15.2.17  mysql_get_server_info()	192

15.2.18  mysql_info()	193

15.2.19  mysql_insert_id()	193

15.2.20  mysql_list_dbs()	194

15.2.21  mysql_list_fields()	195

15.2.22  mysql_list_tables()	197

15.2.23  mysql_num_fields()	199

15.2.24  mysql_num_rows()	200

15.2.25  mysql_query()	201

15.2.26  mysql_query_result()	202

15.2.27  mysql_select_db()	203

15.2.28  mysql_stat()	204

15.2.29  mysql_store_result()	205

<참고1> Wel의 에러 및 경고 메시지	207

<참고2> ASCII 코드표	208

<참고3> Wel의 구문정리	210

<참고4> 함수 색인	212

1.  Wel의 소개

1.1  Wel에 관하여

Wel은 Web Effector Language의 약자로서 경북 김천에 위치한 중앙컴퓨터정보

처리학원 & Wesoft가 제작한 언어 해석기입니다.  Wel의 문법은 C언어 프로그래

머나 전문 프로그래머들의 쉬운 이해와 사용을 위하여 java처럼 C언어와 유사한

부분이 많도록 하였습니다.

이 언어는 기능적으로 Wel언어 처리기와 Form macro 처리기의 2개의 부분으로

구성이 되어 있으며,  메일 머지 기능처럼 출력 형식과 목록을  폼 머지를 하여

간편하게 출력물을 얻을 수 있습니다.  그리고 화면 또는 프린터로 인쇄할 내용

의 출력설계시  무척 간단하고 빠르고 쉽게 작업을 할 수 있습니다.  지금 보고

계시는 도움말 문서도 Wel로 작성된 것인데 아주 쉽고 간편하게 문서를 제작 할

수 있었습니다.

Wel의 또 다른 특징은 HTML 문서를 가공하는 CGI 프로그램을 개발할 때 빠르고

쉽게 작업을 할 수 있을 것입니다.   Script 언어 보다 편하고 C언어 보다 쉽게

CGI 프로그램을 개발하시기를 원하신다면  Wel이 그 도구의 역할을 무난히 수행

할 것입니다.  Database(현재는 mSQL과 MySQL만 지원)의  처리도 가능하고 Text

기반의 업무용 프로그램도 Wel로 작성할 수 있을 것입니다.

이 버전을 사용하시다가 버그(bug)를 발견하시거나 기능 추가에 대한 의견이

있어 아래의 주소로 전자우편을 주시면 차기 버전에 반영하도록 하겠습니다.

홈페이지 주소: http://wesoft.co.kr

개발자  email: gline@wesoft.co.kr

WEL(Web Effector Language) Interpreter version 1.0 for Linux

Copyright (c) 1999/2000/2001/2002 by Wesoft Corp. All rights reserved.

제작: 1999/10/22 , 2002/07/31

배포: Wel V0.3.2b - 2000년  1월  1일

Wel V0.4.1b - 2000년  2월 29일

Wel V0.5.1b - 2000년  4월 30일

Wel V0.6.3b - 2000년  6월 30일

Wel V0.6.4b - 2000년  8월  5일

Wel V0.7.1b - 2000년  8월 31일

Wel V0.8    - 2000년 12월 26일

Wel V0.8.3  - 2001년  6월 29일

Wel V0.9    - 2001년  9월  1일

Wel V0.9.2  - 2001년 12월 12일

Wel V1.0    - 2002년  9월  1일

1.2  Wel 프로그램의 구조

(1) Wel은 언어 처리기와 Form macro 처리기로 구성되어 있다.

(2) Wel의 프로그램은 아무런 함수 선언부분 없이 작성되어질 수 있다. 그곳이

C언어의 main이라는 함수처럼 프로그램의 시작점(Entry Point)이 되며, 절

차형으로 순서 있게 수행이 되어진다.

(3) '#'와 '//'로 시작되는 한 줄의 내용 및 '/*' 와 '*/' 사이의 내용은 주석문

으로 처리되며 그 내용은 번역 및 실행이 되지 않는다.

(4) Wel의 모든 문장은 반드시 세미콜론(;)으로 끝마쳐야 한다.

(5) Wel 프로그램은 구조적 프로그래밍(Structured Programming) 기법을 채택

하기 때문에 프로그램 실행을 정의하는 문장들은 중괄호({})로 묶어서

블럭화 시킨다. 단, 프로그램의 시작점이 되는 부분은 중괄호가 없어도 된다.

(6) Wel은 원시 프로그램의 줄바꿈을 무시하기 때문에 문장을 여러줄로 나누어서

작성하여도 된다.

(7) '/" ~ "/' 사이의 내용을 Inline print라 하며, 그 내용은 화면으로 출력이

되어진다.  이 곳에 Form macro가 사용되었거나 확장열(Escape sequence)이

있다면 모두 풀려진 후에 출력이 된다.

1.3  Wel의 특징

(1) Form macro 처리기에 의하여 강력한 문서화 및 입출력 설계가 가능하다.

(2) 배우기 쉽고 간결하며 문자열의 취급이 편리하다.

(3) 구조적 프로그래밍 기법을 채택하고 있다.

(4) 다른 컴퓨터로 이식하기가 쉽다.

(5) 다양한 연산기능을 갖고 있다.

(6) 명령어가 소문자로 구성되어 있으며 그 종류가 적다.

(7) 한글 변수를 사용할 수 있으며, 변수명은 영문 소문자와 대문자를 구별한다.

(8) 선언없이 변수를 사용할 수 있으며, 형(Type) 변환이 자유롭기 때문에

변수의 형(Type)이 자료형에 알맞게 자동으로 변환된다.

(9) 프로그램의 시작으로부터 종료시까지 변수의 값이 유지되는 전역변수와

사용자 정의 함수 내에서만 통용되는 지역변수가 있다.

(10) 함수명과 동일한 명칭의 변수를 사용할 수 있다.

1.4  Wel의 예약어

(1) 선언문

1) 형 선언문: char, int, long, float, double, string, free

(2) 조건문: if, else

(3) 반복문: for, while, do

(4) 분기문: break, continue, goto

(5) 변수제어문: vlock, vunlock, vfree

(6) 기  타: function, return , static , global

※ 참고: 밑줄의 명령들은 차기 버전에서 구현할 것입니다.(이 버전에서는 실행되지 않음)

1.5  Wel의 실행 과정

□□□□□□□□□□□□□□□□□□□□□□□

□          기호 상수를 정의 한다.          □

□□□□□□□□□□□□□□□□□□□□□□□

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□명령어 라인에서 전달된 인자 개수(argc)와 인자 값(argv[])을 설정한다.□

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□  (/etc/wel.passwd가 없을 때)

◇□□□□□□□□□□□□□

□□□□□□□□□□□□□□□□□□□□□□□  □

□ /etc/wel.passwd가 존재하면 그 내용을 읽어□  □

□ 변수(암호에 관련된 변수)를 정의한다.     □  □

□□□□□□□□□□□□□□□□□□□□□□□  □

□←□□□□□□□□□□□□

(/etc/wel.root가 없을 때)   □

□□□□□□□□□□□□□◇

□  □□□□□□□□□□□□□□□□□□□□□□□

□  □ /etc/wel.root의 프로그램을 실행한다.     □

□  □□□□□□□□□□□□□□□□□□□□□□□

□□□□□□□□□□□□→□

□□□□□□□□□□□□□□□□□□□□□□□

□     사용자 Wel 프로그램을 실행한다.      □

□□□□□□□□□□□□□□□□□□□□□□□

□□□□□□□□□□□□□□□□□□□□□□□

□     사용한 자원을 반환하고 종료한다.     □

□□□□□□□□□□□□□□□□□□□□□□□

※ /etc/wel.root에 대하여

Wel의 초기 개발 버전부터 설계되어 있었던 기능이었으나 여러가지 이유로

인하여 배포할 때 이 기능은 제거 되었습니다.  이것은 서버 관리자가

/etc/wel.root에 Wel 프로그램을 작성하여 root의 권한으로 실행할 수 있는

것으로 계정 사용자의 잘못된 Wel의 사용으로 인한 장애를 극복할 수 있는

수단을 제공하게 됩니다. 가장 좋은 예로 프로그램을 잘못 작성하여 무한

루프에 빠지게 되면 그 프로그램에서 timeout()함수를 호출하여 실행시간을

제한해 두었다면 문제가 없지만 그렇지 않으면 프로세스를 강제 종료하지

않는 한 무한히 실행을 하게 됩니다.  최악의 경우를 가정하여 아래와 같이

test.wel이란 프로그램을 작성했다고 가정합니다.

---------------------------------------------

#/bin/wel

i= 1;

while(i <= 10) i= 2;

---------------------------------------------

위와 같이 프로그램을 작성한 후, 이 프로그램을 /etc/crontab에서 10분

간격으로 실행을 하도록 했다면 종료가 되지 않고 무한히 실행되기 때문에

10분 마다 프로세스가 생성되고 무한히 실행하여 시간이 경과하면 메모리가

소진되어 결국 서버가 다운될 것입니다.

이 기능을 다시 사용하게 된 가장 큰 이유는 사용자의 실수로 위와 같은

프로그램이 실행될 때 이를 통제할 수 있는 수단을 /etc/wel.root가 제공할

수 있기 때문입니다.

기본적으로 설치되는 /etc/wel.root는 위의 예제처럼 무한 루프를 실행하는

프로그램을 종료시킬 수 있도록 하기 위하여 실행 시간을 30초로 제한 하도록

프로그래밍 하였습니다.  서버 관리자는 실정에 알맞게 /etc/wel.root를 수정

하시면 될 것입니다.  만일  특정 프로그램을 실행시간 제한 없이 실행하기를

원한다면  해당 프로그램 내에서  timeout(0); 을 호출하여  실행시간 제한을

해제하시면 됩니다.

2.  주석문(Comment)

Wel의 주석문은 '#'과 '//' 및 '/* ~ */'의 세가지 종류가 있으며 주석문의

내용은 번역 및 실행을 하지 않는다.

(1) '#' On-line Comment

- 이것은 Script 언어와의 호환성을 위하여 존재하며, 이 기호로부터

그 줄 끝까지는 주석으로 처리된다.

(2) '//' On-line Comment

- 이것은 C언어와 호환이 되며 이 기호로부터 그 줄 끝까지는 주석으로

처리된다.

(3) '/* ~ */' Comment

- C언어와 호환이 되며 줄 바뀜에 구분없이 /*로 시작된 위치로부터

*/로 끝나는 위치까지를 주석으로 처리하며 중첩해서 사용할 수는

없다.

3.  상수(Constant)

1. Wel의 상수(Constant) 종류

(1) 정수형 상수(Integer Constant == Fixed Point Constant)

1) 10진 상수: 0(Zero)으로 시작될 수도 있는 10진 숫자열

옳은 예) 100 , -32768 , +256 , 0123 , 000123

틀린 예) 1,234 , #10 ,  1 234

2) 8진 상수: 0c(Zero 와 c) 또는 0C(Zero 와 C)로 시작하는 8진 숫자열

옳은 예) 0c377 , 0C101 , -0c345

틀린 예) 0c198 , 0C1 01 , -0c9A

3) 16진 상수: 0x(Zero 와 x) 또는 0X(Zero 와 X)로 시작하는 16진 숫자열

옳은 예) 0x1AB , -0xFf , 0XbF

틀린 예) 0x1 AB , 0xGF

4) 정수형 상수의 범위는 -2147483648 ~ +2147483647이며 그보다 작거나

큰수는 소수점(.)이 없더라도 실수형 상수로 취급한다.

(2) 실수형 상수(Floating Point Constant)

1) 10진 상수: 소수점(.)을 포함하는 10진 숫자열

옳은 예) 100.0 , 100. , 0.12 , .123 , 3.14159266

틀린 예) 1. 234 , 12 .34

2) 8진 상수: 소수점(.)을 포함하는 8진 숫자열

옳은 예) 0c0.77 , 0C10.1 , -0c.345

틀린 예) 0.0c12 , .0C56 , -0.c34

3) 16진 상수: 소수점(.)을 포함하는 16진 숫자열

옳은 예) 0x0.1AB , -0x.ff , 0Xb.F

틀린 예) 0.0x1AB , .0xF6 , -0.x41

(3) 지수 상수: 실수형 상수로서 아주 큰수나 작은수를 표현할 수 있다.

1) 10진 지수 상수

옳은 예) 1e3 , 1.5E3 , 12E-1 , -1.5e+03

틀린 예) 1E3.5 , 1.5e , 12E -1 , -1.5e+ 03

2) 8진 지수 상수

옳은 예) 0c1e1 , 0C1.5e+02 , -0c.3e-3

틀린 예) 0c1 e2 , C5e1.6 , -0.c3e- 3.0

3) 16진 지수 상수: 16진 상수는 지수 상수로 표현하지 못함

(4) 문자 상수(Character Constant)

-. 단일 인용부호(')와 단일 인용부호(') 사이의 한 글자를 의미하며

해당 문자의 코드값(ASC와 같은 문자코드)을 의미하며 문자가 아니라

정수형 상수로 취급한다.

옳은 예) 'A' , '"' , '\'' , '\x41'

틀린 예) 'A , ''' , 'AB'

(5) 문자열 상수(Character String Constant)

-. 이중 인용부호(")와 이중 인용부호(") 사이의 문자들의 나열을 의미한다.

(원시 프로그램 작성시 문자열 상수내에서 줄을 바꾸면 에러 처리되며

여러줄로 나누어 코딩할 수 없다)

옳은 예) "A" , "AB\"CD" , "AB\nCD"

틀린 예) "ABC , "ABC"DEF" , "AB

CD"

(6) 기능성 문자열 상수(Functional String Constant)

-. '{[' 와 ']}' 사이의 문자들의 나열을 의미하며 문자열 상수로 취급한다.

문자열 상수나 기능성 문자열 상수는 parser() 함수로 실행할 수 있으며

프로그램의 한 부분으로 취급될 수 있는 것이 특징이다. parser() 함수를

이용할 때 문자열 상수보다는 기능성 문자열 상수를 사용 하는 것이

편리하다.(원시 프로그램 작성시 여러줄로 나누어 코딩할 수 있다)

-. 기능성 문자열 상수내에서 이중 인용부호(")를 사용할 수 있다.

-. 기능성 문자열 상수내의 확장열(Escape sequence)은 확장이 되지 않는다.

( parser() 함수로 실행하는 시점에서 확장된다 )

옳은 예) routine1= {[ a=5+3; ]}

routine2= {[ a="AB"~"CD"; print(a,"\n"); ]}

틀린 예) {[ a=5+3; ]}

routine= {[ a=5+3; ]} ~ {[ b=3+4; ]}

(7) 기호 상수(Symbolic Constant)

-. C 언어의 기호 상수와는 개념이 다르며 이미 정의된 변수로써 vunlock

명령어로 읽기 전용을 해제하기 전에는 그 값을 변경할 수 없다.

< 기호 상수의 종류 >

argc         : 명령어 라인에서 입력한 인자의 개수이다.

argv[첨자]   : 명령어 라인에서 입력한 인자의 값을 저장한 배열이다.

WelCopyright : Wel copyright 메시지#1 문자열

WelCopyright2: Wel copyright 메시지#2 문자열

WelVersion   : Wel 버전 문자열

NULL         : 수치/포인터 연산에는 그 값이 0 이고 문자열 연산에는

길이가 0 인 Null string으로 취급되며 ""과 유사하다.

ERROR        : 에러시 -1을 돌려주는 함수의 비교용, 그 값은 -1 이다.

ON             : 스위치의 on을 의미하며 그 값은 정수 1 이다.

OFF            : 스위치의 off를 의미하며 그 값은 정수 0 이다.

TRUE           : 참의 값을 의미하며 그 값은 정수 1 이다.

FALSE          : 거짓의 값을 의미하며 그 값은 정수 0 이다.

EOF            : 파일의 끝을 의미하며 그 값은 정수 -1 이다.

FILE_OPEN_ERR  : 파일 개방 에러를 의미하며 그 값은 정수 0 이다.

SEEK_SET       : fseek() 함수에서 사용하며 그 값은 정수 0 이다.

SEEK_CUR       : fseek() 함수에서 사용하며 그 값은 정수 1 이다.

SEEK_END       : fseek() 함수에서 사용하며 그 값은 정수 2 이다.

MSQL_ERR       : mSQL 함수 에러를 의미하며 그 값은 정수 -1 이다.

MYSQL_ERR      : MySQL 함수 에러를 의미하며 그 값은 정수 -1 이다.

IMAP_ERR       : IMAP 함수의 에러를 의미하며 그 값은 정수 -1 이다.

FORM_NOERR     : formopen() 함수의 결과값으로 그 값은 정수 0 이다.

FORM_OPENERR   : formopen() 함수의 결과값으로 그 값은 정수 -1 이다.

FORM_READERR   : formopen() 함수의 결과값으로 그 값은 정수 -2 이다.

FORM_OUTMEMERR : formopen() 함수의 결과값으로 그 값은 정수 -3 이다.

LIST_OPENERR   : listmerge() 함수의 결과값으로 그 값은 정수 -4 이다.

TYPE_FREE       : istype() 함수의 결과값으로 정수(0, 0x0)이다.

TYPE_POINTER    : istype() 함수의 결과값으로 정수(16, 0x10)이다.

TYPE_FILEPTR    : istype() 함수의 결과값으로 정수(17, 0x11)이다.

TYPE_MSQLPTR    : istype() 함수의 결과값으로 정수(24, 0x18)이다.

TYPE_MSQLRESPTR : istype() 함수의 결과값으로 정수(25, 0x19)이다.

TYPE_MYSQLPTR   : istype() 함수의 결과값으로 정수(26, 0x1A)이다.

TYPE_MYSQLRESPTR: istype() 함수의 결과값으로 정수(27, 0x1B)이다.

TYPE_SOCKPTR    : istype() 함수의 결과값으로 정수(28, 0x1C)이다.

TYPE_MAILPTR    : istype() 함수의 결과값으로 정수(29, 0x1D)이다.

TYPE_OBJECT     : istype() 함수의 결과값으로 정수(31, 0x1F)이다.

TYPE_STRING     : istype() 함수의 결과값으로 정수(32, 0x20)이다.

TYPE_CHAR       : istype() 함수의 결과값으로 정수(65, 0x41)이다.

TYPE_INT        : istype() 함수의 결과값으로 정수(66, 0x42)이다.

TYPE_LONG       : istype() 함수의 결과값으로 정수(68, 0x44)이다.

TYPE_FLOAT      : istype() 함수의 결과값으로 정수(132, 0x84)이다.

TYPE_DOUBLE     : istype() 함수의 결과값으로 정수(136, 0x88)이다.

4.  변수(Variable)

4.1  변수의 정의

프로그램이 실행되는 동안 수치 상수, 문자 상수, 문자열 상수등을 기억시키기

위한 저장 공간으로 변수의 명칭은 사용자가 임의로 정의하여 사용하며 영문자,

숫자, 한글을 혼합하여 명칭을 지정할 수 있다.  즉, 변수란 상수를 넣는 그릇

(용기)과 같은 것이다.

4.2  변수명 작성 규칙

(1) 영문자(대문자, 소문자)와 숫자, 한글 및 밑줄 문자(underscore)(_)를

사용할 수 있다.

(2) 첫글자는 반드시 영문자 또는 한글이어야 하며 underscore(_)도 영문자로

취급한다.

(3) 하나의 변수명 내에는 공백이나 기호가 올 수 없다.

(4) 예약어(Reserved word, 명령어)는 변수명으로 사용할 수 없다.

(5) 영문 대문자와 소문자는 서로 다른 문자로 처리된다.

(6) 변수명의 길이는 30자 이내이어야 한다.(나머지는 무시됨)

4.3  Wel 언어 변수의 특징

(1) Wel의 모든 변수는 폼(Form) 파일에서도 사용되어질 수 있다.

(2) 이 버전의 Wel에서는 모든 변수가 프로그램의 시작과 끝까지(폼 파일 포함)

참조 및 변경을 할 수 있는 전역변수와 사용자 정의 함수 내에서만 통용되는

지역변수가 있다.

(3) 임의로 변수를 해제하거나 읽기 전용으로 설정하여 해당 변수의 값을

변경하지 못하게 할 수 있다.

(4) 별도의 선언없이 혹은 free형으로 선언하여 변수를 사용할 경우에 그 변수는

모든 자료를 자유롭게 수용할 수 있다.  즉, 문자열을 기억하고 있으면서

숫자를 기억 할 수도 있다.(변수의 자료형이 자유롭게 변한다)

4.4  변수의 종류

1. 변수 선언문

Wel은 아래와 같은 종류의 변수를 선언할 수 있다.  그 중에서 자유형(free)은

다른 종류의 자료형을 모두 수용할 수 있는 변수로 선언하는 것을 의미한다.

자료의 종류	변수선언문
1byte 문자코드(부호없음) 2byte 부호있는 정수(단정도 정수) 4byte 부호있는 정수(장정도 정수) 4byte 부동소수점수(단정도 실수) 8byte 부동소수점수(배정도 실수) 문자열 자유형	char int long float double string free

2. 정수 변수(Integer Variable)

정수형 상수를 기억하는 변수로 정수형 외의 값은 형변환 되어 기억된다.

문자열도 형변환이 되며 수치가 될 수 없을 때에는 에러 처리된다.

선언문	변수의 상수 수용범위	자료 기억 방식
int	-32768 ∼ +32767	2byte 부호와 2의 보수법
long	-2147483648 ∼ +2147483647	4byte 부호와 2의 보수법

<정수 변수 선언의 예>

int a=100, b=a+1, c; // 변수 a=100, b=101, c는 0으로 초기화 됨

long d; // 변수 d는 0으로 초기화 됨

3. 실수 변수(Real Variable)

실수형 상수를 기억하는 변수로 실수형 외의 값은 형변환 되어 기억된다.

문자열도 형변환이 되며 수치가 될 수 없을 때에는 에러 처리된다.

선언문	자료 기억 방식
float	4byte 부동 소수점
double	8byte 부동 소수점

<실수 변수 선언의 예>

float a=12.34, b= 1e3;

double c; // c는 0.0으로 초기화 됨

4. 문자 변수(Character Variable)

문자 상수(해당 문자의 코드값)를 기억하는 변수로 문자 상수외의 값은

형변환 되어 기억된다. 문자열도 형변환이 되며 수치가 될 수 없을 때에는

에러 처리된다.

선언문	변수의 상수 수용범위	자료 기억 방식
char	0 ∼ 255	부호없는 1byte 문자 코드값

<문자 변수 선언의 예>

char a='A', b=65, c; // c는 0으로 초기화 됨

5. 문자열 변수(Character String Variable)

문자열(문자의 나열)을 기억하는 변수로 문자열외의 값은 형변환 되어

기억된다. 수치도 문자열로 형변환이 된다.

선언문	자료 기억 방식
string	문자열과 '\0'의 형태

<문자열 변수 선언의 예>

string a="happy", b="day", c; // c는 문자열의 길이가 0인 Null string임

6. 자유형 변수(Free Variable)

위의 모든 종류의 자료를 수용할 수 있는 변수로써 자료에 따라 변수의

자료형이 자동으로 변환되며, Wel에서 선언하지 않고 사용하는 모든 변수는

자유형 변수이다.

선언문	자료 기억 방식
free	char int long float double string을 모두 수용

<자유형 변수 선언의 예>

free a=3.14, b=30, c="happy", d; // d는 0 또는 Null string임

4.5  배열(Array)

1. 배열

배열은 하나의 변수명으로 여러개의 자료를 기억할 수 있는 자료의 집단을

의미한다.  Wel은 같은 종류의 자료 집단이나 서로 다른 종류의 자료 집단으로

배열을 사용 할 수 있다.  단, 선언하지 않은 배열은 사용할 수 없으며 최대

3차원 배열까지 사용할 수 있다.

1) 이질적인 배열(자료 집단)의 예

free a[3];

a[0]= 1234;

a[1]= 'A';

a[2]= 3.14;

a[3]= "array";

b= a; // a 배열을 b로 복사한다.(만일 b가 배열이었으면 그 배열은 해제된다)

print(b[3]); // a[3]을 출력하는 것과 동일하게 "array"를 출력한다.

2) 배열의 대입(복사)

배열의 차원과 자료형이 같다면 배열명만 사용하여 배열의 대입이 가능하며

선언하지 않은 변수나 free형으로 선언된 변수는  해당 변수의 배열의 차원에

무관하게 모든 자료형의 배열 또는 단순 변수를 대입할 수 있다.

예) int a[3], a2[2][2], a3[7], a4;

float b[3], b2[2][2], b3[7], b4;

free c[3], c2[2][2], c3[7], c4;

a= a3; // 배열 a3가 배열 a에 대입된다.

a= b;  // 배열  b와 배열 a가 자료형이 다르기 때문에 에러 발생

a= a2; // 배열 a2와 배열 a가 차원이 다르기 때문에 에러 발생

a= a4; // 변수 a4와 배열 a가 차원이 다르기 때문에 에러 발생

c= a;  // free형 배열 c는 차원과 자료형을 무시하고 a가 대입된다.

c2= a; // free형 배열 c2는 차원과 자료형을 무시하고 a가 대입된다.

c4= b2; // free형 변수 c4는 차원과 자료형을 무시하고 b2가 대입된다.

abc= a; // 변수 abc는 선언되지 않아서 free형이 되며 a가 대입된다.

c[0]= c3; // 변형된 배열로 c[0]은 2차원 c[1],c[2],c[3]은 1차원 배열임

2. 1차원 배열

배열의 첨자(Subscript)가 1개 있으며 0첨자부터 선언한 첨자값까지의 공간이

확보된다.

형식)  변수선언문  배열변수명 [ 첨자 ];

예) int a[3]; // 정수를 수용할 수 있는 배열공간 확보(0부터 3까지임)

free b[3]; // 모든 자료를 수용할 수 있는 배열 공간 확보

b[0]= 1;

b[1]= 2.5;

b[2]= "happy";

b[3]= b[0] + 1;

a[ b[0] ] = 10; // b[0]의 값이 1이므로 a[1]에 10이 기억됨

3. 2차원 배열

배열의 첨자(Subscript)가 2개 있으며 0첨자부터 선언한 첨자값까지의 공간이

확보된다.

형식)  변수선언문  배열변수명 [ 행첨자 ] [ 열첨자 ];

예) int a[3][3]; // 전체 4*4개의 요소가 확보됨(0부터 3첨자 까지)

4. 3차원 배열

배열의 첨자(Subscript)가 3개 있으며 0첨자부터 선언한 첨자값까지의 공간이

확보된다.

형식)  변수선언문  배열변수명 [ 행첨자 ] [ 열첨자 ] [ 면첨자 ];

예) int a[3][3][3]; // 전체 4*4*4개의 요소가 확보됨(0부터 3첨자 까지)

4.6  객체(Object)

1. 객체(Object) 변수

현재 Wel 버전에서는 객체에 대한 개념 및 변수의 사용이 완전히 정립되지 않은

상태이며, 객체의 정의를 위한 문법적인 보완은 점진적으로 작업이 되어질 예정

이다.  Wel의 객체는 자료를 지닐 수 있으며 자료를 조작하는 함수를 포함할 수

있다.  현재는  객체 변수를  선언 없이 사용하거나  또는  객체의 멤버 변수를

객체 이름과 동시에 선언하여 사용할 수 있으며 객체변수의 복사 및  함수의 되

돌림 값(Return value)으로 사용할 수 있다.  변수명에 "."이 있으면 그 변수는

객체 변수이며 그 변수 내에 또 다른 멤버 변수와 또 다른 객체 변수를  포함할

수 있다.

(예)   컴퓨터.본체.cpu = 686

위의 예에서 "컴퓨터" 나 "본체" 는 객체 변수이고  686이란 수치가 대입되는

"cpu" 는 자료를 수용하는 멤버 변수이다. 선언없이 객체나 멤버 변수를 사용할

수 있기 때문에 "컴퓨터"에 얼마나 많은 멤버와 하위 객체를 포함하고 있는지는

작성된 Wel 원시프로그램을 분석하지 않고는 알 수 없다.  이는 객체의  뼈대인

클래스에 대한 정의 부분이 추가 되지 않았기 때문이다.

2. 객체(Object) 변수의 사용

-. 아래와 같이 선언 없이 객체를 사용할 수 있다.

컴퓨터.본체.cpu= 686;

컴퓨터.본체.memory= "128Mbytes";

컴퓨터.모니터.크기= "19inch";

컴퓨터.모니터.가격= 500000;

PC= 컴퓨터; // "컴퓨터"내의 모든 멤버 및 하위 객체가 "PC"로 복사됨

print(PC.본체.memory); // "128Mbytes"가 출력됨

<위 예의 구조>

컴퓨터 □□→  본체 □□□□→ "cpu"      PC  □□→  본체 □□□□→ "cpu" 멤버 변수

□    □            □□→ "memory"    □  □            □□→ "memory" 멤버변수

□□□□□□                             □□□□

□□→ 모니터 □□□→ "크기"         □□→ 모니터 □□□→ "크기" 멤버 변수

□□→ "가격"                      □□→ "가격" 멤버 변수

3. 객체(Object) 배열 변수의 사용

-. 객체 배열만 선언하는 문법적인 보완은 아직 하지 않았으며 멤버변수의

선언과 동시에 할 수 있다.(아직 완전하지 않음)

free a[2].b, 우리동네.아파트[2].주인;

a[0].b= 12; a[1].b= 13; a[2].b= 14;

우리동네.아파트[0].주인= "홍길동";

우리동네.아파트[1].주인= "박길동";

우리동네.아파트[2].주인= "이길동";

a[0].집= 우리동네.아파트; // "아파트" 객체 배열을 a[0]의 "집"으로 복사

print(a[0].집[0].주인); // "홍길동"이 출력됨

※ 위의 예에서 "집" 이란 객체 배열은 a[0] 객체 배열에만 존재하고

a[1] 에서 a[3] 까지는 현재까지 "b"란 멤버변수만 존재한다.

5.  확장열(Escape sequence)

C언어의 확장열(Escape sequence)과 동일하며 제어 문자처럼 원시 프로그램에

키보드로 직접 입력할 수 없는 문자를 표현하는 수단이  된다.  아래의 <확장열

의 적용범위>에 나열한 (1)에서 (4)항을 제외한 다른 부분에서는 확장열을 사용

할 수 없으며  "\"와 영문 한자 또는 "\0"와 8진 수치 그리고 "\x"와 16진 수치

로 구성이 된다.

< 확장열의 적용범위 >

(1) 문자열의 내부("이중 인용부호안의 내용")

(2) 문자 상수의 내부('단일 인용부호안의 내용')

(3) Inline print의 내부(/"로 시작해서 "/로 끝나는 부분)

(4) 기능성 문자열({[로 시작해서 ]}로 끝나는 부분)

< 확장열의 종류 >

\b - Back space              [ASC  8번]

\t - 수평탭(Horizontal tab)  [ASC  9번]

\n - 줄바꿈(New line)        [ASC 10번]

\f - Form feed               [ASC 12번]

\r - 엔터키(Carriage return) [ASC 13번]

\" - 이중 인용부호(") 문자   [ASC 34번]

\' - 단일 인용부호(') 문자   [ASC 39번]

\\ - Back slash(\) 문자      [ASC 92번]

\0 - 널문자(Null character)  [ASC  0번]

\xhh - 16진 수치 Bit pattern(hh는 최고 2자리 16진수를 의미한다)

\Xhh - \xhh와 의미가 같다.

\ddd - 8진 수치 Bit pattern(ddd는 최고 3자리 8진수를 의미한다)

< 확장열의 사용예 >

(1) 사용예#1             (2) 사용예#2             (3) 사용예#3

print("\101\102C\104");  print("\x41B\X43D");     print("AB\bCD");

-----------------------  -----------------------  -----------------------

출력결과) ABCD           출력결과) ABCD           출력결과) ACD

- 사용예#1, #2: 대문자 "A"의 ASC코드 값은 10진수로는 65번, 8진수로는 101,

16진수로는 41이다.

- 사용예#3: \b는 ASC코드 8번으로 확장된다.  이 8번 코드는 제어문자로써

커서를 왼쪽으로 한칸 옮겨주는(Back space) 역할을 하며, 사용

예#3에서 AB를 인쇄한 후 커서가 B글자의 자리로 되돌아와서

B가 지워지면서 그 자리에 C가 출력된다.

6.  인라인 프린트(Inline print)

Wel은 원시 프로그램의 문장중에 /"로 시작하여 "/로 끝나는 부분이 있다면 그

내용을 출력하게 된다.  이것을 Inline print라 하며 이 내용중에 Form macro나

확장열(Escape sequence)이 사용되었다면 그것을 확장하여 출력한다.

Wel에서 출력을 하고자 한다면 Inline print를 이용할 수도 있고 또는 print() ,

putchar()등과 같은 함수를 사용해도 된다.(Inline print는 폼 매크로의 폼으로

처리되며 32 개 이상의 폼이 중첩되어 개방된 상태에서 사용하면 에러 처리된다.

Inline print 내에서 개방된 폼은 Inline print가 종료될 때 모두 폐쇄된다)

(1) Inline print의 사용예#1         (2) Inline print의 사용예#2

-------------------------------     ----------------------------------

#!/bin/wel                          #!/bin/wel

a=1, b=2;                           /"{& a=1; b=2; c=a+b; }

c=a+b;                              a={$a}, b={$b}, c={& print(c); }\n"/

/"a={$a}, b={$b}, c={$c}"/

-------------------------------     ----------------------------------

출력결과) a=1, b=2, c=3             출력결과) a=1, b=2, c=3

7.  Form macro란?

7.1  Form macro의 정의

폼 매크로(Form macro)는 서식 출력이나 기타 모든 Text file에 대해서 메일

머지(Mail merge)와 같은 기능을 제공하는 것으로 프로그램 개발시 생산성을

향상할 수 있으며,  Wel은 입출력 형식 및 HTML문서의 디자인과 같은 작업의

편리를 위하여 폼 매크로 처리기를 Wel의 한 부분으로 내장하고 있다.

프로그램 개발시 형식화된 입출력 폼(Form)에 자료나 목록(List)을 넣어서

화면이나 프린터로 출력하고자 한다면 Wel이 뛰어난 기능을 발휘한다.

프로그램을 입출력 형식으로부터 분리할 수 있으며 프로그램의 제어 없이도

원하는 출력 결과물을 얻을 수 있다.

입출력 폼(Form)은 원시 프로그램에 포함될 수도 있고 별도의 파일로 작성하여

이용할 수도 있으며, 폼에 사용할 자료나 목록(List)은 프로그램이 가공하거나

이미 가공하여 파일로 보관되어 있더라도 폼 매크로의 기능을 이용할 수 있다.

7.2  Form macro의 특징

(1) 입출력 형식을 설계하기 쉽다.

(2) 입출력 자료를 Form macro에 의하여 가공할 수 있다.

(3) 입출력 폼(Form)내에서 Wel언어를 사용할 수 있다.

(4) CGI 프로그램 작성시 프로그램과 HTML문서를 분리할 수 있다.

(HTML을 문서 이상의 것으로 생각하지 않으면 프로그램의 일부가 될 수 없으며

프로그램으로부터  분리하여 취급할 수 있다.  문서를  원시 프로그램 내에서

가공하게 된다면 프로그램 작성의 능률은 저하되고 전반적인 흐름을 파악하기

어려워진다)

(5) Form macro에 의하여 프로그램과 문서를 완전히 분리할 수 있지만

그 반대로 문서가 프로그램이 되거나 프로그램이 문서가 될 수도 있다.

7.3  Form macro의 형식

중괄호 ( '{' 와 '}' ) 안에 오는 문자들  중에서  '{' 다음의 글자가 매크로

식별문자('$', '#', ':', '!', '-', '?', '%', '&')이면 Form macro로 처리되고

그 형식은 아래와 같다.

(주의) '{' 와 매크로식별문자 사이에 공백이 있으면 폼 매크로로 인식하지 않으며

잘못된 폼 매크로를 사용하면 에러 처리된다.

(예: 매크로 변수명 오류, 매크로 명령어 오류, 매크로 레이블 오류)

<형식>

{식별자[ ][정렬방식[ ]][매크로변수|명령어|레이블][[,][ ]고스트문자열]}

-. 표기#1: 매크로식별문자를 "식별자"로 표기함

-. 표기#2: '[' 와 ']' 는 그 안의 내용이 생략될 수 있음을 의미함

( [ ] 표시는 한 칸 이상의 공백을 허용함을 의미함 )

-. 표기#3: '|' 기호는 '또는' 을 의미하는 뜻으로 표기한 것임

-. 식별자:  $  #  :  !  -  ?  %  &

-. 정렬방식:  <  =  >

-. 매크로변수: 첫글자는 영문 또는 한글이어야 하며 두번째 글자부터는

숫자와 혼용할 수 있다.(영문 대.소문자 구분이 있음)

-. 명령어: clear , echo , endrep , end , goto , repeat , stop

(폼 매크로 명령어는 대소문자를 구분하지 않는다)

-. 레이블: goto 명령어를 사용하여 폼의 다른 부분으로 이동할 때 그 목적지

를 지정하는 식별어

-. 고스트문자열: 후위(접미) 문자열을  의미하며  매크로 변수가  없을 경우

(정의되지 않았을 경우)에는 출력되지 않고  매크로 변수가

있을 때에는 그 변수의 값을 출력한 뒷편에 출력되어 진다.

마치 유령처럼 사라지거나 표현(확장)되어 고스트 문자열로

지칭하였다.

7.4  Form macro의 종류

7.4.1  가변길이 출력 매크로

1. 가변길이 출력 매크로: 매크로 변수의 내용을 문자수에 상관없이 모두 출력함

(1) 형식

{$[ ][-][ ]매크로변수[,][ ][고스트문자열]}

※ 위의 형식에서 매크로 식별문자($)와 매크로 변수 사이에는 공백을 사용할

수 있으며 매크로 변수내에는 공백이나 ',' 를 사용할 수 없다.

만일 공백이나 ',' 를 사용했다면 매크로 변수와 고스트 문자열을 분리하는

문자로 인식하여 그 문자의 뒤로부터 매크로가 종료되는 '}' 문자 전까지

고스트 문자열로 취급된다.(이 규칙은 모든 매크로에 적용된다)

※ ',' 분리문자 - Comma 다음의 문자(공백을 포함)로부터 '}' 이전까지를

고스트 문자열로 취급하도록 한다.

※ 공백 분리문자 - 매크로 변수 다음의 최초 문자가 공백이면 그 공백의  뒷

부분에 나열되는 문자들 중에서 최초의 비공백문자로부터

고스트 문자열로 취급하도록 한다.

※ '-' - 고정길이 출력 매크로와 가변길이 출력 매크로 내에서 적용되는

것으로 출력후 매크로변수를 해제한다.

(2) 사용예

a= "행복", b= "홍길동";

/"우리는 {$a}합니다.\n"/                 # 예#1

/"귀하의 이름은 {$b,   님}입니다.\n"/    # 예#2

/"귀하의 이름은 {$b    님}입니다.\n"/    # 예#3

vfree b; // 변수 b를 해제함(변수 b가 소멸됨)

/"당신이 {$b   님이라 }생각합니다.\n"/   # 예#4

b="김길동";

/"당신이 {$b   님이라 }생각합니다.\n"/   # 예#5

---------------------------- [ 출력결과 ] ----------------------------

우리는 행복합니다.               <--- 예#1의 결과

귀하의 이름은 홍길동   님입니다. <--- 예#2의 결과(컴머 분리문자 사용)

귀하의 이름은 홍길동님입니다.    <--- 예#3의 결과(공백 분리문자 사용)

당신이 생각합니다.               <--- 예#4의 결과(매크로 변수가 없을 때)

당신이 김길동님이라 생각합니다.  <--- 예#5의 결과

7.4.2  고정길이 출력 매크로

2. 고정길이 출력 매크로: 매크로 변수의 내용을 편집하여 매크로의 폭만큼 출력함

(1) 형식

{#[ ][정렬방식][ ][@필드폭[,][ ]][-][ ][매크로변수][,][ ][고스트문자열]}

※ 위의 형식에서 매크로 식별문자(#)와 매크로 변수 사이에는 공백을 사용할

수 있으며 매크로 변수내에는 공백이나 ',' 를 사용할 수 없다.

만일 공백이나 ',' 를 사용했다면 매크로 변수와 고스트 문자열을 분리하는

문자로 인식하여 그 문자의 뒤로부터 매크로가 종료되는 '}' 문자 전까지는

고스트 문자열로 취급된다.(이 규칙은 모든 매크로에 적용된다)

※ ',' 분리문자 - Comma 다음의 문자(공백을 포함)로부터 '}' 이전까지를

고스트 문자열로 취급하도록 한다.

※ 공백 분리문자 - 매크로 변수 다음의 최초 문자가 공백이면 그 공백의  뒷

부분에 나열되는 문자들 중에서 최초의 비공백문자로부터

고스트 문자열로 취급하도록 한다.

※ 정렬방식 - 고정길이 출력 매크로에서 의미가 있으며 출력내용을 필드폭

내에서 정렬방식 지정문자에 의하여 정렬을 할 수 있다.

정렬방식 지정문자:      <            =              >

(왼쪽 정렬) (가운데 정렬)  (오른쪽 정렬)

※ 필드폭 - 고정길이 출력과 표준입력 매크로에서 의미가 있으며 출력내용의

폭을 명시적으로 표기할 수 있다.

묵시적(필드폭을 서술하지 않으면)인 필드폭은 매크로의 시작과

끝(중괄호 포함한 크기)까지가 필드폭이 된다.

※ 필드폭과 매크로 변수 분리문자 - 공백 또는 Comma를 사용할 수 있으며

이 두문자는 같은 의미로 처리된다.

※ 매크로 변수의 값이 필드폭보다 문자수가 많을 때에는 변수 값의 끝부분이

짤려진다.

※ 고정길이 출력 매크로에서는 매크로 변수를 생략할 수 있으며 고스트 문자

열만을 정렬방식으로 출력하고자 할 때 사용한다.

(2) 정렬방식에 관련된 예제

a= "행복", b= "새가 멀리";

/"우리는 {#a        }합니다.\n"/    # 예#1

/"우리는 {#>a       }합니다.\n"/    # 예#2

/"우리는 {#=a       }합니다.\n"/    # 예#3

/"우리는 {#<a       }합니다.\n"/    # 예#4

/"높이 나는 {#b}본다.\n"/           # 예#5

---------------------------- [ 출력결과 ] ----------------------------

우리는 행복        합니다. <--- 예#1의 결과(정렬방식이 없는 예)

우리는         행복합니다. <--- 예#2의 결과(오른쪽 정렬일 때)

우리는     행복    합니다. <--- 예#3의 결과(가운데 정렬일때)

우리는 행복        합니다. <--- 예#4의 결과(왼쪽 정렬일 때, 예#1과 동일)

높이 나는 새가본다.        <--- 예#5의 결과(필드폭보다 클때 변수값이 짤림)

(3) 필드폭 및 고스트 스트링에 관련된 예제

a= "행복";

/"우리는 {#=@20,a}합니다.\n"/         # 예#1

/"우리는 {#>@20,a}합니다.\n"/         # 예#2

/"우리는 {#=@20,a, 이라}합니다.\n"/   # 예#3

/"우리는 {#=@7,a, 이라}합니다.\n"/    # 예#4

/"앞{#=@20,,안쪽}뒤\n"/               # 예#5

/"앞{#=   ,안쪽}뒤\n"/                # 예#6

---------------------------- [ 출력결과 ] ----------------------------

우리는         행복        합니다. <--- 예#1의 결과

우리는                 행복합니다. <--- 예#2의 결과

우리는      행복 이라      합니다. <--- 예#3의 결과

우리는 행복 이합니다.              <--- 예#4의 결과

앞        안쪽        뒤           <--- 예#5의 결과

앞    안쪽    뒤                   <--- 예#6의 결과

7.4.3  레이블 매크로

3. 레이블 매크로: goto 매크로 명령을 사용할 때 목적지를 지정하는 역할을 한다.

(1) 형식

{:[ ]레이블명}

※ 레이블명은 영문자, 한글, 숫자 또는 이들을 혼합하여 사용할 수 있으며

영문 대문자와 소문자는 다른 것으로 처리한다.

※ 고스트 문자열과 필드폭은 무시된다.

(2) 사용예

/"무엇이 {!goto output}입력이 {:output}출력이 될까?\n"/

---------------------------- [ 출력결과 ] ----------------------------

무엇이 출력이 될까?

7.4.4  명령어 매크로

7.4.4.1  echo 명령어

1) 형식: {![ ]echo[,][ ]모드}

※ 필드폭은 무시된다.

※ 고스트 문자열은 모드로 취급되며 on 또는 off를 사용할 수 있다.

2) 설명: 폼(Form)의 내용을 출력할 것인지 아닌지를 설정하는 것으로 모드가

on이면 그 이후의 내용을 출력하고 off이면 출력하지 않는 폼 제어

명령어로 초기값은 {!echo on}이다.

<사용예>

/"안녕{!echo off}하세요?{!echo on} 반갑습니다.\n"/

---------------------------- [ 출력결과 ] ----------------------------

안녕 반갑습니다.

7.4.4.2  end 명령어

1) 형식: {![ ]end}

※ 필드폭과 고스트 문자열은 무시된다.

2) 설명: 폼(Form)의 종료를 의미하는 폼 제어 명령어이다.

<사용예>

/"안녕하세요?\n{!end} 이 메시지는 출력될 수 없습니다."/

---------------------------- [ 출력결과 ] ----------------------------

안녕하세요?

7.4.4.3  endrep 명령어

1) 형식: {![ ]endrep}

※ 필드폭과 고스트 문자열은 무시된다.

2) 설명: {!repeat}명령어를 사용한 후에 그 짝으로 사용하며 폼(Form)의 특정

부분을 반복하고자 할 때 그 끝을 지정하는 폼 제어 명령어이다.

{!repeat}명령어 없이 사용하면 아무런 의미가 없다.

<주의> 이 명령어를 Inline print에서 사용하게 되면 최소반복횟수만큼

강제적으로 반복하게 된다.

<주의> 이 명령어를 폼 매크로 관련 함수에 의하여 처리하게 되면 반복

부분의 선두로 위치만 옮긴후 종료될 뿐 자동적으로 반복되지는

않는다.(단, formdump() 함수는 제외)

(프로그램에 의한 수동적인 폼 제어를 하게 된다.)

<사용예>

/"{!repeat,3}안녕하세요?\n{!endrep}"/

---------------------------- [ 출력결과 ] ----------------------------

안녕하세요?

안녕하세요?

안녕하세요?

7.4.4.4  goto 명령어

1) 형식: {![ ]goto[,][ ]레이블명|$변수명}

※ 필드폭은 무시된다.

※ 고스트 문자열의 첫글자가 영문, 한글, 숫자이면 레이블명이 된다.

※ 고스트 문자열의 첫글자가 '$'이면 변수명의 값이 레이블명이 된다.

2) 설명: {:레이블명}이 지정된 곳으로 분기하는 폼 제어 명령어이다.

※ 레이블명이 정의되지 않았으면 에러 처리된다.

<사용예>

/"안녕하세요?{!goto exit} 이 메시지는 출력될 수 없습니다.{:exit}"/

a="go2";

/"  {!goto $a}{:go1}행복하세요!{!goto 끝}{:go2}감사합니다.{:끝}"/

---------------------------- [ 출력결과 ] ----------------------------

안녕하세요?  감사합니다.

7.4.4.5  repeat 명령어

1) 형식: {![ ]repeat[,][ ][최소반복횟수|$변수명]}

※ 필드폭은 무시된다.

※ 고스트 문자열의 첫글자가 숫자이면 최소반복횟수가 된다.

※ 고스트 문자열의 첫글자가 '$'이면 변수명의 값이 최소반복횟수이다.

2) 설명: 폼의 반복부분의 시작 위치와 최소반복횟수를 기억할 뿐, 폼에 대하여

아무런 제어를 하지 않는다.  {!repeat}은 반드시 {!endrep}가 반복

부분의 끝에 있어야 하며 반복부분을 중첩해서 사용할 수도 있다.

(단, 중첩해서 사용할 때 32 회를 초과하여 중첩되면 에러 처리된다)

<사용예>

a=3; /"{!repeat,$a}안녕하세요? {!endrep}"/

---------------------------- [ 출력결과 ] ----------------------------

안녕하세요? 안녕하세요? 안녕하세요?

7.4.4.6  stop 명령어

1) 형식: {![ ]stop}

※ 필드폭과 고스트 문자열은 무시된다.

2) 설명: 이 명령이 있는 곳에서 폼의 출력이 일시 정지된다.

<주의> 이 명령어를 Inline print에서 사용하게 되면 무시된다.

<주의> 이 명령어를 폼 매크로 관련 함수에 의하여 처리하게 되면 폼의

현재 위치에서 종료되며,  폼 관련 함수를 이용하여 종료되었던

위치의 다음 부분을 처리할 수 있다.(단, formdump() 함수는 제외)

(프로그램에 의한 수동적인 폼 제어를 하게 된다.)

<사용예>

/"안녕하세요?{!stop} 이 명령은 인라인 프린트에서는 의미가 없음\n"/

---------------------------- [ 출력결과 ] ----------------------------

안녕하세요? 이 명령은 인라인 프린트에서는 의미가 없음

7.4.5  변수해제 매크로

5. 변수해제 매크로: 사용중인 변수를 해제하며 Wel의 vfree 명령과 같다. 선언되지

않았거나 사용하지 않은 변수의 해제시 에러 처리되지 않는다.

(1) 형식

{-[ ]변수명}

※ 고스트 문자열과 필드폭은 무시된다.

※ 고정 길이 매크로와 가변 길이 매크로 내에서도 사용될 수 있다.

(2) 사용예

a= 1, b= 2;

vfree a; /"{-b}"/

print("a=", a, " b=", b, "\n");

---------------------------- [ 출력결과 ] ----------------------------

a= b=

7.4.6  질의 매크로

6. 질의 매크로: 질의변수에 의한 결과에 따라 문장의 수행 여부를 결정한다.

(1) 형식

{?[ ][!][ ][*][ ]질의변수[,][ ]문장}

※ 고스트 문자열은 폼 매크로 또는 폼의 내용의 나열인 문장이다.

※ 질의변수: 질의 대상이 되는 매크로 변수로써 변수의 유무와 변수값의

유무에 관한 조건 기호에 따라 문장의 수행 여부를 결정한다.

※ 조건기호: ! - 부정을 의미하며 변수나 변수의 값이 없을 때 문장을

수행한다.(이 기호를 사용하지 않으면 변수나 변수의 값이

있을 때 문장을 수행한다)

* - 이 기호가 사용되면 질의 대상이 변수가 아니고 변수의 값이

된다.  즉, 변수의 값의 유무를 검사하여 문장을 수행하거나

하지 않을 수 있다.(정의되지 않은 변수에 대하여 값에 대한

질의를 하면 변수의 값이 없는 것으로 처리됨)

(2) 사용예

a=1; b="";

/"{?a,변수 a가 있음\n}"/             # a 변수가 존재하면 문장을 출력함

/"{?!a,변수 a가 없음\n}"/            # a 변수가 없으면 문장을 출력함

/"{?*b,변수 b의 값이 있음\n}"/       # b 변수의 값이 있으면 문장을 출력함

/"{?!*b,변수 b의 값이 없음\n}"/      # b 변수의 값이 없으면 문장을 출력함

/"{?!*b,{!goto next}}하나{:next}둘"/ # b 변수의 값이 없으면 goto next를 함

/"{?!*c,{!goto next}}하나{:next}둘"/ # 존재하지 않는 변수는 값이 없음

---------------------------- [ 출력결과 ] ----------------------------

변수 a가 있음

변수 b의 값이 없음

둘둘

7.4.7  표준입력 매크로

7. 표준입력 매크로: 표준입력장치(키보드)로부터 변수의 값을 입력 받는다.

(1) 형식 (이 매크로를 웹 상에서 사용하면 에러로 처리됩니다)

{%[ ][@필드폭[,][ ]]매크로변수[,][ ][["]입력형식["]]}

※ 고스트 문자열은 입력형식으로 사용된다.

※ 입력형식: 입력형식 문자는 '9'나 'A'('a')와 기타로 구분됨

입력형식문자 '9' - 수치외엔 입력되지 않음

입력형식문자 'A'('a') - 영문외엔 입력되지 않음

기타 문자 - 모든 문자가 입력될 수 있음(향후 변경될 것임)

(2) 사용예

/"{%@14,주민번호,"999999-9999999"}"/; print(주민번호, "\n");

---------------------------- [ 출력결과 ] ----------------------------

123456-1234567

7.4.8  Wel 매크로

8. Wel 매크로: 폼에서 Wel 프로그램의 문장를 실행하는 매크로이다.

(1) 형식

{&[ ]Wel프로그램[ ]}

※ 매크로의 끝을 알리는 '}' 기호 뒷부분의 공백과 제어문자는 최초의

줄바꿈(New line)문자가 있을 때까지 줄바꿈 문자와 함께 무시된다.

(2) 사용예

/"{& a=1, b=2; print("a=", a, " b=", b, "\n"); }"/

---------------------------- [ 출력결과 ] ----------------------------

a=1 b=2

8.  연산자(operator)

8.1  연산순서 및 규칙

아래의 표상에서 표의 줄을 기준으로 먼저 표기된 것이 연산 순서가 높은 것

이며 같은 줄의(같은 연산순서의) 연산자가 사용되었을 때, 결합규칙의 화살표

가 왼쪽으로 표기된 것은 오른쪽에서 왼쪽으로 풀이를 하고 오른쪽으로 표기된

것은 왼쪽에서 오른쪽으로 풀이를 한다.

대 분 류	소 분 류	연 산 자	결합규칙
일 차 식	primary	( ) [ ]	→
단항연산자	단 항	! ∼ ++ -- -(단항 minus)	←
이항연산자	거듭제곱	**	→
	승 제 산	* / %	→
	가 감 산	+ -	→
	Shift	<< >>	→
	비교연산	>= <= > <	→
	등가연산	== !=	→
	Bit AND	&	→
	Bit EOR	^	→
	Bit OR	|	→
	논리 AND	&&	→
	논리 OR	||	→
	문자열결합	∼	→
대 입 연 산 자	대 입	= ∼= += -= *= /= %= |= ^= &= <<= >>= **=	←
순서연산자	순 서	,	→

-. 위의 표상에서 두개 이상의 기호로 구성된 연산자 사이에 공백을 사용하면

에러 처리된다. (예) a & & b 는 에러 처리된다.

-. '!'는 논리 부정(NOT)을 의미한다.

-. '~'는 단항에서는 Bit NOT 연산자이고 이항에서는 문자열결합 연산자이다.

-. '%'는 나눗셈의 정수몫을 구한 나머지를 의미한다.(modular operator)

-. '같다'는 '=='로 사용해야한다. '='을 사용하면 대입연산자로 처리된다.

-. '!='는 '같지 않다'를 의미하며 '=!'를 사용할 수 없다.

-. '크거나 같다'는 '>='를 사용해야 하며 '=>'를 사용할 수 없다.

-. '작거나 같다'는 '<='를 사용해야 하며 '=<'를 사용할 수 없다.

8.2  대입 연산자

1. 연산자: =

2. 형  식: operand1 = operand2

operand1: 기억할 변수

operand2: 상수, 변수, 연산식

3. 설  명: operand2의 값을 operand1에 대입(기억)한다.

<예제>

a= 10; // a에 10 이 기억된다.

b= a;  // b에 a의 값 10 이 기억된다.

c= a + b; // a의 값 10 과 b의 값 10 을 더한 결과 20 이 c에 기억된다.

d= e= f= 1; // 오른쪽에서 왼쪽으로 풀며 f, e, d 모두에 1 이 기억된다.

8.3  단항 마이너스

1. 연산자: -

2. 형  식: - operand

operand: 상수, 변수, 괄호

3. 설  명: operand의 값의 역부호 값을 구한다.

<예제>

a= -10; // a에 -10 이 기억된다.

b= -a;  // b에 a의 값에 단항 마이너스를 계산한 +10 이 기억된다.

8.4  산술 연산자

1. 연산자: +   -   *   /

2. 형  식: operand1 + operand2 , operand1 - operand2

operand1 * operand2 , operand1 / operand2

3. 설  명: 덧셈 , 뺄셈 , 곱셈 , 나눗셈

<예제>

x= 5;     // x에 정수값 5 가 기억됨

y= 2;     // y에 정수값 2 가 기억됨

a= x + y; // 5 와 2 를 더한 결과 7 이 a에 기억됨

s= x - y; // 5 에 2 를 뺀 결과 3 이 s에 기억됨

m= x * y; // 5 에 2 를 곱한 결과 10 이 m에 기억됨

d= x / y; // d에 2.5 가 기억되는 것이 아니고 정수값 2 가 기억됨

// (정수와 정수의 계산 결과는 정수임)

8.5  거듭제곱 연산자

1. 연산자: **

2. 형  식: operand1 ** operand2

3. 설  명: operand1에 대하여 operand2제곱의 값을 구한다.

<예제>

a= 2 ** 3; // 2 에 대하여 세제곱한 값인 8 을 구한다.

b= 2 ** 0.5; // 2 에 대하여 2 분의 1 승의 값을 구한다.( =sqrt(2) )

8.6  잉여 연산자

1. 연산자: %

2. 형  식: operand1 % operand2

3. 설  명: operand1을 operand2로 나눗셈(정수몫)한 나머지를 구한다.

<예제>

a= 5 % 2; // 5 를 2 로 나눈 나머지 1 이 a에 기억된다.

b= 5 % 3.1; // 5 를 3.1 로 나눈 나머지 1.9 가 b에 기억된다.

8.7  증감 연산자

1. 연산자: ++  --

2. 형  식: 접두(전위) 연산자 : ++operand , --operand

접미(후위) 연산자 : operand++ , operand--

operand: 변수

3. 설  명: ++은 변수의 값에 1 을 증가하고 --는 1 을 감소한다.

접두 연산자와 접미 연산자로 인한 operand의 변화는 동일 하지만

다른 연산에 반영될 계산 결과값은 서로 다르다. 접두 연산자는 계산

후의 값이, 접미 연산자는 계산 전의 값이 다른 연산에 반영된다.

<예제>

a= 1;

++a;  // 접두 연산자로써 a= a + 1 의 계산을 하여 2 가 a에 기억된다.

a++;  // 접미 연산자로써 a= a + 1 의 계산을 하여 3 이 a에 기억된다.

b= ++a; // a는 4 가 되고 b에 계산 후의 값인 4 가 기억된다.

c= a++; // a는 5 가 되고 c에 계산 전의 값인 4 가 기억된다.

8.8  산술 혼합 연산자

1. 연산자: ~=  +=  -=  *=  /=  %=  |=  ^=  &=  <<=  >>=  **=

2. 형  식: operand1 연산자 operand2

operand1: 기억할 변수

operand2: 상수, 변수, 연산식

3. 설  명: operand2의 값을 operand1에 계산후 대입(기억)한다.  연산순위는

대입문과 동일하며 특정 계산을 한 후에 그 결과를 저장하는 것이

대입문과 다르다.

<예제>

a= 10;    // a에 10 이 기억된다.

b= a;     // b에 a의 값 10 이 기억된다.

b+= a;    // b= b + a의 계산을 하여 결과 20 을 b에 저장한다.

b*= a+10; // + 보다 *= 가 연산순위가 낮기 때문에 + 를 먼저 계산한다.

// 즉 b= b * (a+10)의 결과 400 이 b에 기억된다.

a= 5;   // a에 5 가 기억된다.

a-= 2;  // a=a-2 를 하여 3 이 a에 기억된다.

a/= a;  // a= a / a를 하여 1 이 a에 기억된다.

a%= a;  // a= a % a를 하여 1 을 1 로 나눈 나머지 0 이 a에 기억된다.

a= 2; // a에 2 가 기억된다.

a**=3; // a= a ** 3 을 하여 2 의 3 승의 값 8 이 a에 기억된다.

a= "SEOUL";

a~= "&PUSAN"; // a=a~"&PUSAN"을 의미하며 "SEOUL&PUSAN"이 a에 기억됨

a= 1;

a*= a**= a+= 1; // a+=1 의 값은 2 이며 a**=2(a=a**2)의 값은 4 이다.

// a*=4(a=a*4)의 값은 16 이며 a에 16 이 기억된다.

< a*= a**= a+= 1; 의 추가 설명 >

a= 1;

a*= a**= a+= 1;

(1) a*= a**= a= a + 1 --> 대입문은 오른쪽에서 왼쪽으로 풀이를 함

2= 1 + 1 --> a에 2 가 기억됨

(2) a*= a**= 2 ---------> a+=1을 한 결과값인 2 가 남은 연산에 참여함

a*= a= a ** 2 ------> 현재의 a값(2)에 2 를 거듭제곱

4= 2 ** 2 ------> 현재 a는 1 이 아니라 2 임, 결과 4 가 a에 기억됨

(3) a*= 4 -------------> a**=2의 결과값인 4 가 남은 연산에 참여함

a= a * 4 ----------> 현재의 a값(4)에 4 를 곱셈

16= 4 * 4 ----------> 마지막으로 16 이 a에 기억됨

<Bit 연산자 및 Shift 연산자 산술 혼합 연산자 예제>

※ Bit 연산자와 Shift 연산자에 대한 설명을 참고 하세요

a= 1;

b= 3;

c= 5;

a&= 3; --> a= a & 3 을 의미하며 1 & 3 의 결과 1 이 a에 기억 됨

b|= 4; --> b= b | 4 을 의미하며 3 | 4 의 결과 7 이 b에 기억 됨

c^= 3; --> c= c ^ 3 을 의미하며 5 ^ 3 의 결과 6 이 c에 기억 됨

a= 1;

b= 8;

a<<= 2; --> a= a<<2 를 의미하며 1 << 2 의 결과 4 가 a에 기억 됨

b>>= 1; --> b= b>>1 을 의미하며 8 >> 1 의 결과 4 가 b에 기억 됨

8.9  관계 연산자

1. 연산자: ==   >   >=   <   <=   !=

2. 형  식: a == b   --> a는 b와 같다.

a >  b   --> a는 b보다 크다.

a >= b   --> a는 b보다 크거나 같다.

a <  b   --> a는 b보다 작다.

a <= b   --> a는 b보다 작거나 같다.

a != b   --> a는 b와 같지 않다.

※ 관계 연산자와 논리 연산자의 계산 결과는 논리값이다.

※ 논리값 - '참'과 '거짓'의 진위를 판별할 수 있는 값으로 참의 값은 1이고

거짓의 값은 0이다. 그 외의 값은 모두 '참'으로 취급된다.

<예제>

a= 5 > 2;  // '5 는 2 보다 큰다'는 참이므로 a에 1 이 기억된다.

b= 2 == 3; // '2 와 3 은 같다'는 거짓이므로 b에 0 이 기억된다.

8.10  논리 연산자

1. 연산자: !   &&  ||

2. 형  식:   ! a    --> a의 논리 부정(NOT)을 구한다.

a && b   --> a와 b의 논리곱(AND)을 구한다.

a || b   --> a와 b의 논리합(OR)을 구한다.

<진리표> 아래 표의 수치는 논리값으로 0 은 '거짓' 1 은 '참'을 의미한다.

논리부정(NOT)
A	!A
0	1
1	0

논리곱(AND)
A	B	A && B
0	0	0
0	1	0
1	0	0
1	1	1

논리합(OR)
A	B	A || B
0	0	0
0	1	1
1	0	1
1	1	1

<예제>

a= 5 > 2 && 3 < 5; // 5>2 는 '참' 3<5 도 '참', '참'과 '참'의 논리곱은 '참'

// 그래서 a에는 '참'의 값인 1 이 기억된다.

b= 3 < 2; // 3<2 는 '거짓'이므로 b에는 0 이 기억됨

c= ! b;   // b값은 0('거짓')으로 이것의 부정은 '참'이되고 c에는 1 이 기억됨

d= 5 || 0; // '참'과 '거짓'의 논리합은 '참', d에는 참의 값 1 이 기억된다.

if(a>b && a<=c) f= 1; // a가 b보다 크고 그리고 a가 c보다 작거나 같다면

// 변수 f에 1 이 기억된다.

if(a>b || a<=c) f= 1; // a가 b보다 크거나 또는 a가 c보다 작거나 같으면

// 변수 f에 1 이 기억된다.

8.11  문자열 결합 연산자

1. 연산자: ~

2. 형  식: operand1 ~ operand2

3. 설  명: operand1문자열과 operand2문자열을 결합한다.

※참고: 문자열의 결합은 덧셈('+')으로 할 수도 있으나 아래의 차이점이 있다.

'+' : 두 문자열이 수치로 변환될 수 있을 땐 수치의 덧셈을 한 결과를 얻는다.

'~' : 두 문자열을 무조건 결합한다.

<예제>

a= "AB" ~ "CD"; // "ABCD"가 a에 기억된다.

b= "AB" ~ 1234; // "AB1234"가 b에 기억된다.(수치가 문자열로 변환됨)

c= "12" ~ "34"; // "1234"가 c에 기억된다.

d= "AB" + "CD"; // "ABCD"가 d에 기억된다.

e= "12" + "34"; // 덧셈한 결과 46 이 e에 기억된다(수치로 변환됨)

8.12  순서 연산자

1. 연산자: ,

2. 형  식: operand1 , operand2

3. 설  명: 동등한 성격 또는 자격의 연산식을 열거한다.

<예제>

a= 1, b= 2, c= 3, d= a+b+c; // 왼쪽에서 오른쪽의 순서로 실행된다.

8.13  Bit 연산자

1. 연산자: ~  &  ^  |

2. 형  식: ~ operand1

operand1 & operand2

operand1 ^ operand2

operand1 | operand2

3. 설  명: 프로그래밍언어에서 정수나 실수는 모두 2진수로 변환되어 기억되는데

(예외도 있으나 Wel이나 C언어는 모두 2진수로 변환됨)  이렇게 기억된

2진수에 대하여 각 비트별로 연산을 할 수 있는 것이 Bit 연산자이다.

모든 Bit 연산자는 피연산자가 실수(소수 아래가 있는 수)일 경우에 정

수로 변환(소수 아래 절삭)하여 처리한다.

Bit 연산자를 접할 때에는 피연산자에 대한 2진 수치를 생각하지

않으면 어떤 결과를 얻을 것인지 알기 어렵다.

~ 기호는 Bit NOT , & 는 Bit AND , ^ 는 Bit EOR , | 는 Bit OR 이다.

1) Bit 연산자의 연산 순위

연산 순서의 높은 순에서 낮은 순으로 열거하면 ~ , & , ^ , | 순서이다.

<진리표>

논리부정(NOT)
A	~A
0	1
1	0

논리곱(AND)
A	B	A & B
0	0	0
0	1	0
1	0	0
1	1	1

논리합(OR)
A	B	A | B
0	0	0
0	1	1
1	0	1
1	1	1

배타적 논리합 (Exclusive OR)
A	B	A ^ B
0	0	0
0	1	1
1	0	1
1	1	0

2) Bit NOT (~)

-. 피연산자의 각 비트를 0은 1로 1은 0으로 변환한다.

<예제>

char a, b; // 1byte의 기억공간을 확보

a= 5;  // 2진수로 기억된 형태: 0000 0101

b= ~a; // 2진수로 기억된 형태: 1111 1010

print(b); // 출력결과는 250 (2진수로 변환하면: 1111 1010임)

3) Bit AND (&)

-. 두 피연산자의 해당 Bit의 값이 모두 1일때 결과값이 1이 된다.

<예제>

char a, b, c; // 1byte의 기억공간을 확보

double d, e, f;

a= 5;     // 2진수로 기억된 형태: 0000 0101

b= 14;    // 2진수로 기억된 형태: 0000 1110

c= a & b; // 2진수로 기억된 형태: 0000 0100

print(c); // 출력결과는 4 (2진수로 변환하면: 0000 0100임)

d= 13.3;

e= 11.3;

f= d & e; // d 와 e 의 값이 정수로 변환되어 13 & 11의 결과를 얻는다.

print(f); // 9가 출력됨( 1101 & 1011 = 1001 )

4) Bit OR (|)

-. 두 피연산자의 해당 Bit의 값이 모두 0이 아니면 결과값이 1이 된다.

즉, 둘 중의 하나가 1이면 결과는 1이 된다.(논리 연산자 참조)

<예제>

char a, b, c; // 1byte의 기억공간을 확보

a= 5;     // 2진수로 기억된 형태: 0000 0101

b= 14;    // 2진수로 기억된 형태: 0000 1110

c= a | b; // 2진수로 기억된 형태: 0000 1111

print(c); // 출력결과는 15 (2진수로 변환하면: 0000 1111임)

5) Bit EOR (^) : 배타적(exclusive) OR

-. 두 피연산자의 해당 Bit의 값이 서로 다르면 결과값이 1이 된다.

즉, 한쪽이 1이고 다른 한쪽이 0 이면 결과값이 1이 된다.

<예제>

char a, b, c; // 1byte의 기억공간을 확보

a= 5;     // 2진수로 기억된 형태: 0000 0101

b= 14;    // 2진수로 기억된 형태: 0000 1110

c= a ^ b; // 2진수로 기억된 형태: 0000 1011

print(c); // 출력결과는 11 (2진수로 변환하면: 0000 1011임)

8.14  Shift 연산자

1. 연산자: <<  >>

2. 형  식: operand1 << operand2

operand1 >> operand2

3. 설  명: operand1에 대한 2진 수치를 operand2회  왼쪽 또는 오른쪽으로

이동 시킨다.  피연산자가 실수(소수 아래가 있는 수)일 경우에

정수로  변환(소수 아래 절삭)하여  처리한다.  Shift 연산자를

접할 때에는 피연산자에 대한 2진 수치를 생각하지 않으면 어떤

결과를 얻을 것인지 알기 어렵다.

-. << 기호는 operand1의 값을 왼쪽으로 이동 한다.

-. >> 기호는 operand1의 값을 오른쪽으로 이동 한다.

1) 왼쪽 Shift (<<)

-. 각 비트를 왼쪽으로 이동하며 채워지는 자리의 값은 0 이다.

어떤수 N을 R회 왼쪽으로 이동하면(N<<R) N * (2의 R승)과 같다.

<예제>

int a;

a= 1<<3; // 1 을 왼쪽으로 3회 이동하면 2진수로 1000 이 된다.

// 1회째: 0000 0010 <-- 채워지는 자리의 값은 0 이다.

// 2회째: 0000 0100

// 3회째: 0000 1000

print(a); // 8 이 출력되며 (1 * 2**3)과 같다.

2) 오른쪽 Shift (>>)

-. 각 비트를 오른쪽으로 이동하며 채워지는 자리의 값은 char일때는 0 이고

그 외의 경우에는 부호(양수는 0, 음수는 1)값이 복사된다.

어떤수 N을 R회 오른쪽으로 이동하면(N>>R) N / (2의 R승)과 같다.

<예제>

int a;

a= 8>>1; // 8 을 오른쪽으로 1회 이동하면 2진수로 100 이 된다.

print(a); // 4 가 출력되며 (8 / 2**1)과 같다.

9.  Wel의 문법(Grammar)

9.1  문(Statement)의 종류

1. 단문(Single statement)

하나의 문장(Statement)을 의미하며 반드시 세미콜론(;)으로 문장의 종료를

표시해야한다.  원시 프로그램에서 줄바뀜은 의미가 없기 때문에 한 줄에 여러

개의 단문을 서술해도 된다.

예) a= 1; b= a + 1;

2. 복문(Multiple statement)

단문들의 집합을 의미하며 여러 개의 문장을 중괄호({})로 묶어 블럭(block)

화한 것을 의미하며 제어문이나 반복문에서 실행할 문장의 시작과 끝을 명확히

할 수 있다.

예) if(a>b) { max= a; min= b; } else { max= b; min= a; }

3. 널문(Null statement)

표현식(문장) 없이 세미콜론만 서술한 것으로 대부분 의미가 없는 문장이

지만 제어문이나 반복문에서 그 의미를 찾을 수 있다.

예) ;          // 의미가 없다.

; ; ;      // 의미가 없다.

if(a>b) ;  // 이와 같은 문장은 없는 것과 같다.(쓸모없는 문장이다)

while(1) ; // 무한 루프(Endless loop)로 이 부분만 끝없이 반복된다.

for(i=1; i<=1000; i++) ; // 시간을 지연 할 수 있다.

9.2  형(Type) 선언문

1. 형(Data type) 선언문

변수를 선언 없이 사용하면 자유형 변수로 취급이 되는데 이것은 정수나 실수,

문자 코드, 문자열 모두를 자유롭게 취급할 수 있기 때문에 어떤 변수가 주어진

특정 자료형만 수용할 수 있도록 하기 위해서는 반드시 선언을 해야한다.

<형식#1> 선언문 변수1 , 변수2 , ... , 변수N;

<형식#2> 선언문 변수1=초기값1 , ... , 변수N=초기값N;

2. 형 선언문의 종류

-. 문자코드: char

-. 문 자 열: string

-. 정    수: int, long

-. 실    수: float, double

-. 자 유 형: free

1) char 선언문: 1 byte(8bit)의 문자 코드를 위한 선언문

(선언의 예) char ch;

ch= 'A';     // 대문자 'A'의 코드값(ASC인 경우 65)이 정수로 기억됨

ch= 65;      // 'A'와 동일

ch= 65.9;    // 소수아래는 버리고 65만 기억됨

ch= 257;     // (주의) 257을 2진수로 변환하면 1 0000 0001로써

// 9bit인데 ch는 8bit만 기억하기 때문에 최상위의 1은

// 버리고 나머지만 기억함(즉, 1이 기억됨)

ch= "65ABC"; // (주의) 65는 수치로 변환이 될 수 있기 때문에

//        "ABC"를 무시하고 65만 기억함

ch= "ABCD"; // (주의) 수치로 변환될 수 없기 때문에 에러(error)처리됨

2) string 선언문: 문자열을 위한 선언문

(선언의 예) string str;

str= "happy"; // "happy"라는 문자열을 기억함

str= 65;     // 문자열로 변환하여 "65"를 기억함

str= -65;    // 문자열로 변환하여 "-65"를 기억함

str= 1.23;   // 문자열로 변환하여 "1.23"을 기억함

str= 1e3;    // (주의) 1e3의 값인 "1000"이 기억됨

str= 'A';    // (주의) 'A'의 문자 코드값인 65가 문자열로 기억됨

3) int 선언문: 2 byte(16bit)의 부호있는 정수를 위한 선언문

(선언의 예) int a;

a= 'A';     // 대문자 'A'의 코드값(ASC인 경우 65)이 정수로 기억됨

a= 65;      // 'A'와 동일

a= 65.9;    // 소수아래는 버리고 65만 기억됨

a= 65537; // (주의) 65537을 2진수로 변환하면 1 00000000 00000001인데

//        a는 16bit만 기억하기 때문에 최상위의 1은 버리고

//        나머지만 기억함(즉, 1이 기억됨)

a= "65ABC"; // 65는 수치로 변환이 될 수 있기 때문에 "ABC"를 무시하고

// 65만 기억함

a= "ABCD"; // 수치로 변환될 수 없기 때문에 에러(error)처리됨

4) long 선언문: 4 byte(32bit)의 부호있는 정수를 위한 선언문

(선언의 예) long a;

5) float 선언문: 4 byte의 실수를 위한 선언문

(선언의 예) float a;

a= 'A';     // 대문자 'A'의 코드값(ASC인 경우 65)이 실수로 기억됨

a= 65;      // 'A'와 동일

a= 65.9;

a= "65ABC"; // 65는 수치로 변환이 될 수 있기 때문에 "ABC"를 무시하고

// 65가 실수로 기억됨

a= "ABCD"; // 수치로 변환될 수 없기 때문에 에러(error)처리됨

6) double 선언문: 8 byte의 실수를 위한 선언문

(선언의 예) double a;

7) free 선언문

(선언의 예) free a;

a= 'A';     // 대문자 'A'의 코드값(ASC인 경우 65)이 기억됨

a= 65;      // 정수 65가 기억됨

a= 65.9;    // 실수 65.9가 기억됨

a= "65ABC"; // 문자열 "65ABC"가 기억됨

a= "ABCD";  // 문자열 "ABCD"가 기억됨

9.3  조건문

1) if문

<형식#1> if(조건식) 문장;

<형식#2> if(조건식) { 문장1; ... ; 문장N; }

-. 조건식: 상수, 변수, 연산식의 표현으로써 계산후 최후의 값이

'참'이면 1, '거짓'이면 0 의 값을 얻는다.

-. 표기: 형식에서 "{ 문장1; ... ; 문장N; }" 와 "문장;"은

다른 모든 형식에서 "문장 또는 블럭;"으로 표기함

-. 설명: if문은 조건식이 '참'일때 문장이나 블럭(block)을 수행하고

'거짓'이면 수행하지 않는다.

예) if(a%2) print(a, " is odd number\n"); // a가 홀수일 때 출력

2) if ~ else문

<형식> if(조건식) 문장 또는 블럭#1; else 문장 또는 블럭#2;

-. 설명: 조건식이 '참'일때 문장 또는 블럭#1을 수행하고

'거짓'이면 else 이하의 문장 또는 블럭#2를 수행한다.

예) if(a%2) print(a, " is odd number\n"); // a가 홀수일 때 출력

else print(a, " is even number\n"); // a가 짝수일 때 출력

3) 중첩 if문

<형식> if(조건식1) 문장 또는 블럭#1;

else if(조건식2) 문장 또는 블럭#2;

.

.

.

else if(조건식N) 문장 또는 블럭#N;

-. 설명: 조건식1이 '참'일때 문장 또는 블럭#1을 수행한 후 중첩 if문을

탈출하고 '거짓'이면 else 이하의 조건식2부터 단계적으로

'참'과 '거짓'에 따라 문장을 수행하거나 탈출 한다.

예) 변수 sc의 값(점수)에 따라 학점을 구하여 출력하는 프로그램의 일부

if(sc>=90) gr= "A";

else if(sc>=80) gr= "B";

else if(sc>=70) gr= "C";

else if(sc>=60) gr= "D";

else gr= "F";

print("score=", sc, " grade=", gr, "\n");

9.4  반복문

1) for문

<형식> for(초기치; 조건식; 증감치) 문장 또는 블럭;

-. 조건식: 상수, 변수, 연산식의 표현으로써 계산후 최후의 값이

'참'이면 1, '거짓'이면 0 의 값을 얻는다.

-. 초기치: for문이 실행될 때 처음 1회 실행되는 초기화 문장

-. 증감치: for문이 반복될 때 매 1회씩 실행되는 증감을 위한 문장

<for문의 흐름도>

예1) 1부터 10까지 출력하는 for문의 예

for(i=1; i<=10; i++)

{

print(i, "\n");

}

예2) 1부터 100까지 합을 구하는 for문의 예

for(sum= 0, cnt= 1; cnt<=100; cnt=cnt+1) sum= sum + cnt;

print("sum=", sum, "\n");

2) while문

<형식> while(조건식) 문장 또는 블록;

<설명> 조건식이 '참'인 동안 문장 또는 블럭을 실행한다.

<while문의 흐름도>

예1) 1부터 10까지 출력하는 while문의 예

i= 1;

while(i<=10) { print(i, "\n"); i= i + 1; } // 한줄로 작성한 예

예2) 1부터 100까지 합을 구하는 while문의 예

cnt= sum= 0;

while(cnt<100)

{

cnt= cnt + 1;

sum= sum + cnt;

}

print("sum=", sum, "\n");

9.5  분기문

1) break문

for나 while문에 의한 반복 부분을 강제 탈출한다.

예1) for(i=1; i<=10; i++)

{

print(i, "\n");

if(i==5) break; // 5까지 출력 후 for문을 탈출한다.

}

예2) i= 0;

while(1)

{

i= i + 1;

print(i, "\n");

if(i>=5) break; // 5까지 출력 후 while문을 탈출한다.

}

2) continue문

continue 이후의 내용은 실행하지 않고 반복 부분의 선두로 이동한다.

예1) for(i=1; i<=10; i++)

{

if(i%3==0 || i%5==0) continue; // 3과 5의 배수는 출력되지 않음

print(i, "\n");

}

예2) i= 0;

while(i<10)

{

i= i + 1;

if(i%3==0 || i%5==0) continue; // 3과 5의 배수는 출력되지 않음

print(i, "\n");

}

9.6  변수 제어문

1) vlock문

이미 사용중이거나 선언된 변수를 읽기 전용(값의 변화를 줄 수 없는 상수의

성격)으로 설정한다.

배열에서 각 요소별 읽기 전용을 설정하거나  배열 전체의 읽기 전용을 설정

할 수 있으며 이들은 서로 다르게 취급된다.

<형식> vlock 변수1 , 변수2 , ... , 변수N;

-. (vlock, vunlock, vfree)문으로 변수를 선언할 수 없다.

-. (vlock, vunlock, vfree)문으로 변수의 초기값을 지정할 수 없다.

-. 선언하지 않았으나 이미 사용중인 변수는 자유형(free)형으로

선언된 것이기 때문에 vlock을 할 수 있다.

예1) a= 1;

vlock a;

a= 2;   // 에러가 발생한다.(2를 수용하지 못함)

예2) a= 1;

b= 2;

vlock b;

htmlquery("a=5&b=6"); // a는 5를 기억하지만 b는 2이다.

※ htmlquery()함수는 HTML form tag의 query를 해석하는 역할을 하며

query의 형식은 "변수1=값1&변수2=값2& ... &변수N=값N"이다.

2) vunlock문

이미 사용중이거나  선언된 변수의 읽기 전용을  해제 한다.  배열에서 각

요소별 읽기 전용을 해제하거나 배열 전체의 읽기 전용을 해제 할 수 있으며

이들은 서로 다르게 취급된다.

<형식> vunlock 변수1 , 변수2 , ... , 변수N;

3) vfree문

이미 사용중이거나 선언된 변수를 해제한다.  사용되지 않았거나 선언되지

않은 변수를 해제하는 것은 에러가 발생하지 않는다.  배열에서 요소별 변수

해제는 불가능하며 배열 전체를 해제해야한다.  읽기 전용이 설정된 변수는

해제할 수 없다.

<형식> vfree 변수1 , 변수2 , ... , 변수N;

9.7  return문

1) return 문

단위 프로그램(주 프로그램, 함수, parser() 또는 fparser(), include()함수에

의해 실행되는 프로그램)을 종료하며 return값이 있을 때는 그 결과를 호출한

프로그램에 되돌린다.

예)  add= {[ c= a + b; return(c); ]} // add에 문자열이 기억됨

function int subtract(int a, int b)

{

int sub;

sub= a - b;

return(sub);

}

a= 5, b= 2;

ad= parser( add ); // 5와 2를 더한 결과 7이 ad에 기억됨

sb= subtract(a, b); // 5에 2를 뺀 값 3이 sb에 기억됨

9.8  기능성 문자열

1) 기능성 문자열

Wel 프로그램 작성시 여러줄로 나누어진 자료 또는 프로그램의 문장을 작성

하여 변수에 대입할 수 있는 것을 의미한다.  만일 기능성 문자열내의 자료가

프로그램 문장이라면 parser()함수를 이용하여 실행할 수 있다.

<형식>  기능성 문자열명=  {[ 자료 또는 문장 또는 블럭; ]}

-. 기능성 문자열명 : 기능성 문자열의 변수명으로 {[ ]}의 내용을 저장

-. 기능성 문자열명은 변수이기 때문에 그 내용에 변화를 줄 수 있다.

-. 기능성 문자열명 없이 사용하거나 위의 형식과 다르면 에러 처리된다.

-. 기능성 문자열은 문자열과 동일하게 취급되기 때문에 {[ ]}의 내용을

기억만한다.

예) 아래의 프로그램의 이름이 test.wel이고 웹 서버를 이용한다고 가정함

print_html= {[

print("<html><head></head><body>\n");

print(msg, "\n");

print("</body></html>\n");

]}

htmlquery("GET"); // HTML form의 method가 GET일때

if(mode=="인사") msg= "안녕하세요?";

else if(mode=="누구") msg="나는 Wel입니다!";

else msg="'mode=인사' 또는 'mode=누구'를 하셔요";

parser(print_html);

설명) 웹 브라우저에서 주소란에 ".../test.wel?mode=인사"와 같은 형식으로

입력하면 웹 문서로 답변이 출력된다.( ... 은 해당 사이트 주소와 경로)

9.9  함수의 정의 및 사용

1) 함수의 정의

함수(Function)는 프로그램 내에서 어떤 특정한 작업을 독립적으로 수행하여

결과를 유도해내는 규격화된 서브루틴(Subroutine)과 같은 하나의 단위를 일컫

는다.  함수가 요구하는 인자를 전달해 주면  그 함수가 어떠한 과정으로 수행

하는지를 알지 못하더라도  적절히 처리하여 결과를 만들어 되돌려준다.  함수

가 요구하는 인자는 매개변수(Parameter)라 하고 함수가 되돌려주는 것을 리턴

값(Return value)이라 하며  함수에 따라서 매개변수의 개수나 자료형은  서로

다를 수 있으며 리턴값의 의미도 서로 다르다.

2) 함수의 호출 형식

형식1) 함수명(인자1, 인자2, ... , 인자N)

형식2) 변수= 함수명(인자1, 인자2, ... , 인자N)

-. 형식1)과 형식2)에서 인자는 상수, 변수, 연산식 중에서 하나이다.

-. 형식1)과 형식2)에서 인자의 개수는 함수마다 다를 수 있다.(문서 참고)

-. 형식1)에서 함수의 리턴 값은 버려지며 형식2)는 변수에 저장한다.

3) 내장 함수(Library function)

Wel에 기본적으로 내장되어 있는 함수들로써  삼각 함수, 평방근 등의 수학

함수나 문자열에 관련된 함수 및 각종 필요로 하는 기본 기능을 프로그래머가

직접 작성하지 않아도 이용할 수 있도록 제공하고 있다.   함수를 이용하려면

사용자가 필요로 하는 기능의 함수명을 알고 있어야 하며 또한 그 함수가  어

떠한 인자(매개변수)를 필요로하며 리턴 값(Return value)의 의미가 무엇인지

알아야 한다.

4) Wel 함수의 특징

-. 함수명의 영문 대소문자는 서로 다른 것으로 처리된다.

-. 함수명과 동일한 명칭을 변수명으로 사용할 수 있다.  명칭 뒤의 최초

문자(공백 제외)가  괄호이면 함수이고 괄호가 아니면 변수이다.

-. 함수에 전달하는 인자의 개수가 경우에 따라서 가변적일 수 있으며 인자

의 개수에 따라서 함수의 실행 방식이 다를 수 있다.

-. 함수의 리턴 값(Return value)을 이용하지 않으면 그 값은 버려진다.

-. 함수가 요구하는 자료형의 인자가 아니면 함수 내부에서 형(Type) 변환이

이루어지며 형 변환을 할 수 없을 경우에는 에러가 발생된다.

-. 함수 이용시 발생될 수 있는 에러를 최소화하여 보다 편하게 프로그램을

작성할 수 있도록 하였다.

9.10  사용자 정의 함수

1) 사용자 정의 함수란?

사용자 정의 함수(Function)는  사용자가 필요에 의하여 직접 함수를 정의하

여 사용하는 것을 의미하며 내장 함수처럼 인자를 전달할 수 있고 함수의 결과

값을 되돌려 받을 수 있으며 함수 내부에서 사용되는 변수로 인하여 함수 외부

에서 사용되는 변수에 영향을 주지 않을 수도 있다.

2) 사용자 정의 함수의 선언

형식)

function [형선언문] 함수명([형선언문] 인자1, ... , [형선언문] 인자N)

{

문장1;

.

.

문장N;

[return 연산식];

}

-. [ ] 안의 내용은 생략 가능함을 의미한다.

-. 형선언문: 함수의 인자나 결과값에 대한 자료형 선언문으로 생략시 free형

으로 지정된다.

-. 함수명: 변수명 작성 규칙과 같은 방법의 명칭을 사용해야하며 내장 함수나

명령어와 동일한 명칭은 사용할 수 없다.

-. 인자1 부터 인자N까지의 인자는 변수명이어야 하며 함수안에서만 통용되는

지역 변수이다.

3) 사용자 정의 함수 내에서의 변수 사용

a. 선언하지 않고 변수를 사용할 경우

사용자 정의 함수를 호출하기 전에 해당 변수를 주 프로그램(Main program)

에서  이미 선언 하였거나 또는 선언 없이 변수를 사용하였을 경우에는 전체

프로그램에서 통용이 되는 전역 변수가 된다.

호출전에 해당 변수를 선언하지 않았고 또한 사용하지 않았으며 사용자 정

의 함수 내에서 최초로 사용할 경우에는  그 함수 내에서 통용이 되는  지역

변수이며 함수가 실행될 때 생성이 되고 함수가 종료되면 사라지게 된다.

※ 사용자 정의 함수 내에서 변수를 선언 하지 않고 사용할 경우에는 전역

변수 또는 지역 변수가 될 수 있기 때문에  함수를 호출하기 전에 해당

변수의 상황을 알고 있어야 한다.

b. 형 선언문으로 선언후 변수를 사용할 경우

사용자 정의 함수 내에서만 통용이 되는 지역 변수로써  함수가 실행될 때

해당 변수가 생성(확보)되고 함수가 종료되면 사라지게 된다.

c. static 으로 선언후 변수를 사용할 경우

사용자 정의 함수 내에서만 통용이 되는 지역 변수로써  함수를 정의할 때

변수가 생성(확보)되며 실행시 해당 변수를 확보하거나 초기화 하지 않는다.

이와 같은 변수는 항상 그 값을 유지하며 함수 외부에서 참조할 수 없다.

d. global 로 참조 지정 후 변수를 사용할 경우

해당 변수가  전역 변수로 참조 지정되어  함수 내의 변수가 아니라  함수

외부의 주 프로그램(Main program) 상의 변수가 된다.

3) 사용자 정의 함수의 회귀 값(Return value)

a. return 문을 사용할 경우

함수의 형(function 다음의 형 선언문)과 다르면  형 변환하여 그 값을

되돌리며,  함수의 형이 생략되었을 경우에는  free 형이 되어 형 변환을

하지 않는다.

b. return 문을 사용하지 않을 경우

최후에 사용된 문장의 상수값을 되돌린다.  이 경우  되돌려지는 값이

무엇인지 명확하지 않을 수 있기 때문에 함수의 결과값을 변수에 대입할

경우 주의를 해야한다.

4) 사용자 정의 함수의 예#1

function int add(int a, int b)

{

int c; // 인자 a,b 및 변수 c는 지역변수임

c= a + b;

return c; // a+b의 결과를 되돌림

}

ad= add(3,2); // 3을 a에 2를 b에 전달하여 함수를 실행한 후 결과 5를

print(ad);    // ad변수에 대입한 후 출력함

5) 사용자 정의 함수의 예#2

function int add()

{

global a; // 전역변수 a를 참조하도록 지정함

c= a + b; // 변수 b는 선언되지 않아서 전역변수를 참조함

return c; // 변수 c는 호출전에 선언 또는 사용하지 않아

}            // 함수내에서 통용되는 지역변수로 확보됨

a= 3; // 전역 변수 a에 3을 대입함

b= 2; // 전역 변수 b에 2를 대입함

ad= add(); //함수를 실행한 후 결과 5를 ad변수에 대입한다.

print(ad); // ad변수의 값을 출력함

6) 사용자 정의 함수의 예#3

function int count()

{

static int cnt= 0; // 내부 정적변수로 cnt에 0을 대입하는

// 초기화는 최초에 1회만 한다.

cnt= cnt + 1;

return cnt;

}

a= count(); // 함수를 실행하여 1을 a에 기억함

b= count(); // 함수를 실행하여 2를 b에 기억함

print(a, " ", b, "\n");

9.11  기억 클래스

1) 기억 클래스(Storage class)

프로그램에서  변수를 어디에서 어떻게 선언 또는 사용하느냐에 따라

변수의 통용범위와 확보 시기 및 생존 시기가 결정되는데 이와 같이 서

로 다른 방법으로 변수를  확보할 수 있도록 하기 위하여  기억 클래스

관련 명령어를 사용한다.

2) 지역 변수

사용자 정의 함수 내부에서 선언 또는 최초로 사용된 변수로써  함수

내부에서만 참조(접근)할 수 있다.

3) 전역 변수

사용자 정의 함수 외부에서  선언 또는 사용된 변수로써  프로그램의

어느 곳에서나 참조(접근)할 수 있다.

4) 정적 변수

변수의 생존기간이 영구적이며 통용 범위가 사용자 정의 함수 내부에만

국한 되는 지역변수이며 static 으로 선언한다.   사용자 정의 함수 외부

에서 선언 또는 사용되는 변수는 모두 정적 변수이며 전역 변수가 된다.

5) 동적 변수

사용자 정의 함수가 실행 될 동안에만 존재하다가 함수의 실행 종료와

더불어 사라지는 변수이다.

6) 기억 클래스 관련 명령어

a. static 명령어 ( 정적 변수, 사용자 정의 함수 내부에서 사용 )

사용자 정의 함수  외부에서 사용하면  의미가 없으며  내부에서 사용

될 경우 함수가 종료되어도 변수와 그 값을 유지하게 된다. 사용자 정의

함수내에서  static 명령어 없이 변수를 선언 또는 최초로 사용할  경우

함수가 실행될 때 변수를 확보하게 되며  그 함수가 종료되면  소멸되는

동적 변수이다.

형식) static 형선언문 변수1[=초기값1], ... , 변수N[=초기값N];

※ 형선언문 : char, int, long, float, double, string, free

예) static int a=2, b=3;

b. global 명령어 ( 전역 변수 참조, 사용자 정의 함수 내부에서 사용 )

사용자 정의 함수 외부에서 해당 변수를 선언 또는 사용했을 경우에

함수 내부에서 그 변수를 참조하기 위한 명령으로써 이 명령을 사용하

지 않아도 전역 변수 참조를 하게 된다.  하지만  이 명령을 사용하게

되면 전역 변수 참조를 명확히 할 수 있으며,  특히 사용자 정의 함수

외부에서 사용하거나 정의되지 않은 변수를 함수 내부에서  전역 변수

참조를 하게 되면 free 형으로  전역 변수를 확보하게 된다.

사용자 정의 함수 외부에서  이 명령을 사용하게 되면  free 형으로

해당 변수를 선언하는 것과 같다.

형식) global 변수1, ... , 변수N;

※ 형 선언문 또는 변수의 초기화는 할 수 없다.

예) global b;

10.  기본 내장함수

10.1  수학함수

10.1.1  abs()

1. 형식: result= abs(x)

2. 기능: 인자 x의 절대값을 구한다.

수학적 함수로써 음수를 양수로 변환한 값(절대값)을 구한다.

3. 설명

(1) 인자 x가 정수일 때 양의 정수 결과값이 result에 돌려진다.

(2) 인자 x가 실수일 때 양의 실수 결과값이 result에 돌려진다.

(3) 인자 x가 문자열이고 수치로 변환될 수 있을 때는 수치로 변환된다.

(4) 인자 x가 문자열이고 수치로 변환될 수 없을 때는 에러 처리된다.

4. 사용예

result= abs(-5.5); print(result, "\n");

------------------------------ [ 출력결과 ] ------------------------------

5.5

10.1.2  cos()

1. 형식: result= cos(radian)

2. 기능: 인자 radian에 대한 삼각함수의 코사인(cos) 값을 구한다.

3. 설명

(1) 인자 radian이 정수 또는 실수일 때는 실수 결과값이 result에 돌려진다.

(2) 인자 radian이 문자열이고 수치로 변환될 수 있을 때는 수치로 변환된다.

(3) 인자 radian이 문자열이고 수치로 변환될 수 없을 때는 에러 처리된다.

4. 사용예

degree= 180;                 // 디그리(degree)는 360도의 각도단위

pi= 3.141592654;             // 파이값(3.14)

radian= pi * degree / 180.0; // 라디안(radian)은 호도법(180도=파이값 3.14)

result= cos(radian);

print(result);

------------------------------ [ 출력결과 ] ------------------------------

-1

10.1.3  exp()

1. 형식: result= exp(x)

2. 기능: 지수함수로써 자연대수(e)의 x 제곱값을 구한다.

3. 설명

(1) 인자 x가 정수 또는 실수일 때 실수 결과값이 result에 돌려진다.

(2) 인자 x가 문자열이고 수치로 변환될 수 있을 때는 수치로 변환된다.

(3) 인자 x가 문자열이고 수치로 변환될 수 없을 때는 에러 처리된다.

4. 사용예

result= exp(1);

print(result);

------------------------------ [ 출력결과 ] ------------------------------

2.718281828459

10.1.4  fix()

1. 형식: result= fix(x)

2. 기능: 인자 x의 소수아래 수치를 절삭하여 정수를 구한다.

3. 설명

(1) 인자 x가 실수 또는 정수일 때 정수 결과값이 result에 돌려진다.

(2) 인자 x가 문자열이고 수치로 변환될 수 있을 때는 수치로 변환된다.

(3) 인자 x가 문자열이고 수치로 변환될 수 없을 때는 에러 처리된다.

4. 사용예

result= fix(-5.5);

print(result);

------------------------------ [ 출력결과 ] ------------------------------

-5

10.1.5  log()

1. 형식: result= log(x)

2. 기능: 인자 x에 대한 자연 로그값을 구한다.

3. 설명

(1) 인자 x가 0 또는 음수이면 에러 처리된다.

(2) 인자 x가 정수 또는 실수일 때 실수 결과값이 result에 돌려진다.

(3) 인자 x가 문자열이고 수치로 변환될 수 있을 때는 수치로 변환된다.

(4) 인자 x가 문자열이고 수치로 변환될 수 없을 때는 에러 처리된다.

4. 사용예

result= log(2.718281828459045);

print(result);

------------------------------ [ 출력결과 ] ------------------------------

1

10.1.6  log10()

1. 형식: result= log10(x)

2. 기능: 인자 x에 대한 상용 로그값을 구한다.

3. 설명

(1) 인자 x가 0 또는 음수이면 에러 처리된다.

(2) 인자 x가 정수 또는 실수일 때 실수 결과값이 result에 돌려진다.

(3) 인자 x가 문자열이고 수치로 변환될 수 있을 때는 수치로 변환된다.

(4) 인자 x가 문자열이고 수치로 변환될 수 없을 때는 에러 처리된다.

4. 사용예

result= log10(1000);

print(result);

------------------------------ [ 출력결과 ] ------------------------------

3

10.1.7  rand()

1. 형식: result= rand(x)

2. 기능: 0보다 크고 x보다 작은 실수 난수를 생성한다. 난수의 종자(seed)에 변화를

주지 않으면 생성되는 난수의 나열은 규칙적이다.  난수의 종자(seed)는

randomize()함수로 선택할 수 있다.

3. 설명

(1) 인자 x가 1보다 작으면 에러 처리된다.

(2) 인자 x가 실수이면 정수로 변환(소수아래의 수는 절삭)하여 처리한다.

(3) 인자 x가 문자열이고 수치로 변환될 수 있을 때는 수치로 변환된다.

(4) 인자 x가 문자열이고 수치로 변환될 수 없을 때는 에러 처리된다.

4. 사용예

result= rand(10); // 0보다 크고 10보다 작은 실수 난수를 생성한다.

print(result);

------------------------------ [ 출력결과 ] ------------------------------

8.4018771676347

10.1.8  real()

1. 형식: result= real(i)

2. 기능: 인자 i를 실수형으로 변환한다.

3. 설명

(1) 인자 i가 실수 또는 정수일 때 실수 결과값이 result에 돌려진다.

(2) 인자 i가 문자열이고 수치로 변환될 수 있을 때는 수치로 변환된다.

(3) 인자 i가 문자열이고 수치로 변환될 수 없을 때는 에러 처리된다.

4. 사용예

result= real(5) / real(2);

d= 5 / 2;

print("result=", result, "   5/2=", d);

------------------------------ [ 출력결과 ] ------------------------------

result=2.5   5/2=2

10.1.9  sin()

1. 형식: result= sin(radian)

2. 기능: 인자 radian에 대한 삼각함수의 사인(sin) 값을 구한다.

3. 설명

(1) 인자 radian이 정수 또는 실수일 때 실수 결과값이 result에 돌려진다.

(2) 인자 radian이 문자열이고 수치로 변환될 수 있을 때는 수치로 변환된다.

(3) 인자 radian이 문자열이고 수치로 변환될 수 없을 때는 에러 처리된다.

4. 사용예

degree= 90;                  // 디그리(degree)는 360도의 각도단위

pi= 3.141592654;             // 파이값(3.14)

radian= pi * degree / 180.0; // 라디안(radian)은 호도법(180도=파이값 3.14)

result= sin(radian);

print(result);

------------------------------ [ 출력결과 ] ------------------------------

1

10.1.10  sqrt()

1. 형식: result= sqrt(x)

2. 기능: 인자 x에 대한 양의 제곱근을 구한다.

3. 설명

(1) 인자 x가 음수이면 에러 처리된다.

(2) 인자 x가 정수 또는 실수일 때 실수 결과값이 result에 돌려진다.

(3) 인자 x가 문자열이고 수치로 변환될 수 있을 때는 수치로 변환된다.

(4) 인자 x가 문자열이고 수치로 변환될 수 없을 때는 에러 처리된다.

4. 사용예

result= sqrt(25);

print(result);

------------------------------ [ 출력결과 ] ------------------------------

5

10.1.11  tan()

1. 형식: result= tan(radian)

2. 기능: 인자 radian에 대한 삼각함수의 탄젠트(tan) 값을 구한다.

3. 설명

(1) 인자 radian이 정수 또는 실수일 때 실수 결과값이 result에 돌려진다.

(2) 인자 radian이 문자열이고 수치로 변환될 수 있을 때는 수치로 변환된다.

(3) 인자 radian이 문자열이고 수치로 변환될 수 없을 때는 에러 처리된다.

4. 사용예

degree= 45;                  // 디그리(degree)는 360도의 각도단위

pi= 3.14;                    // 파이값(3.14)

radian= pi * degree / 180.0; // 라디안(radian)은 호도법(180도=파이값 3.14)

result= tan(radian);

print(result);

------------------------------ [ 출력결과 ] ------------------------------

0.99920399010504

10.2  문자변환 함수

10.2.1  asc()

1. 형식: result= asc(str)

2. 기능: 인자 str에 대한 ASCII 문자 코드값을 구한다.

3. 설명

(1) 인자 str이 문자열이 아니면 문자열로 변환된다.

(2) 인자 str의 첫글자에 대한 정수 문자 코드값이 result에 돌려진다.

(3) 인자 str이 "A"일 때 ASCII 코드값 65가 result에 돌려진다.

(4) 인자 str이 "abc" 일 때 "a"에 대한 ASCII 코드값 97이 result에 돌려진다.

4. 사용예

result= asc("A"), result2= asc("abc"), result3= asc("1test");

print(result, "   ", result2, "   ", result3);

------------------------------ [ 출력결과 ] ------------------------------

65   97   49

10.2.2  chr()

1. 형식: result= chr(i)

2. 기능: 인자 i의 ASCII 코드값에 대한 한 문자를 얻는다.

3. 설명

(1) 인자 i에 소수아래수가 있으면 절삭한다.

(2) 인자 i가 문자열이고 수치로 변환될 수 있을 때는 수치로 변환된다.

(3) 인자 i가 문자열이고 수치로 변환될 수 없을 때는 에러 처리된다.

(4) 인자 i의 코드값에 대한 한 문자가 문자열로 result에 돌려진다.

4. 사용예

result= chr(65);

print(result);

------------------------------ [ 출력결과 ] ------------------------------

A

10.2.3  str()

1. 형식: result= str(x)

2. 기능: 인자 x를 문자열로 변환된다.

3. 설명

(1) 인자 x가 문자열로 변환된 값이 result에 돌려진다.

(2) 인자 x가 문자열이면 변환없이 result에 돌려진다.

4. 사용예

result= str(-5.5); // 변환된 문자열 "-5.5"가 result에 돌려진다.

print(result);

------------------------------ [ 출력결과 ] ------------------------------

-5.5

10.2.4  val()

1. 형식: result= val(str)

2. 기능: 인자 str을 수치로 변환된다.

3. 설명

(1) 인자 str이 수치로 변환된 값이 result에 돌려진다.

(2) 인자 str이 수치이면 변환없이 result에 돌려진다.

(3) 인자 str이 문자열이고 수치로 변환될 수 없을 때는 result에 0이 돌려진다.

4. 사용예

result= val("1234"), result2= val("56ab78"), result3= val("ABC");

print(result, "   ", result2, "   ", result3);

------------------------------ [ 출력결과 ] ------------------------------

1234   56   0

10.3  진법변환 함수

10.3.1  hex()

1. 형식: result= hex(x)

2. 기능: 인자 x의 값을 16진수로 변환한 문자열을 구한다.

3. 설명

(1) 인자 x가 문자열이고 수치로 변환될 수 있을 때는 수치로 변환된다.

(2) 인자 x가 문자열이고 수치로 변환될 수 없을 때는 에러 처리된다.

(3) 인자 x를 16진수로 변환한 문자열이 result에 돌려진다.

4. 사용예

result= hex(1000);

print(result);

------------------------------ [ 출력결과 ] ------------------------------

3E8

10.3.2  oct()

1. 형식: result= oct(x)

2. 기능: 인자 x의 값을 8진수로 변환한 문자열을 구한다.

3. 설명

(1) 인자 x가 문자열이고 수치로 변환될 수 있을 때는 수치로 변환된다.

(2) 인자 x가 문자열이고 수치로 변환될 수 없을 때는 에러 처리된다.

(3) 인자 x를 8진수로 변환한 문자열이 result에 돌려진다.

4. 사용예

result= oct(1000);

print(result);

------------------------------ [ 출력결과 ] ------------------------------

1750

10.4  날짜와 시간 함수

10.4.1  date()

1. 형식

형식1) result= date(index)

형식2) result= date(index, distance)

2. 기능: 인자 index에 따라 날짜를 서로 다른 형식의 문자열로 얻는다.  형식2)에서

인자 distance는 현재일에 distance를 더하거나 뺀 날짜를 얻는다.

3. 설명

(1) index의 값이 음수이면 Coordinated Universal Time ( 그리니치 표준시 )의

날짜를 얻는다.

(2) index나 distance가 문자열이고 수치로 변환될 수 없을 때는 에러 처리된다.

(3) index의 값이 -5보다 작거나 5보다 크면 0인 경우와 같은 형식을 얻는다.

(4) index의 형식에 대한 날짜 문자열이 result에 돌려진다.

4. 사용예

for(i=0; i<=6; i++)

{

printf("   date(%d)= %-15s  date(%d)= %s\n", i, date(i), -i, date(-i));

}

------------------------------ [ 출력결과 ] ------------------------------

date(0)= 20020808         date(0)= 20020808

date(1)= 2002/08/08       date(-1)= 2002/08/08

date(2)= 2002/8/8         date(-2)= 2002/8/8

date(3)= 2002년 8월 8일   date(-3)= 2002년 8월 8일

date(4)= 2002-08-08       date(-4)= 2002-08-08

date(5)= 2002-8-8         date(-5)= 2002-8-8

date(6)= 20020808         date(-6)= 20020808

10.4.2  iday()

1. 형식: result= iday()

2. 기능: 현지 날짜의 일(day)을 정수값으로 얻는다.

3. 설명

(1) 시스템의 현지(locale) 날짜의 일(day)을 정수값으로 얻는다.

4. 사용예

result= iday();

print(result);

------------------------------ [ 출력결과 ] ------------------------------

8

10.4.3  idayof()

1. 형식

형식1) result= idayof()

형식2) result= idayof(year, month)

2. 기능: 형식1)은 현재 시스템의 년도와 월에 대하여

형식2)는 인자 year의 년도, 인자 month의 월에 대한 마지막 일을 얻는다.

3. 설명

(1) year년 month월에 대한 마지막 일(day)을 정수값으로 얻는다.

(2) result의 값은 정수 28, 29, 30, 31 중의 한 수이다.

(3) 윤년의 2월달에 대한 result의 값은 29이다.

(4) 형식1)은 현재 시스템의 년도와 월에 대한 마지막 일을 얻는다.

4. 사용예

result= idayof(2000, 2);

print("   2000년 2월은 ", result, "일까지 있습니다.\n");

result= idayof();

year= iyear();

mon= imonth();

print("   ", year, "년 ", mon, "월은 ", result, "일까지 있습니다.\n");

------------------------------ [ 출력결과 ] ------------------------------

2000년 2월은 29일까지 있습니다.

2002년 8월은 31일까지 있습니다.

10.4.4  imonth()

1. 형식: result= imonth()

2. 기능: 현지 날짜의 월(month)을 정수값으로 얻는다.

3. 설명

(1) 시스템의 현지(locale) 날짜의 월(month)을 정수값으로 얻는다.

4. 사용예

result= imonth();

print(result);

------------------------------ [ 출력결과 ] ------------------------------

8

10.4.5  iweek()

1. 형식

형식1) result= iweek()

형식2) result= iweek(year, month, day)

2. 기능: 형식1)은 시스템의 현재 날짜에 대하여, 형식2)는 인자 year의 년도,

인자 month의 월, 인자 day의 일에 대한 요일을 정수값으로 얻는다.

3. 설명

(1) year년 month월 day일에 대한 요일을 0부터 6까지의 정수값으로 얻는다.

(2) result의 값이 0 이면 일요일을 의미한다.

(3) result의 값이 1이면 월요일을 의미한다.

(4) result의 값이 6이면 토요일을 의미한다.

(5) 형식1)은 시스템의 현재 날짜에 대하여 요일을 얻는다.

4. 사용예

result= iweek(1999,12,31);

print("   1999년 12월 31일은 ", result, "번째 요일입니다.\n");

print("   ", iyear(), "년 ", imonth(), "월 ",

iday(), "일은 ", iweek(), "번째 요일입니다.\n");

wk= array("일", "월", "화", "수", "목", "금", "토");

result= iweek(1999,12,31);

print("   1999년 12월 31일은 ", wk[result], "요일입니다.\n");

------------------------------ [ 출력결과 ] ------------------------------

1999년 12월 31일은 5번째 요일입니다.

2002년 8월 8일은 4번째 요일입니다.

1999년 12월 31일은 금요일입니다.

10.4.6  iyear()

1. 형식: result= iyear()

2. 기능: 현지 날짜의 년도(year)를 정수값으로 얻는다.

3. 설명

(1) 시스템의 현지(locale) 날짜의 년도(year)를 정수값으로 얻는다.

4. 사용예

result= iyear();

print(result);

------------------------------ [ 출력결과 ] ------------------------------

2002

10.4.7  sumday()

1. 형식

형식1) result= sumday()

형식2) result= sumday(year, month, day)

2. 기능: 형식1)은 시스템의 현재 날짜에 대하여, 형식2)는 인자 year의 년도,

인자 month의 월, 인자 day의 일에 대한 산술적인 총 누적일을 얻는다.

총 누적일은 서기 1년 1월 1일로부터 윤일을 포함한 산술적인 누적일이다.

3. 설명

(1) year년 month월 day일에 대한 총 누적일을 정수값으로 얻는다.

(2) 이 함수는 기준날짜로부터 비교날짜까지의 경과일 계산에 사용한다.

(3) 서기 1년 1월 1일부터 해당일까지의 총 누적일이 result에 돌려진다.

(4) 서기 1년 1월 1일에 대한 result의 값은 1이다.

(5) 형식1)은 시스템의 현재 날짜에 대하여 총 누적일을 얻는다.

4. 사용예

todsum= sumday();

tday= sumday(2000,3,1) - sumday(1999,3,1);

print("   1년 1월 1일부터 ", iyear(), "년 ", imonth(), "월 ", iday(),

"일까지 총 누적일은 ",todsum,"일입니다.\n");

print("   1999/3/1에서 2000/3/1일전까지 총 누적일은 ", tday, "입니다.\n");

print("   (2000년은 윤년으로 2월달이 29일까지이며 윤일을 포함한 값임)\n");

------------------------------ [ 출력결과 ] ------------------------------

1년 1월 1일부터 2002년 8월 8일까지 총 누적일은 731070일입니다.

1999/3/1에서 2000/3/1일전까지 총 누적일은 366입니다.

(2000년은 윤년으로 2월달이 29일까지이며 윤일을 포함한 값임)

10.4.8  time()

1. 형식

형식1) result= time(index)

형식2) result= time(index, distance)

2. 기능: 인자 index에 따라 시간을 서로 다른 형식의 문자열로 얻는다.  형식2)에서

인자 distance는 현재시간에 distance를 더하거나 뺀 시간을 얻는다.

3. 설명

(1) index의 값이 음수이면 Coordinated Universal Time ( 그리니치 표준시 )의

시간을 얻는다.

(2) index나 distance가 문자열이고 수치로 변환될 수 없을 때는 에러 처리된다.

(3) index의 값이 -7보다 작거나 7보다 크면 0인 경우와 같은 형식을 얻는다.

(4) index의 형식에 대한 시간 문자열이 result에 돌려진다.

4. 사용예

for(i=0; i<=8; i++)

{

printf("   time(%d)= %-26s time(%d)= %s\n", i, time(i), -i, time(-i));

}

------------------------------ [ 출력결과 ] ------------------------------

time(0)= 113025                     time(0)= 113025

time(1)= 11:30:25                   time(-1)= 02:30:25

time(2)= 11:30:25                   time(-2)= 2:30:25

time(3)= 11시 30분 25초             time(-3)= 2시 30분 25초

time(4)= AM 11:30:25                time(-4)= AM 02:30:25

time(5)= AM 11:30:25                time(-5)= AM 2:30:25

time(6)= 오전 11시 30분 25초        time(-6)= 오전 2시 30분 25초

time(7)= Thu, 08 Aug 2002 11:30:25  time(-7)= Thu, 08 Aug 2002 02:30:25 UTC

time(8)= 113025                     time(-8)= 023025

10.5  암호화 및 복호화

10.5.1  crypt()

1. 형식: result= crypt(str, salt)

2. 기능: 시스템의 암호화 함수로써 인자 str의 문자열을 인자 salt의 문자열 key로

암호화하여 암호화된 문자열을 얻는다.

3. 설명

(1) 모든 인자는 문자열이며 수치일 때에는 문자열로 변환된다.

(2) 인자 str은 암호화 대상 문자열이다.

(3) 인자 salt는 암호화 키(key) 문자열로 최초 2개의 문자만 취급한다.

(4) 인자 salt가 한문자이면 두문자로 복제하여 처리한다.

(5) 인자 salt가 Null string("")이면 Null string이 result에 돌려진다.

(6) 시스템의 암호(/etc/passwd의 암호항목)를 검증할 때 사용할 수 있다.

4. 사용예

crypt1= crypt("hello", "ab");

crypt2= crypt("hello", "y");

crypt3= crypt("hello", "");

printf("crypt1=[%s] crypt2=[%s] crypt3=[%s]\n", crypt1, crypt2, crypt3);

------------------------------ [ 출력결과 ] ------------------------------

crypt1=[abl0JrMf6tlhw] crypt2=[yyhv5iZ398gMQ] crypt3=[]

10.5.2  Wel의 암호체계

1. Wel의 암호 체계

Wel의 암호화 기법은 관용암호방식(Conventional Cryptosystem)이며  Wesoft에

서 자체 제작한 암호화 알고리즘을 사용한다.  Wel의 암호 체계는 decode 함수를

이용하면 누구나 원문을 얻어낼 수 있는 암호화 키와 암호문을 해독할 때 이것을

알지 못하면  해독하지  못하는 복호화 키의  두 종류 키를  이용하여 암호화 및

복호화를 할 수 있다.  암호화 키만 사용하면  보안성의 보장을  받을 수 없으며

암호화 키와 복호화 키를 모두 사용하면 복호화 키를 알지 못하고는 절대 암호문

을 해독할 수 없다.

2. Wel의 암호 생성 요소

암호문= 암호 대상 문자열(N bytes) + 암호화 키 + 난수 키 + 복호화 키

-. 암호 대상 문자열: 암호화할 대상 문자열을 의미한다.

-. 암호화 키: 시스템 암호화 함수의 salt인자와 같은 의미이다.

-. 난수 키: 1 byte의 난수이다.

-. 복호화 키: 암호문을 풀때 사용하는 문자열로 적당히 긴 것이 좋다.

3. Wel의 암호화된 문자열의 구조

암호화 키	난수 문자열	난수 키	암호화된 문자열
2 bytes	1 ∼ 5 bytes	1 byte	(N+1)×2 bytes

※ 위의 구조에서 Wel에 적용된 순서는 다를 수 있음

암호화된 문자열의 길이= (N+1) x 2 bytes + 2 bytes (암호화 키)

+ 1 byte (난수 키) + ( 1 에서 5 byte )

암호화된 문자열의 최저길이= 12 bytes ( 보안성을 위한 최소 크기임 )

※ 4개의 문자로 구성된 암호 대상 문자열을 암호화 하면 암호문의 문자수는?

암호문의 길이= 최소 (4+1) x 2 + 2 + 1 + 1 , 최대 (4+1) x 2 + 2 + 1 + 5

= 최소 14 bytes 에서 최대 18 bytes

4. 암호 문자의 종류 및 경우의 수

(1) 문자의 종류: 총 64종류

1) 숫       자: 0 ~ 9     ( 10종류 )

2) 영문 대문자: A ~ Z     ( 26종류 )

3) 영문 소문자: a ~ z     ( 26종류 )

4) 기       호: '.' 과 '/'(  2종류 )

(2) 암호화 키의 경우의 수: 64 x 64 = 4096종류

(3) 난수 키의 경우의 수: 64종류

(4) 난수의 경우의 수: 64 x 64 x 64 x 64 x 64 = 1,073,741,824 종류

5. 암호문의 원리 및 조합 수

(1) 한문자의 암호화 원리

1 byte ( 8 bit )의 한 문자를 12 bit ( 3bit는 난수임 )의 암호 코드로

변환된다.  예를 들어 'A'란 문자가 암호화 되는 것은 각종 암호키에 따라서

서로 다른 4096종류의 암호 코드로 변환 된다.  코드값의 부여 규칙은 난수

의 성격이며 이 암호 코드가 2개의 암호 문자로 변환된다.

(2) 동일한 문자열에 대한 서로 다른 암호문이 생성되는 경우의 수

경우의 수 = 암호화 키(4096) x 난수 키(64) x 난수

최저 경우의 수= 4096 x 64 x 64 = 16,777,216 종류

최대 경우의 수= 4096 x 64 x 64 ^ 5 = 281,474,976,710,656 종류

※ 위의 경우의 수에서는 각 문자별 3bit의 난수에 대한 경우의 수는 계산

되지 않았다.  즉, 8 ^ (원문의 문자수)는 계산에서 제외되어 있다.

(3) 복호화 키

암호화된 문자열에서 복호화 키를 사용했는지 여부는 알 수 없으며 만일

복호화 키를 사용 했었다면 그 키값이 아닌 다른 값으로는 암호문을 풀이

할 수 없으며 이를 풀이할 확률는 1 / 255 ^ (복호화 키 문자수)이다.

-. 복호화 키의 문자수에 따른 암호 해독 확률

o. 1 문자일 때 = 1 / 255              <-- Wel 프로그램으로 해독 가능

o. 2 문자일 때 = 1 / 65025            <-- 노력하면 해독 할 수 있음

o. 3 문자일 때 = 1 / 16581375         <-- 안전할까?

o. 4 문자일 때 = 1 / 4228250625

o. 5 문자일 때 = 1 / 1078203909375

o. 6 문자일 때 = 1 / 274941996890625

※ 따라서 복호화 키는 적당히 긴것이 좋다.

10.5.3  decode()

1. 형식

형식1) result= decode(enstr)

형식2) result= decode(enstr, destr)

형식3) result= decode(enstr, destr, instr)

2. 기능: Wel의 encode()함수로 암호화한 암호문을 해독하여 원문을 얻는다.

형식2)와 형식3)에서 인자 destr은 복호화 키를 의미하며, 인자 instr은

간접 복호화 키를 의미하고 원문을 암호화 할 때 사용한 값과 같아야 한다.

3. 설명

(1) 모든 인자는 문자열이며 수치일 때에는 문자열로 변환된다.

(2) 인자 enstr은 encode() 함수로 암호화된 암호문이어야 한다.

(3) 인자 destr은 encode() 함수로 암호화할 때 사용한 복호화 키이다.

(4) 형식1)은 복호화 키 없이 암호화 키로만 암호화 한것을 해독할 경우이다.

(5) 형식2)와 형식3)은 복호화 키를 사용하여 암호화 한것을 해독할 경우이다.

(6) 형식3)의 인자 instr은 간접 복호화 키를 의미하며 instr의 값을 변수로 하여

그 값을 복호화 키로 사용한다. 이것은 암호화 부분이나 복호화 부분이 있는

Wel 원시 프로그램이 노출이 될 경우에 복호화 키가 노출되기 때문에 보안상

복호화 키를 별도로 관리하려는 목적으로 사용한다.  간접 복호화 키의 변수

명(instr의 값)은  Wel 프로그램 또는 form의 변수명 작성 규칙을 무시할 수

있어 @pass와 같은 변수를 사용할 수 있다.  프로그램이나 form에서는 이와

같은 변수의 값을 반영할 수 없기 때문에 이러한 명칭을 사용하는 것이 보안

에 도움이 될 것이다.  @pass와 같은 변수에 값을 대입하려면 listmerge()

함수를 form을 개방하지 않은 상태에서 실행하면 된다. ( 간접 복호화 키에

값을 대입하는 방법은 "/etc/wel.passwd"를 참고하면 된다 )

(7) 형식3)에서 destr과 instr의 값이 모두 있을 경우에 instr을 우선한다.

(8) 인자 enstr이 해독된 원문 문자열이 result에 돌려진다.

4. 사용예

str1= encode("seoul", "an"); str2= decode(str1);

printf("   암호문: %-20s , 해독된 원문: %s\n", str1, str2);

str1= encode("seoul", "k"); str2= decode(str1);

printf("   암호문: %-20s , 해독된 원문: %s\n", str1, str2);

str1= encode("seoul", "an", "pusan"); str2= decode(str1, "pusan");

printf("   암호문: %-20s , 해독된 원문: %s\n", str1, str2);

------------------------------ [ 출력결과 ] ------------------------------

암호문: anmQx3TzCOIdEp3cyym  , 해독된 원문: seoul

암호문: kkwRF/ATbZk/ckdxKJ0O , 해독된 원문: seoul

암호문: anGdXeKuo8Bnd68kL    , 해독된 원문: seoul

10.5.4  encode()

1. 형식

형식1) result= encode(str, salt)

형식2) result= encode(str, salt, destr)

형식3) result= encode(str, salt, destr, instr)

2. 기능: 인자 str 원문을 인자 salt 암호화 키로 암호화하여 암호문을 얻는다.

형식2)와 형식3)에서 인자 destr은 복호화 키를 의미하며, 인자 instr은

간접 복호화 키를 의미하고 원문을 해독할 때 사용한다.

3. 설명

(1) 모든 인자는 문자열이며 수치일 때에는 문자열로 변환된다.

(2) 인자 str은 암호화 대상 문자열(원문)이다.

(3) 인자 salt는 암호화 키로써 최초의 2개 문자만 사용한다.

(4) 인자 salt가 한문자이면 두문자로 복제하여 처리한다.

(5) 인자 salt가 Null string("")이면 Null string이 result에 돌려진다.

(6) 인자 destr은 decode() 함수로 해독할 때 사용할 복호화 키이다.

(7) 형식1)은 복호화 키 없이 암호화 키로만 암호화 할 경우이다.

(8) 형식2)와 형식3)은 복호화 키를 사용하여 암호화 할 경우이다.

(9) 형식3)의 인자 instr은 간접 복호화 키를 의미하며 instr의 값을 변수로하여

그 값을 복호화 키로 사용한다. 이것은 암호화 부분이나 복호화 부분이 있는

Wel 원시 프로그램이 노출이 될 경우에 복호화 키가 노출되기 때문에 보안상

복호화 키를 별도로 관리하려는 목적으로 사용한다.  간접 복호화 키의 변수

명(instr의 값)은  Wel 프로그램 또는 form의 변수명 작성 규칙을 무시할 수

있어 @pass와 같은 변수를 사용할 수 있다.  프로그램이나 form에서는 이와

같은 변수의 값을 반영할 수 없기 때문에 이러한 명칭을 사용하는 것이 보안

에 도움이 될 것이다.  @pass와 같은 변수에 값을 대입하려면 listmerge()

함수를 form을 개방하지 않은 상태에서 실행하면 된다. ( 간접 복호화 키에

값을 대입하는 방법은 "/etc/wel.passwd"를 참고하면 된다 )

(10) 형식3)에서 destr과 instr의 값이 모두 있을 경우에 instr을 우선한다.

(11) 인자 str이 암호화된 암호문 문자열이 result에 돌려진다.

4. 사용예

str1= encode("seoul", "an"); str2= decode(str1);

printf("   암호문: %-20s , 해독된 원문: %s\n", str1, str2);

str1= encode("seoul", ""); str2= decode(str1);

printf("   암호문: %-20s , 해독된 원문: %s\n", str1, str2);

str1= encode("seoul", "an", "pusan"); str2= decode(str1, "pusan");

printf("   암호문: %-20s , 해독된 원문: %s\n", str1, str2);

------------------------------ [ 출력결과 ] ------------------------------

암호문: anmQx3TzCOIdEp3cyym  , 해독된 원문: seoul

암호문:                      , 해독된 원문:

암호문: anTrolc/Hte1GZdxKJ00 , 해독된 원문: seoul

10.5.5  encodekey()

1. 형식: result= encodekey()

2. 기능: 암호화 키를 난수에 의하여 생성한다.

3. 설명

(1) 난수에 의하여 생성된 암호화 키가 result에 돌려진다.

4. 사용예

key= encodekey(); cstr= crypt("hello", key);

str1= encode("hello", key); str2= decode(str1);

printf("key=%s cstr=%s str1=%s str2=%s\n", key, cstr, str1, str2);

------------------------------ [ 출력결과 ] ------------------------------

key=Pr cstr=PrN1C3KkYlkjs str1=PrqOPHJmDKf2aCyy/fG str2=hello

10.6  문자열 함수

10.6.1  left()

1. 형식

형식1) result= left(str, length)

형식2) result= left(str, length, hangul_mode)

2. 기능: 인자 str 문자열의 왼쪽부터 length 문자수의 문자열을 얻는다.

형식2)에서 hangul_mode는 한글 절반 짤림을 방지한다.

3. 설명

(1) 인자 str은 대상 문자열이며 수치이면 문자열로 변환된다.

(2) 인자 length나 hangul_mode가 문자열이고 수치로 변환될 수 없을 때는

에러 처리된다.

(3) 인자 length는 문자수를 의미하며 그 값이 0 이면 Null string("")이

result에 돌려지고, 그 값이 음수이면 인자 str의 끝부분의 위치에서

length 절대값의 문자수를 제외한 문자열이 result에 돌려진다.

(4) 인자 length에 소수아래수가 있으면 절삭한다.

(5) 인자 length가 str의 문자수보다 크면 str의 문자수로 처리된다.

(6) 형식2)에서 hangul_mode는 한글 절반이 짤리게 되는 것을 방지한다.

(7) 형식2)에서 hangul_mode의 값이 0 이면 무시되고 기타는 1과 같이 처리된다.

(8) 인자 str의 왼쪽에서 length 문자수의 문자열이 result에 돌려진다.

4. 사용예

r1= left("ABCDEFG", 3);

r2= left(-12345, 3);

r3= left("가나다라", 4);

r4= left("가나다라", 3, 1); // 한글 절반 짤림을 방지( "가"만 취함 )

r5= left("abcde", -2); // 왼쪽을 유지한 채 오른쪽의 2문자를 버림

printf("[%s] [%s] [%s] [%s] [%s]\n", r1, r2, r3, r4, r5);

------------------------------ [ 출력결과 ] ------------------------------

[ABC] [-12] [가나] [가] [abc]

10.6.2  len()

1. 형식: result= len(str)

2. 기능: 인자 str의 문자열 길이를 정수값으로 얻는다.

3. 설명

(1) 인자 str은 대상 문자열이며 수치이면 문자열로 변환된다.

(2) 인자 str의 문자열 길이인 정수값이 result에 돌려진다.

4. 사용예

result1= len("ABCDEFG");

result2= len(-12345);

printf("result1= %d  result2= %d\n", result1, result2);

------------------------------ [ 출력결과 ] ------------------------------

result1= 7  result2= 6

10.6.3  lrtrim()

1. 형식: result= lrtrim(str)

2. 기능: 인자 str 문자열의 왼쪽과 오른쪽에 있는 공백을 제거한 문자열을 얻는다.

3. 설명

(1) 인자 str은 대상 문자열이며 수치이면 문자열로 변환된다.

(2) 인자 str의 왼쪽과 오른쪽의 공백을 제거한 문자열이 result에 돌려진다.

4. 사용예

result1= lrtrim("     ABC      ");

result2= lrtrim("   a  b  c    ");

printf("[%s] [%s]\n", result1, result2);

------------------------------ [ 출력결과 ] ------------------------------

[ABC] [a  b  c]

10.6.4  ltrim()

1. 형식: result= ltrim(str)

2. 기능: 인자 str 문자열의 왼쪽에 있는 공백을 제거한 문자열을 얻는다.

3. 설명

(1) 인자 str은 대상 문자열이며 수치이면 문자열로 변환된다.

(2) 인자 str의 왼쪽 공백을 제거한 문자열이 result에 돌려진다.

4. 사용예

result1= ltrim("     ABC      ");

result2= ltrim("   a  b  c    ");

printf("[%s] [%s]\n", result1, result2);

------------------------------ [ 출력결과 ] ------------------------------

[ABC      ] [a  b  c    ]

10.6.5  mid()

1. 형식

형식1) result= mid(str, position)

형식2) result= mid(str, position, length)

2. 기능: 인자 str 문자열의 position위치에서 length 문자수의 문자열을 얻는다.

형식1)은 position위치에서 문자열의 끝까지를 얻는다.

3. 설명

(1) 인자 str은 대상 문자열이며 수치이면 문자열로 변환된다.

(2) 인자 position이나 length가 문자열이고 수치로 변환될 수 없을 때는

에러 처리된다.

(3) 인자 position이나 length가 음수이면 에러 처리되며 소수아래수는 절삭한다.

(4) 인자 position은 str 문자열에 대한 시작 위치이며 첫 문자의 위치는 1이다.

(5) 인자 length는 문자수이며 str의 문자수보다 크면 str의 문자수로 처리된다.

(6) 인자 str의 position위치에서 length문자수의 문자열이 result에 돌려진다.

(7) 형식1)은 position위치에서 str 문자열의 끝까지가 result에 돌려진다.

4. 사용예

result1= mid("ABCDEFG", 3); // 3번째 문자부터 끝까지

result2= mid(-12345, 3, 2); // "-12345"에 대해 3번째 문자부터 두문자

printf("[%s] [%s]\n", result1, result2);

------------------------------ [ 출력결과 ] ------------------------------

[CDEFG] [23]

10.6.6  right()

1. 형식: result= right(str, length)

2. 기능: 인자 str 문자열의 오른쪽에서 length 문자수의 문자열을 얻는다.

3. 설명

(1) 인자 str은 대상 문자열이며 수치이면 문자열로 변환된다.

(2) 인자 length가 문자열이며 수치로 변환될 수 없을 때는 에러 처리된다.

(3) 인자 length는 문자수를 의미하며 그 값이 0 이면 Null string("")이

result에 돌려지고, 그 값이 음수이면 str의 첫 위치에서 length 절대값의

문자수를 제외한 문자열이 result에 돌려진다.

(4) 인자 length에 소수아래수가 있으면 절삭한다.

(5) 인자 length가 str의 문자수보다 크면 str의 문자수로 처리된다.

(6) 인자 str의 오른쪽에서 length 문자수의 문자열이 result에 돌려진다.

4. 사용예

result1= right("ABCDEFG", 3);

result2= right(-12345, 3);

result3= right("abcde", -2); // 오른쪽을 유지한 채 왼쪽의 2문자를 버림

printf("[%s] [%s] [%s]\n", result1, result2, result3);

------------------------------ [ 출력결과 ] ------------------------------

[EFG] [345] [cde]

10.6.7  rtrim()

1. 형식: result= rtrim(str)

2. 기능: 인자 str 문자열의 오른쪽에 있는 공백을 제거한 문자열을 얻는다.

3. 설명

(1) 인자 str은 대상 문자열이며 수치이면 문자열로 변환된다.

(2) 인자 str의 오른쪽 공백을 제거한 문자열이 result에 돌려진다.

4. 사용예

result1= rtrim("     ABC      ");

result2= rtrim("   a  b  c    ");

printf("[%s] [%s]\n", result1, result2);

------------------------------ [ 출력결과 ] ------------------------------

[     ABC] [   a  b  c]

10.6.8  split()

1. 형식

형식1) result= split(separator, str)

형식2) result= split(separator, str, limit)

2. 기능: 인자 str의 문자열을 인자 separator의 분리문자로 분해를 한 문자열을

1차원 배열로 얻는다. 형식2)의 인자 limit는 분해되는 문자열의 개수를

제한할 때 사용하는 한계값이다.

3. 설명

(1) 인자 str은 대상 문자열이며 수치이면 문자열로 변환된다.

(2) 인자 separator는 분리 문자열이며 수치이면 문자열로 변환된다.

(3) 형식2)의 인자 limit는 수치이며 문자열이면 수치로 변환된다.

(4) 분리된 문자열의 개수 만큼의 요소를 지닌 1차원 배열이 result에 돌려진다.

(5) 최초로 분리된 문자열은 result[0]에 기억된다.

(6) 결과를 수용하는 result는 선언하지 않았거나 free형으로 선언되어야 한다.

4. 사용예

str= "seoul&&pusan&&korea";

sp1= split("&&", str); // "&&"로 문자열을 조각낸 1차원 배열을 얻는다.

cnt= element(sp1); // 배열요소의 개수를 얻는다.

print("   ");

for(i=0; i<cnt; i++) printf("sp1[%d]= (%s) ", i, sp1[i]);

print("\n   ");

sp2= split("&&", str, 2); // 분리되는 문자열을 2개만 얻는다.

for(i=0; i<element(sp2); i++) printf("sp2[%d]= (%s) ", i, sp2[i]);

------------------------------ [ 출력결과 ] ------------------------------

sp1[0]= (seoul) sp1[1]= (pusan) sp1[2]= (korea)

sp2[0]= (seoul) sp2[1]= (pusan)

10.6.9  sprintf()

1. 형식: result= sprintf(서식문자열, 인자2, ... , 인자N)

2. 기능: 서식문자열의 형태로 인자2부터 인자N까지의 값을 출력한 문자열을 얻는다.

3. 설명

(1) 이 함수는 printf()함수와 같으며 그 결과를 표준출력으로 출력을 하지않고

문자열로 출력한다.

(2) 서식문자열의 형태로 출력된 문자열이 result에 돌려진다.

(3) 서식(format)의 종류 - printf()함수를 참고

(4) 서식(format)의 형식 - printf()함수를 참고

4. 사용예

a= sprintf("decimal= %d octal= %o hex= %x real= %f", 123,123,123,123.4);

b= sprintf("(%.3ld)(%#o)(%#X)(%09.4b)", 1234567,123,123,96);

c= sprintf("(%10.2f)(%10.1f)(%010.2f)(%-10.2f)", 5.67,5.67,5.67,5.67);

d= sprintf("%.3ld", 123456789);

print("   ", a, "\n   ", b, "\n   ", c, "\n   ", d, "\n");

------------------------------ [ 출력결과 ] ------------------------------

decimal= 123 octal= 173 hex= 7b real= 123.400000

(1,234,567)(0173)(0X7B)(0110 0000)

(      5.67)(       5.7)(0000005.67)(5.67      )

123,456,789

10.6.10  strchange()

1. 형식

형식1) result= strchange(str, search_str, replace_str)

형식2) result= strchange(str, search_str, replace_str, separator)

형식3) result= strchange(str, search_str, replace_str, stag, etag)

형식4) result= strchange(str, search_str, replace_str, separator, stag, etag)

2. 기능: 인자 str의 문자열에서 search_str을 찾아 replace_str으로 바꿔진

문자열을 얻는다.  이 함수는 strfindreplace()함수와 비슷한 역할을 하며

여러개의 단어(문자열)를 찾아 바꿀 수 있는 차이점이 있다.

형식2)의 separator는 search_str과 replace_str의 문자열 내에서 단어를

분리하는 문자를 지정하고자 할 때 사용하며 초기값은 "|" 문자이다.

형식3)과 형식4)의 stag와 etag는 비변환 영역을 지정하는 문자열로써 str

문자열 내에서 stag로 시작되어 etag로 종료되는 부분에서는 문자열 변환이

되지 않도록 한다.

3. 설명

(1) str은 대상 문자열이며 수치이면 문자열로 변환된다.

(2) search_str은 찾을 문자열이며 수치이면 문자열로 변환된다.  찾을 단어가

여러개일 경우 단어 분리 문자로 구분하여 나열할 수 있으며, 이들은

search_str의 왼쪽에서 오른쪽의 순서로 str과 비교된다.

(3) replace_str은 바꿀 문자열이며 수치이면 문자열로 변환된다.

바꿀 단어가 여러개일 경우 단어 분리 문자로 구분하여 나열할 수 있다.

(4) 여러 단어를 찾아 바꾸고자 할 때 search_str내의 단어와 replace_str내의

단어의 개수가 다르면 에러 처리된다.

(5) search_str과 replace_str에서 각 단어의 길이가 64자를 초과하면 나머지는

무시되며 여러 단어를 사용할 때 단어수가 64개를 초과하면 에러 처리된다.

(6) 형식1)은 찾은 문자열을 바꿀 문자열로 변환하며 여러개의 단어를 찾아

바꾸고자 할 때 각각의 단어를 "|" 문자로 구분한다.

(7) 형식2)에서 separator는 단어 분리 문자이며 한문자가 아니면 에러 처리된다.

(8) 형식3)과 형식4)에서 stag는 str 대상 문자열내에서 변환되지 않아야할

부분의 시작을 의미하는 식별 문자열이다.

(9) 형식3)과 형식4)에서 etag는 str 대상 문자열내에서 변환되지 않아야할

부분의 끝을 의미하는 식별 문자열이다.

(10) 변경한 문자열이 result에 돌려진다.

4. 사용예#1

str= "That Somebody Was You";

// 아래의 문장은 "o"는 "OO"로 "a"는 "AA"로 변환하며 단어 분리 문자는 "|"임

result1= strchange(str, "o|a", "OO|AA");

// 아래의 문장은 "o"는 "|"로 "a"는 "A"로 변환하며 단어 분리 문자는 ";"이다.

result2= strchange(str, "o;a", "|;A", ";");

printf("[%s] [%s]\n", result1, result2);

------------------------------ [ 출력결과 ] ------------------------------

[ThAAt SOOmebOOdy WAAs YOOu] [ThAt S|meb|dy WAs Y|u]

5. 사용예#2

str= "aa<{bb}>cc<{dd}>ee"; // 대상 문자열

find= "a|b|c|d|e"; // 찾을 문자열 집합

rep= "A|B|C|D|E";  // 바꿀 문자열 집합

str2= strchange(str, find, rep);

// 아래의 문장은 "<{"에서 "}>" 내의 문자는 변환 하지 않는다.

str3= strchange(str, find, rep, "<{", "}>");

str4= strchange(str, find, rep, "|", "<{", "}>");

printf("str2=[%s] str3=[%s] str4=[%s]\n", str2, str3, str4);

------------------------------ [ 출력결과 ] ------------------------------

str2=[AA<{BB}>CC<{DD}>EE] str3=[AAbbCCddEE] str4=[AAbbCCddEE]

10.6.11  strchange_preset()

1. 형식

형식1) result= strchange_preset(search_str, replace_str)

형식2) result= strchange_preset(search_str, replace_str, separator)

형식3) result= strchange_preset("","")

형식4) result= strchange_preset()

2. 기능: 이 함수는 strchange() 함수를 사용할 때 공통되는 찾기와 바꾸기 단어를

사전에 설정 또는 해제하는 역할을 한다.  형식1)과 형식2)는 공통 찾기와

바꾸기를 설정하며 형식3)과 형식4)는 공통 찾기와 바꾸기를 해제하는 것을

의미한다.

3. 설명

(1) search_str은 찾을 문자열이며 수치이면 문자열로 변환된다.  찾을 단어가

여러개일 경우 단어 분리 문자로 구분하여 나열할 수 있으며, 이들은

search_str의 왼쪽에서 오른쪽의 순서로 처리되며 strchange() 함수

에서 사용되는 search_str보다 우선 처리된다.

(2) replace_str은 바꿀 문자열이며 수치이면 문자열로 변환된다.

바꿀 단어가 여러개일 경우 단어 분리 문자로 구분하여 나열할 수 있으며,

strchange()함수에서 사용되는 replace_str보다 우선 처리된다.

(3) 여러 단어를 찾아 바꾸고자 할 때 search_str내의 단어와 replace_str내의

단어의 개수가 다르면 에러 처리된다.

(4) search_str과 replace_str에서 각 단어의 길이가 64자를 초과하면 나머지는

무시되며 여러 단어를 사용할 때 단어수가 64개를 초과하면 에러 처리된다.

또한 strchange()함수의 search_str과 replace_str의 단어수를 포함하여

64개를 초과할 수 없다.

(5) 형식1)은 찾은 문자열을 바꿀 문자열로 변환하며 여러개의 단어를 찾아

바꾸고자 할 때 각각의 단어를 "|" 문자로 구분한다.

(6) 형식2)에서 separator는 단어 분리 문자이며 한문자가 아니면 에러 처리된다.

(7) 형식3)은 strchange_preset(NULL, NULL)과 같다.

(8) 형식1) 또는 형식2)에서 설정된 search_str과 replace_str은 이 함수를 실행

한 이후의 모든 strchange() 함수에 공통적으로 우선하여 적용되며, 형식3)

또는 형식4)에 의하여 해제하기 전까지 효력을 발생한다.

(9) strchange_preset() 함수로 설정된 단어의 개수가 result에 돌려진다.

4. 사용예

str= "aabbccddee"; // 대상 문자열

strchange_preset("a|b", "1|2"); // 'a'를 '1'로, 'b'를 '2'로 변환하도록 설정

// 아래 문장은 strchange_preset() 함수에 의하여 설정된 'a'와 'b'를 각각

// '1'과 '2'로 변환한 후에 'c'를 '3', 'd'를 '4'로 변환된다.

str2= strchange(str, "c|d", "3|4"); // 'c'를 '3', 'd'를 '4'로 변환

// 아래 문장은 'c'는 'Y'로 변환되지만 'a'는 사전에 설정된 '1'로 변환된다.

str3= strchange(str, "a|c", "X|Y");

strchange_preset(); // 사전에 설정된 'a'와 'b'의 변환을 해제한다.

str4= strchange(str, "d|e", "V|W"); // 'd'와 'e'만 각각 'V'와 'W'로 변환함

printf("str2=[%s] str3=[%s] str4=[%s]\n", str2, str3, str4);

------------------------------ [ 출력결과 ] ------------------------------

str2=[11223344ee] str3=[1122YYddee] str4=[aabbccVVWW]

10.6.12  strcount()

1. 형식: result= strcount(str, find_str)

2. 기능: 인자 str에서 인자 find_str 문자열의 개수를 얻는다.

3. 설명

(1) 인자 str은 대상 문자열이며 수치이면 문자열로 변환된다.

(2) 인자 find_str은 찾을 문자열이며 수치이면 문자열로 변환된다.

(3) 찾은 문자열의 개수가 result에 돌려지며 find_str이 str에 없으면 0이

돌려진다.

4. 사용예

result1= strcount("문자열의 문자개수를 얻는다", "문자");

result2= strcount("ABCDACABAAA", "A");

printf("result1= %d result2= %d\n", result1, result2);

------------------------------ [ 출력결과 ] ------------------------------

result1= 2 result2= 6

10.6.13  strep()

1. 형식: result= strep(str, repcnt)

2. 기능: 인자 str의 문자열을 repcnt회 반복한 문자열을 얻는다.

3. 설명

(1) 인자 str은 대상 문자열이며 수치이면 문자열로 변환된다.

(2) 인자 repcnt가 문자열이고 수치로 변환될 수 없을 때는 에러 처리된다.

(3) 인자 repcnt가 0보다 작거나 512보다 크면 에러 처리된다.

(4) 인자 repcnt에 소수 아래수가 있으면 절삭된다.

(5) 인자 str을 repcnt회 반복한 문자열이 result에 돌려진다.

4. 사용예

result1= strep("ABC", 3);

result2= strep(result1, 2);

printf("result1= [%s] result2= [%s]\n", result1, result2);

------------------------------ [ 출력결과 ] ------------------------------

result1= [ABCABCABC] result2= [ABCABCABCABCABCABC]

10.6.14  strfind()

1. 형식: result= strfind(str, search_str)

2. 기능: 인자 str의 문자열에서 search_str을 찾은 위치를 얻는다.

3. 설명

(1) 인자 str은 대상 문자열이며 수치이면 문자열로 변환된다.

(2) 인자 search_str은 찾을 문자열이며 수치이면 문자열로 변환된다.

(3) 찾은 위치에 대한 정수값이 result에 돌려진다.(첫 문자의 위치는 1임)

(4) result의 값이 0 이면 str에서 search_str을 찾지 못한 경우이다.

4. 사용예

result1= strfind("That Somebody Was You", "me");

result2= strfind("The Moment", "Kenny G"); // 찾지 못한 경우

printf("result1= %d result2= %d\n", result1, result2);

------------------------------ [ 출력결과 ] ------------------------------

result1= 8 result2= 0

10.6.15  strfindreplace()

1. 형식

형식1) result= strfindreplace(str, search_str, replace_str)

형식2) result= strfindreplace(str, search_str, replace_str, rcnt)

2. 기능: 인자 str의 문자열에서 search_str을 찾아 replace_str으로 바꿔진

문자열을 얻는다.  형식2)의 rcnt는 찾아 바꿀 횟수이다.

3. 설명

(1) 인자 str은 대상 문자열이며 수치이면 문자열로 변환된다.

(2) 인자 search_str은 찾을 문자열이며 수치이면 문자열로 변환된다.

(3) 인자 replace_str은 바꿀 문자열이며 수치이면 문자열로 변환된다.

(4) 형식1)은 찾은 문자열을 바꿀 문자열로 모두 변환된다.

(5) 형식2)에서 rcnt는 바꿀 최대 횟수이며 소수아래는 절삭한다.

(6) 형식2)에서 rcnt의 값이 0보다 작거나 같으면 형식1)처럼 모두 변환된다.

(7) 찾아 바꿔진 문자열이 result에 돌려진다.

4. 사용예

str= "That Somebody Was You";

result1= strfindreplace(str, "o", "A"); // "o"를 모두 "A"로 바꿔버린다.

result2= strfindreplace(str, "o", "A", 1); // "o"를 "A"로 한문자만 바꿈

printf("result1= [%s] result2= [%s]\n", result1, result2);

------------------------------ [ 출력결과 ] ------------------------------

result1= [That SAmebAdy Was YAu] result2= [That SAmebody Was You]

10.6.16  strform()

1. 형식: result= strform(인자1, 인자2, ... , 인자N)

2. 기능: 인자1 부터 인자N 까지를 폼 매크로 기능에 의해 매크로 확장을 한 결과를

하나의 문자열로 얻는다. 이 함수는 문자열 결합연산자인 '~' 기호의 과다

사용(특히 데이터베이스의 query 문자열)시 코드 작성의 불편을 해소하기

위한 기능이며 폼 매크로변수의 명칭을 잘못 사용하였으면 에러 처리된다.

3. 설명

(1) 모든 인자는 문자열이며 수치이면 문자열로 변환된다.

(2) 인자에 폼 매크로가 사용되었다면 확장(풀이)된다.

(3) 인자 없이 이 함수를 호출하면 에러 처리되며 인자의 개수는 제한이 없다.

(4) 이 함수는 폼 매크로의 기능을 사용하기 때문에 개방된 폼이 32 개를 초과

하면 에러 처리되며,  이 함수의 인자를 이용하여  새로운 폼을 개방한 후

폐쇄하지 않았다면 함수가 종료될 때 모두 폐쇄된다.

(5) 처리된 문자열이 result에 돌려진다.

4. 사용예

pc_name= "PentiumIII";

pc_speed= "1Ghz";

pc_mem= "512Mbytes";

str1= "PC: " ~ pc_name ~ " " ~ pc_speed ~ " Memory: " ~ pc_mem;

str2= strform("PC: {$pc_name} {$pc_speed} Memory: {$pc_mem}");

str3= strform("PC: ", pc_name, " ", pc_speed, " Memory: ", pc_mem);

print("   str1= ", str1, "\n");

print("   str2= ", str2, "\n");

print("   str3= ", str3, "\n");

------------------------------ [ 출력결과 ] ------------------------------

str1= PC: PentiumIII 1Ghz Memory: 512Mbytes

str2= PC: PentiumIII 1Ghz Memory: 512Mbytes

str3= PC: PentiumIII 1Ghz Memory: 512Mbytes

10.6.17  strkind()

1. 형식: result= strkind(str)

2. 기능: 인자 str을 구성하고 있는 문자의 종류를 Bit pattern 으로 얻는다.

3. 설명

(1) 인자 str은 대상 문자열이며 수치이면 문자열로 변환된다.

(2) 문자의 종류에 대한 코드값이 result에 돌려지며, 그 의미는 아래와 같다.

0x8000  0x2000  0x0800  0x0200  0x0080  0x0020  0x0008  0x0002

□ 0x4000□ 0x1000□ 0x0400□ 0x0100□ 0x0040□ 0x0010□ 0x0004□0x0001

□   □   □   □   □   □   □   □   □   □   □   □   □   □   □   □

Bit: 15  14  13  12  11  10   9   8   7   6   5   4   3   2   1   0

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ x □ x □ x □ x □ x □ x □ x □ x □ x □ x □ x □ x □ x □ x □ x □ x □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□   □   □   □   □   □   □   □   □   □   □   □   □   □   □   □

□                                       □   □   □   □

□   {   (   \   ;   ,   '   "  \r  \n   □   □   □   □ 수치 공백

□                                       □   □   □

영문대문자

기타                              제어문자 한글 영문소문자

4. 사용예

rt1= strkind("ABC");  rt2= strkind("abc");

rt3= strkind("한글"); rt4= strkind("1234");

rt5= strkind("    "); rt6= strkind("AB12한글");

printf("%#4x %#4x %#4x %#4x %#4x %#4x\n", rt1, rt2, rt3, rt4, rt5, rt6);

------------------------------ [ 출력결과 ] ------------------------------

0x4  0x8 0x10  0x2  0x1 0x16

10.6.18  tolower()

1. 형식: result= tolower(str)

2. 기능: 인자 str의 문자열에서 영문 대문자를 소문자로 변환한 문자열을 얻는다.

3. 설명

(1) 인자 str은 대상 문자열이며 수치이면 문자열로 변환된다.

(2) 영문 대문자가 소문자로 변환된 문자열이 result에 돌려진다.

4. 사용예

result= tolower("That Somebody Was You");

print(result);

------------------------------ [ 출력결과 ] ------------------------------

that somebody was you

10.6.19  toupper()

1. 형식: result= toupper(str)

2. 기능: 인자 str의 문자열에서 영문 소문자를 대문자로 변환한 문자열을 얻는다.

3. 설명

(1) 인자 str은 대상 문자열이며 수치이면 문자열로 변환된다.

(2) 영문 소문자가 대문자로 변환된 문자열이 result에 돌려진다.

4. 사용예

result= toupper("That Somebody Was You");

print(result);

------------------------------ [ 출력결과 ] ------------------------------

THAT SOMEBODY WAS YOU

10.7  입출력 함수

10.7.1  choice()

1. 형식: result= choice(prompt, keystr)

2. 기능: 인자 prompt의 문자열을 표준 출력 장치로 출력한 후에 표준 입력 장치를

통하여 하나의 키(문자)를 입력 받아서 인자 keystr의 한 문자와 일치하면

함수가 종료되며 인자 keystr의 문자와 일치하지 않으면 입력을 반복한다.

3. 설명 (이 함수를 웹 상에서 사용하면 에러로 처리됩니다)

(1) 인자 prompt는 프롬프트 문자열이며 수치이면 문자열로 변환된다.

(2) 인자 keystr은 키(key) 집합으로 문자열이며 수치이면 문자열로 변환된다.

(3) 입력된 키의 keystr에 대한 순번이 result에 돌려진다.(첫 문자인 경우 1임)

4. 사용예

result= choice("계속하시겠습니까(Y/N)? ", "YyNn");

print(" --> 입력된 키에 대한 순번은 ", result, " 입니다.");

------------------------------ [ 출력결과 ] ------------------------------

계속하시겠습니까(Y/N)? y --> 입력된 키에 대한 순번은 2 입니다.

10.7.2  flush()

1. 형식: result= flush()

2. 기능: 표준 출력 장치로 출력을 하면 개행문자('\n')가 출력되기 전까지는 버퍼링

을 하기 때문에 실시간으로 표준 출력 장치로 출력이 되지 않는다.  버퍼링

된 내용을 강제로 출력할 때 이 함수를 사용한다.(fflush함수와 같다)

3. 설명

(1) 버퍼의 내용을 강제로 비워버리게 되며 실시간으로 출력을 할 수 있다.

(2) 성공하면 0, 실패시 -1(EOF)을 result에 되돌린다.

4. 사용예

print("이 메시지는 버퍼링 됩니다.");

flush(); // 버퍼링된 내용을 출력한다.

------------------------------ [ 출력결과 ] ------------------------------

이 메시지는 버퍼링 됩니다.

10.7.3  inkey()

1. 형식: result= inkey(mode)

2. 기능: 터미널로부터 하나의 키를 입력 받은 후 터미널 키 코드 값을 얻는다.

(터미널 키 코드는 ASC 코드와 확장키 코드로 이루어진다)

3. 설명 (이 함수를 웹 상에서 사용하면 에러로 처리됩니다)

(1) 인자 mode가 문자열이고 수치로 변환될 수 없을 때는 에러 처리된다.

(2) 인자 mode가 0 이면 키 입력을 기다리지 않고 0 을 되돌린다.

(3) 인자 mode가 0 이 아니면 키를 입력할 때까지 대기한다.

(4) 입력된 키에 대한 코드값이 result에 돌려진다.(최대 4바이트 정수임)

4. 사용예

print("키를 누르시면 코드값이 출력됩니다. 종료하려면 ESC키를 누르세요!\n");

for(i=1; i<=3; i++) // 3회 반복함

{

result = inkey(1);

if(result==0x1b) break; // 0x1b는 ESC키에 대한 코드값

printf("   키 코드값= 0x%X\n", result); // 16진 코드값을 출력

}

------------------------------ [ 출력결과 ] ------------------------------

키를 누르시면 코드값이 출력됩니다. 종료하려면 ESC키를 누르세요!

키 코드값= 0x61

키 코드값= 0x62

키 코드값= 0x63

10.7.4  input()

1. 형식

형식1) result= input()

형식2) result= input(size)

2. 기능: 키보드로부터 인자 size 만큼의 문자를 입력받은 후 엔터키를 누르면 입력

결과를 문자열로 얻는다.(입력 종료시 줄 바꿈을 하지 않는다)

3. 설명 (이 함수를 웹 상에서 사용하면 에러로 처리됩니다)

(1) 인자 size가 문자열이고 수치로 변환될 수 없을 때는 에러 처리된다.

(2) 인자 size의 값이 음수이면 입력값이 표시되지 않는다.(암호 입력시 사용)

(3) 인자 size의 절대값은 입력할 수 있는 최대 문자수이다.

(4) 인자 size가 0이거나 절대값이 512보다 크면 최고 512문자를 입력할 수 있다.

(5) 형식1)은 인자 size가 0인 것과 같은 의미로 최고 512문자를 입력할 수 있다.

(6) 입력된 문자열이 result에 돌려진다.

4. 사용예

result= input(5); // 최고 5개의 문자까지 입력가능

print();          // input()은 입력종료시 줄을 바꿔주지 않는다.

print("   입력된 내용= ", result);

------------------------------ [ 출력결과 ] ------------------------------

입력하세요: hello

입력된 내용= hello

10.7.5  print()

1. 형식

형식1) result= print()

형식2) result= print(인자1, 인자2, ... , 인자N)

2. 기능: 표준 출력 장치(터미널의 화면)에 출력을 한다.

3. 설명

(1) 형식1)은 표준 출력 장치에 개행문자('\n')를 출력한다.(줄 바꿈)

(2) 형식2)는 인자에서 개행문자('\n')를 출력하지 않는한 줄이 바뀌지 않는다.

(3) 형식2)에서 인자 개수의 제한은 없다.

(4) 출력된 문자의 개수(byte 수)가 result에 돌려진다.

4. 사용예

print("안녕하세요?"); // '\n'가 없으면 줄이 바꿔지지 않는다.

print();

------------------------------ [ 출력결과 ] ------------------------------

안녕하세요?

10.7.6  printf()

1. 형식: result= printf(서식문자열, 인자2, ... , 인자N)

2. 기능: 표준 출력 장치(터미널의 화면)에 서식문자열의 형태로 인자2부터

인자N까지의 값을 출력한다.

3. 설명

(1) C언어의 printf()함수와 동일한 함수이며 서식문자열의 종류는 (3)과 같다.

(2) 출력된 문자의 개수(byte 수)가 result에 돌려진다.

(3) 서식(format)의 종류

※ C언어와 다른점: 자료형이 맞지 않으면 형변환을 하며 형변환을 할수 없는

경우의 출력 결과는 알수 없는 값(쓰레기값)이 출력된다.

%c - 문자 출력(1byte문자)  -------------> 자료형이 맞지 않으면 형변환함

%d - 2byte 정수 출력(10진수) -----------> 자료형이 맞지 않으면 형변환함

%u - 2byte 부호없는 정수 출력(10진수) --> 자료형이 맞지 않으면 형변환함

%o - 2byte 정수를 8진수로 출력 ---------> 자료형이 맞지 않으면 형변환함

%x - 2byte 정수를 16진수로 출력 --------> 자료형이 맞지 않으면 형변환함

%X - %x와 같고 영문 대문자로 출력 ------> 자료형이 맞지 않으면 형변환함

%b - 2byte 정수를 2진수로 출력 ---------> 자료형이 맞지 않으면 형변환함

%ld - 4byte 정수 출력(10진수) ----------> 자료형이 맞지 않으면 형변환함

%lu - 4byte 부호없는 정수 출력(10진수) -> 자료형이 맞지 않으면 형변환함

%lo - 4byte 정수를 8진수로 출력 --------> 자료형이 맞지 않으면 형변환함

%lx - 4byte 정수를 16진수로 출력 -------> 자료형이 맞지 않으면 형변환함

%lX - %lx와 같고 영문은 대문자로 출력 --> 자료형이 맞지 않으면 형변환함

%lb - 4byte 정수를 2진수로 출력 --------> 자료형이 맞지 않으면 형변환함

%f - 실수 출력 -------------------------> 자료형이 맞지 않으면 형변환함

%e - 실수를 지수형식으로 출력 ----------> 자료형이 맞지 않으면 형변환함

%E - %e와 같고 영문은 대문자로 출력 ----> 자료형이 맞지 않으면 형변환함

%g - %f와 %e중에서 문자수가 작은 것을

선택적으로 출력 -------------------> 자료형이 맞지 않으면 형변환함

%G - %g와 같고 영문은 대문자로 출력 ----> 자료형이 맞지 않으면 형변환함

%s - 문자열을 출력 ---------------------> 자료형이 맞지 않으면 형변환함

%p - 포인터를 출력 ---------------------> 형변환하지 않음

%P - %p와 같고 영문은 대문자로 출력 ----> 형변환하지 않음

(4) 서식(format)의 형식

% [ - | + | # | 공백 | 0 ] [ 총자리수 | * ] [.자리수2 | *] 서식문자

※ 위의 형식에서 '[ ]' 안의 내용은 '생략가능함'을 의미하고 ' | ' 기호는

'또는'을 의미한다.  그리고 '자리수2'는 %f %e일때는 '소수아래 정밀도',

%s일때는 '출력할 문자열의 문자수', %d %u %ld %lu일때는 '수치 사이에

콤마를 출력할 단위수', %o %x %X %b일때는 '수치 사이에 공백을 출력할

단위수'를 의미한다.  또한 '서식문자'는 위 (3)항의 서식의 종류에서

영문 한자(c,d,u,o,...)를 의미한다. '%'다음의 '-'는 왼쪽정렬, '+'는

부호출력, '0'은 수치일때 출력될 수치보다 '총자리수'가 큰 경우 남은

자리를 '0'으로 채운다.('#'과 '공백'은 C언어의 printf를 참고)

4. 사용예

printf("   HELLO! ");

printf("decimal=%d octal=%o hex=%x real=%f\n", 123, 123, 123, 123.4);

printf("   (%.3ld)(%#o)(%#X)(%09.4b)\n", 1234567, 123, 123, 96);

printf("   (%10.2f)(%10.1f)(%010.2f)(%-10.2f)\n", 5.67, 5.67, 5.67, 5.67);

printf("   (%10.3e)(%-10.3e)(%10.3g)\n", 1.234567, 1.234567, 1.234567);

printf("   (%s)(%10s)(%-10s)(%10.3s)\n","HELLO","HELLO","HELLO","HELLO");

printf("   (%c)(%5c)(%-5c)\n", 'A', 'B', 'C');

------------------------------ [ 출력결과 ] ------------------------------

HELLO! decimal=123 octal=173 hex=7b real=123.400000

(1,234,567)(0173)(0X7B)(0110 0000)

(      5.67)(       5.7)(0000005.67)(5.67      )

( 1.235e+00)(1.235e+00 )(      1.23)

(HELLO)(     HELLO)(HELLO     )(       HEL)

(A)(    B)(C    )

10.7.7  putchar()

1. 형식

형식1) result= putchar(ch)

형식2) result= putchar(ch, wcnt)

2. 기능: 표준 출력 장치(터미널의 화면)에 한 문자를 출력한다.

3. 설명

(1) 인자 ch는 표준 출력 장치에 출력할 문자 코드이다.

(2) 인자 ch가 문자열이고 수치로 변환될 수 없을 때는 에러 처리된다.

(3) 널 문자('\0')도 출력할 수 있다.

(4) 형식2)에서 인자 wcnt는 출력할 횟수이며 0보다 작으면 에러 처리된다.

(5) 형식2)에서 인자 wcnt가 0 이면 아무것도 출력되지 않는다.

(6) result의 값이 -1(EOF)이면 출력시 에러가 발생한 것이다.

(7) result의 값이 -1(EOF)가 아니면 출력한 문자의 코드값이다.

4. 사용예

putchar(65); // 65는 'A'에 대한 ASC 값이다.

putchar('*', 20); // '*'를 20개 출력함

------------------------------ [ 출력결과 ] ------------------------------

A********************

10.8  시스템 함수

10.8.1  getenv()

1. 형식: result= getenv(env_var)

2. 기능: 인자 env_var에 해당하는 시스템 환경변수의 값을 얻어온다.

3. 설명

(1) 인자 env_var은 문자열이며 수치이면 문자열로 변환된다.

(2) 인자 env_var은 환경변수 이름이다.

(3) 환경변수의 값에 대한 문자열이 result에 돌려진다.

(4) 웹 서버의 환경변수

SERVER_SOFTWARE ----> 웹 서버의 이름과 버전

SERVER_NAME --------> 서버의 호스트 이름과 DNS alias 혹은 IP address

GATEWAY_INTERFACE --> 서버의 CGI 타입과 개정레벨을 나타냅니다.

SERVER_PROTOCOL ----> 클라이언트 요청이 사용하는 프로토콜

SERVER_PORT --------> 클라이언트 요청을 보내는 포트 번호

REQUEST_METHOD -----> HTML 폼이 사용하는 method 보통 GET 이나 POST

PATH_INFO ----------> 클라이언트에 의해 전달되는 추가 PATH 정보

PATH_TRANSLATED ----> PATH_INFO의 가상 경로를 물리적인 경로로 바꾼값

SCRIPT_NAME --------> 현재 실행이 요청된 스크립트 명

QUERY_STRING -------> GET 방식에서 URL의 뒤에 오는 정보를 저장(POST 제외)

REMOTE_ADDR --------> 클라이언트의 IP주소

REMOTE_HOST --------> 클라이언트의 호스트 이름

REMOTE_USER --------> 서버가 사용자 인증을 지원하고 스크립트가 그 확인을

요청한다면, 이것이 확인된 사용자 이름이 됩니다.

REMOTE_IDENT -------> 서버가 RFC931사용자 확인을 지원한다면 서버로부터

발췌된 사용자 이름이 이 환경변수에 저장된다.

이 변수의 용도는 로그인에만 한정됩니다.

CONTENT_LENGTH -----> POST방식일 경우 클라이언트에서 넘겨지는 입력 길이

CONTENT_TYPE -------> POST방식일 때 정보의 타입을 나타냅니다.

HTTP_USER_AGENT ----> 클라이언트의 사용 프로그램(웹 브라우저)를 표시

HTTP_COOKIE --------> 클라이언트에서 보낸 쿠키 값

(5) Linux 시스템 환경변수

USERNAME, ENV, HISTSIZE, LOGNAME, HISTFILESIZE, MAIL,

TERM, HOSTTYPE, PATH, HOME, SHELL, PS1, USER, MANPATH,

LANG, OSTYPE, ...

4. 사용예

hostname= getenv("HOSTNAME");

username= getenv("USERNAME");

homedir = getenv("HOME");

print("   호스트 이름: ", hostname);

print("   사용자 이름: ", username);

print("   홈 디렉토리: ", homedir);

------------------------------ [ 출력결과 ] ------------------------------

호스트 이름: localhost   사용자 이름: test   홈 디렉토리: /home/test

10.8.2  getgid()

1. 형식: result= getgid()

2. 기능: 현재 사용자의 그룹 ID를 얻어온다.

3. 설명

(1) 현재 사용자의 그룹 ID가 정수값으로 result에 돌려진다.

4. 사용예

id= getgid();

print("그룹 아이디: ", id);

------------------------------ [ 출력결과 ] ------------------------------

그룹 아이디: 0

10.8.3  getpid()

1. 형식: result= getpid()

2. 기능: 현재 실행되고 있는 프로세스(process)의 ID를 얻어온다.

3. 설명

(1) 현재 실행되고 있는 프로세스의 ID가 정수값으로 result에 돌려진다.

4. 사용예

id= getpid();

print("프로세스 아이디: ", id);

------------------------------ [ 출력결과 ] ------------------------------

프로세스 아이디: 23967

10.8.4  getuid()

1. 형식: result= getuid()

2. 기능: 현재 사용자의 사용자 ID를 얻어온다.

3. 설명

(1) 현재 사용자의 사용자 ID가 정수값으로 result에 돌려진다.

4. 사용예

id = getuid();

print("사용자 아이디: ", id);

------------------------------ [ 출력결과 ] ------------------------------

사용자 아이디: 0

10.8.5  keybreak()

1. 형식

형식1) result= keybreak()

형식2) result= keybreak(flag)

형식3) result= keybreak(flag, keybreak_message)

2. 기능: 이 함수는 Wel 프로그램 실행중에 키보드를 통하여 CTRL-C 나 CTRL-\ 가

눌려졌을 경우, 이를 제어하기 위한 함수이다.  형식3)은 CTRL-C가 눌려

졌을 때 출력되는 메시지를 지정하는 경우이며, 형식2)와 같이 메시지를

지정하지 않으면 초기값으로 설정된 메시지가 출력된다.

3. 설명 (이 함수를 웹 상에서 사용하면 에러로 처리됩니다)

(1) 인자 flag은 CTRL-C나 CTRL-\의 효력 발생에 대한 값으로 0 이면 CTRL-C키는

무시되고 1 이나 그 외의 값은 CTRL-C가 유효하게 한다.

(2) 인자 flag이 문자열이고 수치로 변환될 수 없을 때는 에러 처리된다.

(3) 형식1)은 현재 설정된 key break의 상태값을 읽기만 한다. 이 경우에

result의 값이 1이면 CTRL-C가 유효한 상태이고 0 이면 무효한 상태이다.

(4) 형식2)에서 인자 flag이 0 이면 출력되는 메시지가 없으며, 그 외의 값일 때는

초기값으로 설정된 메시지가 출력된다.

(5) 형식3)에서 인자 keybreak_message는 CTRL-C가 눌려졌을 때 출력할 메시지

이며 문자열이 아니면 문자열로 변환하여 처리한다. keybreak_message에

폼 매크로가 사용되었다면 매크로가 처리(확장)된다.

(6) key break의 초기값은 1이며 CTRL-C를 누를 경우 프로그램이 종료된다.

(7) CTRL-C 나 CTRL-\가 눌려졌을 경우의 예

keybreak(0) : 프로그램이 중단되지 않고 메시지가 출력되지 않는다.

keybreak(1) : 프로그램이 중단되며 초기값 메시지를 출력한다.

keybreak(0,"AA") : 프로그램이 중단되지 않고 "AA" 메시지가 출력된다.

keybreak(1,"AA") : 프로그램이 중단되며 "AA" 메시지가 출력된다.

keybreak(1,"") : 프로그램이 중단되며 메시지를 출력하지 않는다.

4. 사용예

print("   5초 내에 CTRL-C를 눌러 보십시요!\n");

save_keybreak= keybreak();

keybreak(0, "[CTRL-C가 입력되었습니다]"); // CTRL-C를 무시하고 메시지를 출력

sleep(5);

keybreak(save_keybreak);

print("\n   대기를 종료합니다!\n");

------------------------------ [ 출력결과 ] ------------------------------

5초 내에 CTRL-C를 눌러 보십시오!

[CTRL-C가 입력되었습니다]

대기를 종료합니다!

10.8.6  msleep()

1. 형식: result= msleep(msec)

2. 기능: 인자 msec의 1000분의 1초 동안 대기를 하며 sleep() 함수와 같으나

1000분의 1초 단위의 인자를 사용하는 점이 다르다.

3. 설명 (이 함수를 웹 프로그램에서 사용할 때 대기 시간이 짧은 것이 좋습니다)

(1) 인자 msec가 정수가 아니면 정수로 변환된다.

(2) result의 값은 의미가 없으며 인자 msec의 값이 돌려진다.

4. 사용예

print("   1.5초만 기다려 주세요...");

flush();

msleep(1500); // 1500/1000초(1.5초) 대기

print("   1.5초가 경과되었습니다!");

------------------------------ [ 출력결과 ] ------------------------------

1.5초만 기다려 주세요...   1.5초가 경과되었습니다!

10.8.7  passwdseek()

1. 형식: result= passwdseek(username)

2. 기능: 인자 username 사용자의 정보를 1차원 배열로 얻는다.

사용자의 정보는 시스템 암호(/etc/passwd) 파일에 있는 자료이다.

3. 설명

(1) 인자 username은 문자열이며 수치이면 문자열로 변환된다.

(2) 인자 username은 시스템에 등록되어 있는 사용자 이름(login id)이어야 한다.

(3) 7개의 요소를 지닌 1차원 문자열 배열이 result에 돌려진다.

(4) result가 배열이 아닌 정수 0의 값을 지니면 등록되지 않은 사용자이다.

(5) 결과를 수용하는 result는 선언하지 않았거나 free형으로 선언되어야 한다.

(6) 암호 파일(/etc/passwd)의 구조 및 결과값 배열의 의미

예) r= passwdseek("test"); 에 의해 r에 기억되는 정보

항목명	사용자명	암호	UID	GID	개인정보	홈 directory	shell종류
배열요소	r[0]	r[1]	r[2]	r[3]	r[4]	r[5]	r[6]
배열내용	test	xxxxxxxx	500	500	홍길동,,,,	/home/test	/bin/bash

4. 사용예

pwd= passwdseek("root"); // root 사용자를 찾는다.

if(!isarray(pwd)) // 또는 if(pwd==0)

{

print("root 사용자를 찾지 못했습니다!");

return;

}

print(pwd[6]); // 사용 shell 출력

------------------------------ [ 출력결과 ] ------------------------------

/bin/bash

10.8.8  putenv()

1. 형식: result= putenv(env)

2. 기능: 환경변수를 기록 또는 변경한다. 인자 env는 문자열로써 환경변수명과

환경변수의 값을 "변수명=값"의 형식으로 지니고 있어야 한다.

3. 설명

(1) 인자 env는 문자열이며 수치이면 문자열로 변환된다.

(2) 인자 env는 "환경변수명=값"의 형식의 문자열이어야 한다.

(3) result의 값은 항상 정수 0 이다.

4. 사용예

oldpath= getenv("PATH"); // 현재의 실행파일 탐색 경로 얻는다

putenv("PATH=/usr/bin"); // 탐색 경로를 변경

newpath= getenv("PATH"); // 변경된 새로운 탐색 경로를 얻는다

putenv("PATH="~oldpath); // 탐색 경로를 복구

printf("   oldpath=%s\n   newpath=%s\n", oldpath, newpath);

------------------------------ [ 출력결과 ] ------------------------------

oldpath=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

newpath=/usr/bin

10.8.9  randomize()

1. 형식: result= randomize()

2. 기능: 난수의 종자(seed)를 타이머에 의해 선택한다.  이 함수는 수학함수 중에서

rand()함수의 난수 발생에 변화를 준다.

3. 설명

(1) result의 값은 항상 정수 1 이다.

4. 사용예

randomize();

result= rand(10);

print(result);

------------------------------ [ 출력결과 ] ------------------------------

5.8678617049009

10.8.10  runtime()

1. 형식: result= runtime()

2. 기능: 프로세스(process)의 CPU 점유(실행) 시간을 얻어온다.

3. 설명

(1) result의 값은 ms(미리초, 1000000분의 1초) 단위의 실행시간이다.

4. 사용예

result= runtime()/1000000.0;

print(result, " sec");

------------------------------ [ 출력결과 ] ------------------------------

0 sec

10.8.11  setuser()

1. 형식: result= setuser(username, password)

2. 기능: 인자 username 사용자의 권한(user id, group id)을 획득 한다.  시스템의

su명령과 비슷한 일을 하며 인자 username 사용자의 암호를 알아야 한다.

(환경변수의 값은 변경되지 않으며 단지 권한만 획득한다)

3. 설명

(1) 인자 username과 password는 문자열이며 수치이면 문자열로 변환된다.

(2) 인자 username은 시스템에 등록되어 있는 사용자 이름(login id)이어야 한다.

(3) 인자 password는 그 사용자의 login 암호이다.

(4) result의 값이  1 이면 정상적으로 사용자를 변경한 것이다.

(5) result의 값이  0 이면 시스템에  등록되어 있지 않은 사용자일 경우이다.

(6) result의 값이 -1 이면 사용자의 암호가 틀린 경우이다.

(7) result의 값이 -2 이면 user id를 변경할 수 없는 경우이다.

(8) result의 값이 -3 이면 group id를 변경할 수 없는 경우이다.

(9) result의 값이 -4 이면 user id와 group id를 모두 설정할 수 없는 경우이다.

10.8.12  sleep()

1. 형식: result= sleep(sec)

2. 기능: 인자 sec초 동안 대기한 후 복귀하며 시간 지연에 사용한다.

3. 설명 (이 함수를 웹 프로그램에서 사용할 때 대기 시간이 짧은 것이 좋습니다)

(1) 인자 sec가 정수가 아니면 정수로 변환된다.

(2) result의 값은 의미가 없으며 인자 sec의 값을 되돌린다.

4. 사용예

print("3초만 기다려 주세요...");

flush();

sleep(3);

print("\t3초가 경과되었습니다!\n");

------------------------------ [ 출력결과 ] ------------------------------

3초만 기다려 주세요...	3초가 경과되었습니다!

10.8.13  system()

1. 형식

형식1) result= system(cmd)

형식2) result= system(cmd, flush_header)

2. 기능: shell 명령을 수행한다.  명령어 라인에서 입력하는 모든 명령을 사용할

수 있다.

3. 설명

(1) 인자 cmd는 문자열이며 수치이면 문자열로 변환된다.

(2) 인자 cmd는 명령어 처리기(shell)가 처리할 수 있는 명령어이어야 한다.

(3) 인자 flush_header는 정수이어야 하며 0 또는 1의 값으로 구분된다.

0 또는 1 외의 값은 1과 같이 처리를 하고 웹 문서의 헤더를 출력하지 않은

상태에서 이 함수를 호출할 경우 헤더의 자동 출력 여부를 결정할 수 있다.

형식1)과 같이 flush_header 인자를 사용하지 않았을 때의 초기값은 1이다.

(4) flush_header의 값이 1이면 cmd의 명령을 실행하기 전에 웹 문서의 헤더가

출력되지 않았으면 자동으로 출력한다.

(5) flush_header의 값이 0 이면 cmd의 명령만 실행하며 웹 문서의 헤더를 자동

으로 출력하지 않는다. 헤더 출력에 앞서 이 함수를 호출하여야 할 경우에

또한 cmd를 실행하여 출력이 없을 때만 사용해야한다.

(6) result가 0이 아니면 에러가 발생한 경우이다.(이는 설명과 다를 수 있음)

4. 사용예

system("date"); // 시스템의 현재 날짜와 시간을 출력한다.

------------------------------ [ 출력결과 ] ------------------------------

Thu Aug  8 11:30:39 KST 2002

10.8.14  timeout()

1. 형식

형식1) result= timeout()

형식2) result= timeout(timeout_sec)

형식3) result= timeout(timeout_sec, timeout_message)

형식4) result= timeout(timeout_sec, timeout_message, flag)

2. 기능: 이 함수는 인자 timeout_sec초 이상의 시간이 경과되면 프로그램을 강제로

종료하거나 메시지를 주기적으로 출력한다.

3. 설명

(1) 인자 timeout_sec가 정수가 아니면 형변환된다.

(2) 인자 timeout_message가 문자열이 아니면 형변환된다.

(3) 인자 flag이 정수가 아니면 형변환된다.

(4) 인자 timeout_sec은 한계시간에 대한 초단위 값이다.

(5) 형식1)은 현재 설정된 timeout의 초단위 값을 읽기만 한다.

(6) 형식2)는 timeout시 Wel의 에러 메시지를 출력하고 프로그램이 종료된다.

(7) 형식3)은 timeout시 timeout_message를 출력하고 프로그램이 종료된다.

(8) 형식3)과 형식4)에서 timeout_message에 폼 매크로가 사용되었다면 확장한다.

(9) 형식4)에서 flag의 값이 0 이면 형식3)과 동일하다.

(10) 형식4)에서 flag의 값이 0보다 크면 timeout_message를 출력후 프로그램이

종료되지 않으며 timeout의 값이 timeout_sec로 재설정된다.

(11) 형식4)에서 flag의 값이 0보다 작으면 설명(10)과 동일하지만 표준 입력이

있을 때에도 timeout의 값이 timeout_sec로 재설정되는 차이점이 있다.

(12) 설정된 timeout을 해제하려면 timeout_sec의 값을 0으로 이 함수를 호출하면

된다. (즉 timeout(0); 과 같이 호출하면 됨)

(13) 설정된 timeout의 초단위 값이 result에 돌려진다.

4. 사용예

// timeout(5, "프로그램 실행시간이 5초를 초과했습니다!\n");

// for(i=1; i<=1000000; i++) ;

------------------------------ [ 출력결과 ] ------------------------------

10.9  부가기능 함수

10.9.1  array()

1. 형식: result= array(인자1, 인자2, ... , 인자N)

2. 기능: 인자1 부터 인자N까지를 요소로한 1차원 배열을 얻는다.

3. 설명

(1) 인자 없이 이 함수를 호출하면 에러처리된다.

(2) 이 함수에 전달되는 인자 개수의 제한은 없다.

(3) 인자의 수형은 형변환 없이 배열 요소로 기억된다.

(4) result는 자유형(free) 배열로 인자 개수의 요소를 지닌다.

(5) result[0]은 인자1의 값이다.

(6) 결과를 수용하는 result는 선언하지 않았거나 free형으로 선언되어야 한다.

4. 사용예

test= array(123, "ABC", 4.5);

print(test[0], " ", test[1], " ", test[2]);

------------------------------ [ 출력결과 ] ------------------------------

123 ABC 4.5

10.9.2  element()

1. 형식: result= element(variable)

2. 기능: 이 함수는 인자 variable의 요소 개수를 얻는다.

배열 요소의 총 개수를 구하고자 할 때 이 함수를 사용한다.

3. 설명

(1) 인자 variable가 상수이면 결과값은 1이 돌려진다.

(2) 인자 variable이 배열이 아니면 1이 돌려진다.

(3) 인자 variable이 배열이면 총 요소의 개수가 돌려진다.

(4) 인자 variable에 대한 요소의 총 개수가 result에 돌려진다.

4. 사용예

test= array("A", 123, "B", 45);

cnt= element(test);

print("배열 test는 test[0] 부터 test[", cnt-1, "]까지");

print(" 총 ", cnt, "개의 요소로 구성되어 있습니다.\n");

------------------------------ [ 출력결과 ] ------------------------------

배열 test는 test[0] 부터 test[3]까지 총 4개의 요소로 구성되어 있습니다.

10.9.3  fparser()

1. 형식

형식1) result= fparser(filename)

형식2) result= fparser(filename, break_flag)

2. 기능: 인자 filename의 Wel 프로그램 파일을 읽어서 실행한다.

3. 설명

(1) 인자 filename은 파일명(경로명 포함 가능)이며 수치이면 문자열로 변환된다.

(2) 인자 filename의 파일이 존재하지 않거나 메모리가 부족하면 에러가 발생한다.

(3) 인자 break_flag이 문자열이고 수치로 변환될 수 없을 때는 에러 처리된다.

(4) break_flag > 0  (양수인 경우) : 에러 메시지 출력후 중단됨

(5) break_flag==0   ( 0 인 경우 ) : 에러 메시지 출력후 계속 수행함

(6) break_flag < 0  (음수인 경우) : 에러 메시지 출력없이 계속 수행함

(7) result의 값은 filename의 프로그램에서 return한 값이며 return문 없이

filename의 프로그램이 종료되었다면 최후에 연산한 결과값이다.

4. 사용예

filename= helpdir ~ "temp/sample.sub";

fdump(filename); // sample.sub의 내용을 출력한다.

print("   ", strep("-",70), "\n");

rt= fparser(filename); // sample.sub의 내용을 실행한다.

printf("   Return value= %s\n", rt);

------------------------------ [ 출력결과 ] ------------------------------

// fparser 또는 include 도움말에 사용하는 file

print("   부 프로그램이 함수에 의해서 수행됩니다.\n");

return("HELLO");

----------------------------------------------------------------------

부 프로그램이 함수에 의해서 수행됩니다.

Return value= HELLO

10.9.4  header()

1. 형식: result= header(head_str)

2. 기능: 이 함수는 문서에 대한 헤더인 인자 head_str을 클라이언트에 전송할 수

있도록 하며 표준 출력함수(putchar(), print() 등)와 system() 함수에

앞서 사용해야하고 그렇지 않으면 head_str이 처리되지 않을 수 있다.

초기값으로 정해진 내용물 형식(Content-type)은 "text/html"으로 HTML

문서를 클라이언트에 전송하는 것을 알려주게 되는데 다른 문서 타입을

사용하려면 이 함수를 사용하여 인자로 전달하면 된다.

3. 설명

(1) 인자 head_str은 문자열이어야 하며 문자열이 아니면 형변환된다.

(2) 결과값 result는 0 또는 1 의 값을 지니며 그 값이 1 이면 헤더를 정상적으로

처리한 것을 의미한다.(비정상적인 헤더사용시 오류로 처리하지 않는다)

(3) 결과값 result가 0 이면 해당 프로그램을 웹상에서 실행하지 않거나 이미

문서의 내용물이 출력되었거나 쓸모가 없는 경우이며 경고 메시지가 출력

된다.

4. 사용예

fname= helpdir ~ "temp/sample.txt"; // 파일 다운받기 웹 프로그램 예제

header("Content-type: application/octet-stream");

header("Content-disposition: attachment; filename="~fname);

header("Pragma: no-cache\nExpires: 0");

fdump(fname);

------------------------------ [ 출력결과 ] ------------------------------

안녕하세요?

"문서화 및 웹 프로그래밍을 쉽고 편하고 빠르게"

이것이 Wel 프로그래밍의 모토(motto)이자 목표입니다.

10.9.5  htmldeltag()

1. 형식

형식1) result= htmldeltag(tag_str, length)

형식2) result= htmldeltag(tag_str, length, del_ctrlchar)

2. 기능: HTML tag를 포함한 문자열인 인자 tag_str에서 tag를 제거한 문자열을

length 바이트까지만 얻는다.

3. 설명

(1) 인자 tag_str은 문자열이며 수치이면 문자열로 변환된다.

(2) 인자 length나 del_ctrlchar가 문자열이고 수치로 변환될 수 없을 경우에는

에러가 발생한다.

(3) 인자 length는 HTML tag가 제거된 문자열의 최대 크기(바이트)이다.

(4) 형식1)은 제어문자(개행문자 포함)를 제거하며 형식2)는 del_ctrlchar의

값에 따라 제어문자의 제거여부가 결정된다.

(5) 인자 del_ctrlchar는 제어문자(개행문자 포함) 제거여부를 위한 값이며

0 이면 제거를 하지 않고 1이거나 기타의 값은 제거함을 의미한다.

(6) 제거대상은 일반적인 tag와 <HTML> tag로부터 <BODY> 사이의 내용과

주석(remark)을 의미하는 <!-- tag 부터 --> tag 까지의 내용이 제거된다.

비정상적인(tag 에러 포함) tag는 완벽하게 처리되지 않을 수 있으며

<script> tag와 </script> tag 사이에 주석 tag를 사용하지 않았다면

자바스크립트의 내용은 제거되지 않는다.

4. 사용예

tag= "<html><title>test</title><body bgcolor='#f0f080'>안녕하세요?</body>";

result= htmldeltag(tag, 128);

print(result);

------------------------------ [ 출력결과 ] ------------------------------

안녕하세요?

10.9.6  htmlquery()

1. 형식

형식1) result= htmlquery(query_str)

형식2) result= htmlquery(query_str, debug_file)

형식3) result= htmlquery(query_str, debug_file, upload_dir)

형식4) result= htmlquery(query_str, debug_file, upload_dir, overwrite_flag)

2. 기능: HTML query 형식의 문자열인 query_str을 해석하여 변수에 값을 대입한다.

대입되는 변수의 값은 모두 문자열로 처리된다.

( setlocal(ON) 이면 전역 변수, setlocal(OFF) 이면 지역 변수에 대입된다 )

3. 설명

(1) 함수에 전달하는 모든 인자는 문자열이며 수치이면 문자열로 변환된다.

(2) query_str의 값이 소대문자 구분 없이 "GET", "POST"이면 HTML문서의 form

tag에서 전달되는 query를 해석한다.  이때 "GET"과 "POST"는 form tag의

method와 같아야하며 웹 서버를 운영하고 있을때에만 처리될 수 있다.

(3) query_str의 값이 소대문자 구분 없이 "COOKIE"이면 클라이언트에서 전달

되는 쿠키(cookie)를 해석한다.  query_str이 "GET", "POST", "COOKIE"가

아니면  "변수1=값1&변수2=값2&...&변수N=값N" 형식의 문자열이어야 하며

이는 각각의 변수에 값이 대입되도록 해석한다.

(4) query_str이 HTML query 형식으로 인코딩되어 있어도 해석한다.

(5) debug_file은 query 해석 결과에 대한 분석 파일의 이름으로 경로명을

포함할 수 있으며, debug_file의 파일에는 분석된 query 변수와 총 개수를

저장하고 debug_file에 ".org"를 결합한 파일에는 전달된 query의 원본이

저장된다.  query의 전달에 이상이 있을 때 debugging 목적으로만 사용하는

것이 좋으며 작성한 프로그램을 정상 가동할 때에는 제거하는 것이 좋다.

(6) debug_file의 값이 널 스트링(Null string; 문자열의 길이가 0임, "")이면

debug 파일을 생성하지 않는다.

(7) upload_dir은 query_str이 "POST"일 때 (물론 HTML의 form tag의 method가

"POST"이어야 함) upload하는 파일이 있다면 그것을 저장할 경로명이다.

upload_dir이 생략된 상태에서 파일을 upload하면 "/tmp"에 저장된다.

(8) 형식4)에서 인자 overwrite_flag은 파일 업 로드시 동일파일이 이미 존재

할 경우에 겹쳐쓸것인지를 결정하는 것이며 생략하면 겹쳐쓰게 된다.

overwrite_flag= 1 -> 업로드 파일 중복시 겹쳐씀(초기값)

overwrite_flag= 0 -> 업로드 파일 중복시 (수치-파일명) 형식으로 저장함

(즉, 파일의 순번과 '-' 그리고 파일명 형식)

(9) 해석된 변수의 개수를 정수로 result에 되돌린다.

※ htmlquery("POST", "test.dbg") : HTML form tag의 method가 "POST"이며

query를 debugging하기위해 "test.dbg"와

"test.dbg.org"를 생성한다.

※ htmlquery("GET", "t.dbg") : HTML form tag의 method가 "GET"이며 query를

debugging하기위해 "t.dbg", "t.dbg.org" 생성

※ htmlquery("POST","","/work"); HTML form tag의 method가 "POST"이며 파일을

upload할 때 "/work"에 저장하도록 한다.

4. 사용예

result= htmlquery("name=홍길동&kor=100&eng=100&mat=90");

printf("   이름= %s, 국어= %s, 영어= %s, 수학= %s\n", name, kor, eng, mat);

print("   result= ", result);

------------------------------ [ 출력결과 ] ------------------------------

이름= 홍길동, 국어= 100, 영어= 100, 수학= 90

result= 4

10.9.7  include()

1. 형식

형식1) result= include(filename)

형식2) result= include(filename, break_flag)

2. 기능: 인자 filename의 Wel 프로그램 파일을 읽어서 실행한다. 이 함수는 내부적

으로 fparser()함수를 실행하기 때문에 fparser()함수와 같다.

3. 설명

(1) 인자 filename은 파일명(경로명 포함 가능)이며 수치이면 문자열로 변환된다.

(2) 인자 filename의 파일이 존재하지 않거나 메모리가 부족하면 에러가 발생한다.

(3) 인자 break_flag이 문자열이고 수치로 변환될 수 없을 때는 에러 처리된다.

(4) break_flag > 0  (양수인 경우) : 에러 메시지 출력후 중단됨

(5) break_flag==0   ( 0 인 경우 ) : 에러 메시지 출력후 계속 수행함

(6) break_flag < 0  (음수인 경우) : 에러 메시지 출력없이 계속 수행함

(7) result의 값은 filename의 프로그램에서 return한 값이며 return문 없이

filename의 프로그램이 종료되었다면 최후에 연산한 결과값이다.

4. 사용예

filename= helpdir ~ "temp/sample.sub";

fdump(filename); // sample.sub의 내용을 출력한다.

print("   ", strep("-",70), "\n");

rt= include(filename); // sample.sub의 내용을 포함하여 실행한다.

printf("   Return value= %s\n", rt);

------------------------------ [ 출력결과 ] ------------------------------

// fparser 또는 include 도움말에 사용하는 file

print("   부 프로그램이 함수에 의해서 수행됩니다.\n");

return("HELLO");

----------------------------------------------------------------------

부 프로그램이 함수에 의해서 수행됩니다.

Return value= HELLO

10.9.8  isarray()

1. 형식: result= isarray(variable)

2. 기능: 이 함수는 인자 variable의 배열 여부를 확인할 때 사용한다.  이 함수의

결과값이 0 이면 배열이 아니며 1 이면 1차원 배열, 2 이면 2차원 배열,

3 이면 3차원 배열임을 의미한다.

3. 설명

(1) 인자 variable가 상수이면 결과값은 0 이 돌려진다.

(2) 인자 variable이 배열이 아니면 0 이 돌려진다.

(3) 인자 variable이 배열이면 배열의 차원(1 부터 3 까지)이 돌려진다.

(4) 결과값 result는 0 부터 3 까지의 값을 지닌다.

4. 사용예

int a[3], b[2][2], c[2][3][4];

int d=100, object.num= 200;

print("   a= ", isarray(a), "  b= ", isarray(b), "  c= ", isarray(c),

"  d= ", isarray(d), "\n");

print("   object= ", isarray(object),

" object.num= ", isarray(object.num) ,"\n");

print("   d= ", d, " object.num= ", object.num, "\n");

------------------------------ [ 출력결과 ] ------------------------------

a= 1  b= 2  c= 3  d= 0

object= 0 object.num= 0

d= 100 object.num= 200

10.9.9  isobject()

1. 형식: result= isobject(variable)

2. 기능: 이 함수는 인자 variable의 객체(object) 여부를 확인할 때 사용한다.

이 함수의 결과값이 0 이면 객체가 아니며 1 이면 객체임을 의미한다.

3. 설명

(1) 인자 variable가 상수이면 결과값은 0 이 돌려진다.

(2) 인자 variable이 객체가 아니면 0 이 돌려진다.

(3) 인자 variable이 객체이면 1 이 돌려진다.

(4) 결과값 result는 0 또는 1 의 값을 지닌다.

4. 사용예

int a[3], b[2][2], c[2][3][4];

int d=100, object.num= 200;

print("   a= ", isobject(a), "  b= ", isobject(b), "  c= ", isobject(c),

"  d= ", isobject(d), "\n");

print("   object= ", isobject(object),

" object.num= ", isobject(object.num), "\n");

print("   d= ", d, " object.num= ", object.num, "\n");

------------------------------ [ 출력결과 ] ------------------------------

a= 0  b= 0  c= 0  d= 0

object= 1 object.num= 0

d= 100 object.num= 200

10.9.10  istype()

1. 형식: result= istype(variable)

2. 기능: 이 함수는 인자 variable의 자료형을 정수로 얻는다.

3. 설명

(1) 인자 variable의 자료형에 따라서 아래와 같이 결과값이 돌려진다.

기호 상수명        (10진수,16진수)           의미

------------------ --------------- ------------------------------------

TYPE_FREE          (  0 , 0x0)     free (자유형 변수)

TYPE_POINTER       ( 16 , 0x10)    pointer (포인터)

TYPE_FILEPTR       ( 17 , 0x11)    file pointer (파일 포인터)

TYPE_MSQLPTR       ( 24 , 0x18)    MSQL pointer

TYPE_MSQLRESPTR    ( 25 , 0x19)    MSQL result pointer

TYPE_MYSQLPTR      ( 26 , 0x1A)    MySQL pointer

TYPE_MYSQLRESPTR   ( 27 , 0x1B)    MySQL result pointer

TYPE_SOCKPTR       ( 28 , 0x1C)    socket pointer

TYPE_MAILPTR       ( 29 , 0x1D)    IMAP mail pointer

TYPE_OBJECT        ( 31 , 0x1F)    object pointer (객체)

TYPE_STRING        ( 32 , 0x20)    string (문자열)

TYPE_CHAR          ( 65 , 0x41)    char  (문자: 1byte)

TYPE_INT           ( 66 , 0x42)    int   (정수형: 2bytes)

TYPE_LONG          ( 68 , 0x44)    long  (장정도 정수형: 4bytes)

TYPE_FLOAT         (132 , 0x84)    float (단정도 실수형: 4bytes)

TYPE_DOUBLE        (136 , 0x88)    double(배정도 실수형: 8bytes)

------------------ --------------- ------------------------------------

4. 사용예

int a;

float b;

double c;

tname= array("자유형","포인터","문자열","","정수","","","","실수");

print("   a= ", istype(a), ",  b= ", istype(b), ",  c= ", istype(c), "\n");

print("   변수 b의 간략화된 자료형은 ", tname[istype(b)/16], "입니다.");

// 위의 tname[istype(b)/16] 은 tname[istype(b)>>4]와 같다.

------------------------------ [ 출력결과 ] ------------------------------

a= 66,  b= 132,  c= 136

변수 b의 간략화된 자료형은 실수입니다.

10.9.11  parser()

1. 형식

형식1) result= parser(str)

형식2) result= parser(str, break_flag)

2. 기능: 인자 str의 값을 Wel 프로그램으로 가정하여 그것을 실행한다.

원시 프로그램내의 문자열이나 기능성 문자열을 실행할 때 사용한다.

3. 설명

(1) 인자 str은 문자열이며 수치이면 문자열로 변환된다.

(2) break_flag이 문자열이고 수치로 변환될 수 없을 때는 에러 처리된다.

(3) break_flag>0  (양수인 경우) : 에러 메시지 출력후 중단됨

(4) break_flag==0 ( 0 인 경우 ) : 에러 메시지 출력후 계속 수행함

(5) break_flag<0  (음수인 경우) : 에러 메시지 출력없이 계속 수행함

(6) result의 값은 인자 str의 프로그램에서 return한 값이며 return문 없이

종료되었다면 최후에 연산한 결과값이다.

4. 사용예

statement= "if(a>b) return(a); else return(b);";

a= 1;

b= 2;

result= parser(statement);

result2= parser("5+3*4");

print(result, "    ", result2);

------------------------------ [ 출력결과 ] ------------------------------

2    17

10.9.12  queryencode()

1. 형식

형식1) result= queryencode(query_str)

형식2) result= queryencode(인자1, 인자2, ... , 인자N)

2. 기능: 인자 query_str을 HTML query(URL encoding)형식으로 인코딩(부호화)한

문자열을 얻는다. query를 URL encoding 방식으로 전달할 때 변수의

값에 있는 공백이나 몇몇 기호는 부호화되어야 하는데 이때 이 함수를

사용한다. setqueryencode()함수의 영향을 받으며 이로 인하여 부호화

방식이 달라진다.(setqueryencode()함수 참조)

3. 설명

(1) 인자 query_str은 문자열이며 수치이면 문자열로 변환된다.

(2) 인코딩(부호화)된 문자열이 result에 돌려진다.

(3) 인코딩되는 문자는 공백을 포함하여 !#$%^&()+=|\/?,><;:'"[]{}~` 이다.

(4) 형식1)은 setqueryencode(0) 일때 인자 query_str을 부호화한다.

(5) 형식2)는 setqueryencode(1) 일때 폼 매크로 변수의 값만 부호화하며 개방된

폼이 32 개를 초과하면 에러 처리된다.  이 함수의 인자를 이용하여  새로운

폼을 개방한 후 폐쇄하지 않았다면 함수가 종료될 때 모두 폐쇄된다.

4. 사용예

q1= "a&b#c 가12", q2= "a=1?b=2&c=3";

qstr1= " 12 + 3 & 4 ", qstr2= "x={$q1}&y={$q2}";

result1= queryencode(qstr1), result2= queryencode(qstr2);

setqueryencode(1);

result3= queryencode(qstr1), result4= queryencode(qstr2);

printf("   [%s] [%s]\n", result1, result2);

printf("   [%s] [%s]\n", result3, result4);

------------------------------ [ 출력결과 ] ------------------------------

[+12+%2B+3+%26+4+] [x%3D%7B%24q1%7D%26y%3D%7B%24q2%7D]

[ 12 + 3 & 4 ] [x=a%26b%23c+가12&y=a%3D1%3Fb%3D2%26c%3D3]

10.9.13  setcookie()

1. 형식

형식1) result= setcookie(name, value)

형식2) result= setcookie(name, value, expire)

형식3) result= setcookie(name, value, expire, path)

형식4) result= setcookie(name, value, expire, path, domain)

형식5) result= setcookie(name, value, expire, path, domain, secure)

2. 기능: 이 함수는 쿠키를 설정하도록 쿠키 테이터를 클라이언트로 전송하는 역할을

하며 표준 출력함수(putchar(), print() 등)와 system() 함수에 앞서 사용

해야 하며 그렇지 않으면 이 함수의 사용은 무효화된다.

3. 설명

(1) 쿠키란 클라이언트의 브라우저에 저장된 사용자 식별 데이터 등의 정보를

의미하며 이를 해당 서버에 접속할 때 클라이언트에서 서버로 전송하게 된다.

전송된 쿠키를 프로그램에서 얻기 위한 함수는 없으며 htmlquery("COOKIE")로

쿠키 정보를 얻는다.

(2) 인자 name은 문자열이어야 하며 쿠키 변수명이다.

(3) 인자 value는 문자열이어야 하며 쿠키 변수명의 값이다.

(4) 인자 expire는 정수이어야 하며 현재 시간으로부터 상대적인 초단위의 시간

으로 60 이면 1분 동안, 3600 은 1시간 동안 쿠키를 유지하며 지정된 시간이

지나면 쿠키 값은 사용되지 않는다. 이 인자를 생략되면 현재 웹 브라우저가

실행되는 동안만 쿠키가 적용된다.

(5) 인자 path는 문자열이어야 하며 path에 지정된 경로에 접속할 때 쿠키 정보를

전송할 수 있도록 한다. path와 domain이 생략되면 domain 사이트의 현재

디렉토리부터 그 하위 디렉토리에서 쿠키 정보가 적용된다.

(6) 인자 domain은 문자열이어야 하며 domain으로 지정된 곳에 접속할 때 쿠키

정보를 전송할 수 있도록 한다.

(7) 인자 secure는 정수이어야 하며 0 은 해당 인자를 생략한 것과 같고 1 또는

기타의 값이면 쿠키에 "secure"를 지정한다.  이것은 SSL을 사용하는 웹 서버

인 경우에 사용 가능하다.

(8) 결과값 result는 0 또는 1 의 값을 지니며 그 값이 1 이면 쿠키를 정상적으로

처리한 것을 의미한다.

(9) 결과값 result가 0 이면 해당 프로그램을 웹상에서 실행하지 않거나

이미 문서의 내용물이 출력되었거나 system()함수를 사용하여 쓸모가

없는 경우이며 경고 메시지가 출력된다.

4. 사용예

setcookie("id", "test"); // 쿠키를 웹 브라우저 종료까지 유지한다.

setcookie("pass", "test", 3600); // 쿠키를 1시간 동안 유지하도록 한다.

setcookie("var1", "123", NULL, "/abc"); // 만기시간은 설정되지 않음

setcookie("var1", "123",   "", "/abc"); // 만기시간을 0으로 설정함

------------------------------ [ 출력결과 ] ------------------------------

10.9.14  setlocal()

1. 형식

형식1) result= setlocal()

형식2) result= setlocal(local_flag)

2. 기능: 사용자 정의 함수내에서 전역 변수에 값을 대입(변경)하는 관련 함수에

대하여 지역 또는 전역 변수 참조 방식을 선택할 수 있도록 지정한다.

htmlquery(), listmerge(), msqlFetchGlobal(), mysql_fetch_global()

함수는 결과값과 각각 해석(처리)된 값이 전역 변수로 대입될 수 있으며

이와 같은 함수를 사용자 정의 함수내에서 사용할 때 전역 변수로 대입

되는 것을 사용자 정의 함수내에서만 사용되는 지역 변수로 대입되도록

변수 참조 방식을 지정할 수 있다.( setlocal()의 초기값은 0 이다 )

3. 설명

(1) 형식1)은 현재 설정된 값을 얻을 때 사용한다.

(2) 인자 local_flag이 0 일 때 즉, setlocal(0) 또는 setlocal(OFF) 이면

전역 변수만 참조한다.

(3) 인자 local_flag이 0 이 아닐 때 즉, setlocal(1) 또는 setlocal(ON) 이면

지역 변수 참조후 전역변수를 참조한다.

(4) 설정된 local_flag의 값( 0 또는 1 )이 result에 돌려진다.

4. 사용예

function test_setlocal(string str, int flag)

{

setlocal(flag);

htmlquery(str);

printf("   [사용자 정의 함수 내부] a=%d b=%d\n", a, b);

}

vfree a, b;

test_setlocal("a=2&b=3", ON);

printf("   [사용자 정의 함수 외부] a=%d b=%d\n", a, b);

vfree a, b;

test_setlocal("a=2&b=3", OFF);

printf("   [사용자 정의 함수 외부] a=%d b=%d\n", a, b);

------------------------------ [ 출력결과 ] ------------------------------

[사용자 정의 함수 내부] a=2 b=3

[사용자 정의 함수 외부] a=0 b=0

[사용자 정의 함수 내부] a=2 b=3

[사용자 정의 함수 외부] a=2 b=3

10.9.15  setqueryencode()

1. 형식

형식1) result= setqueryencode()

형식2) result= setqueryencode(mode)

형식3) result= setqueryencode(mode, hangle_flag)

2. 기능: 이 함수는 queryencode() 함수의 기능을 재설정하는 함수이며 형식1)은

현재 설정값을 얻기만하고 형식2)와 형식3)은 설정을 변경할 수 있다.

3. 설명

(1) 인자 mode나 hangle_flag이 문자열이고 수치로 변환될 수 있을 때는 수치로

변환되며 변환될 수 없을 때는 에러 처리된다.

(2) 인자 mode의 값이 0 이면 queryencode() 함수의 인자는 1개만 사용할 수 있고

인자의 값을 쿼리 스트링으로 부호화하고 폼 매크로는 확장되지 않는다.

(3) 인자 mode의 값이 1 또는 기타이면 queryencode() 함수의 인자의 개수는

제한이 없으며 인자의 값은 "변수1=값1&변수2=값2&...&변수N=값N"의 형식을

사용할 수 있으며, 인자의 값은 부호화하지 않고 인자에 사용된 폼 매크로

변수의 값만 부호화하여 확장한다.

(4) 인자 hangle_flag의 값이 0 이면 한글은 부호화하지 않으며 그 값이 1 또는

기타이면 한글도 부호화한다.

(5) setqueryencode() 함수를 호출하지 않고 queryencode()함수를 사용할 때는

mode와 hangle_flag의 초기값은 모두 0 이다.  즉, setqueryencode(0,0)이

초기값으로 설정되어 있다.

(6) 형식1)은 현재 설정된 mode와 hangle_flag의 값을 얻는다.( 설명 (7) 참조 )

(7) result는 설정된 값이 수치로 돌려지며 그 의미는 아래와 같다.

result의 값이 0 일때 - mode= 0           , hangul_flag= 0

result의 값이 1 일때 - mode= 0           , hangul_flag= 1 또는 기타

result의 값이 2 일때 - mode= 1 또는 기타 , hangul_flag= 0

result의 값이 3 일때 - mode= 1 또는 기타 , hangul_flag= 1 또는 기타

4. 사용예#1

q1= "test1=a&b#c!";

q2= "test2=가&test3=나 다";

setqueryencode(0, 0); // 폼 매크로 모드가 아니고 한글은 부호화하지 않음

result1= queryencode(q1);

result2= queryencode(q2);

printf("   [%s] [%s]\n", result1, result2);

setqueryencode(0, 1); // 폼 매크로 모드가 아니고 한글을 부호화함

result1= queryencode(q1);

result2= queryencode(q2);

printf("   [%s] [%s]\n", result1, result2);

------------------------------ [ 출력결과 ] ------------------------------

[test1%3Da%26b%23c%21] [test2%3D가%26test3%3D나+다]

[test1%3Da%26b%23c%21] [test2%3D%B0%A1%26test3%3D%B3%AA+%B4%D9]

5. 사용예#2

q1= "test1=a&b#c!";

q2= "test2=가&test3=나 다";

setqueryencode(1, 0); // 폼 매크로 모드이며 한글은 부호화하지 않음

result1= queryencode("a={$q1}&b={$q2}");

printf("   [%s]\n", result1);

qstr= "a={$q1}&b={$q2}";

result1= queryencode(qstr);

printf("   [%s]\n", result1);

setqueryencode(1, 1); // 폼 매크로 모드이며 한글을 부호화함

result1= queryencode("a={$q1}&", "b=", "{$q2}");

printf("   [%s]\n", result1);

------------------------------ [ 출력결과 ] ------------------------------

[a=test1%3Da%26b%23c%21&b=test2%3D가%26test3%3D나+다]

[a=test1%3Da%26b%23c%21&b=test2%3D가%26test3%3D나+다]

[a=test1%3Da%26b%23c%21&b=test2%3D%B0%A1%26test3%3D%B3%AA+%B4%D9]

10.9.16  setwel()

1. 형식

형식1) result= setwel(warning_flag)

형식2) result= setwel(warning_flag, pg_fullname_flag)

2. 기능: 이 함수는 wel의 에러나 경고 메시지 출력에 관련한 설정을 위한 것이다.

3. 설명

(1) 인자 warning_flag이 0 이면 경고 발생시 메시지를 출력하지 않는다.

(2) 인자 warning_flag이 0 외의 값이면 경고 발생시 메시지가 출력된다.

(3) 인자 pg_fullname_flag이 0 이면 에러 메시지 출력시 해당 프로그램의 이름을

경로명을 제외한 파일명만 출력한다.

(4) 인자 pg_fullname_flag이 0 외의 값이면 에러 메시지 출력시 해당 프로그램의

이름을 경로명을 포함하여 출력한다.

(5) 이 함수를 호출하지 않았을 때의 초기값은 setwel(1, 0) 이다.

(6) 항상 정수 1을 result에 되돌린다.

4. 사용예

setwel(ON, OFF); // 초기값으로 재설정, setwel(1, 0)과 같음

fp= fopen("/dev/null","r");

fclose(fp);

fclose(fp); // 경고 메시지가 출력된다.

setwel(0);

fp= fopen("/dev/null","r");

fclose(fp);

fclose(fp); // 이것의 경고 메시지는 출력되지 않는다.

------------------------------ [ 출력결과 ] ------------------------------

[Warning] 'parser()', line(4): fclose() 개방되지 않았거나 이미 폐쇄되었습니다.

11.  ANSI 코드 함수

11.1  cls()

1. 형식

형식1) result= cls()

형식2) result= cls(stx, sty, enx, eny)

2. 기능: 화면의 일부 또는 전부를 지운다.

3. 설명 (이 함수를 웹 상에서 사용하면 에러로 처리됩니다)

(1) 형식1)은 전체 화면을 지운다.

(2) 형식2)는 화면상의 stx, sty, enx, eny 범위를 지운다.

(3) 인자 stx는 가로좌표 시작점으로 1부터 80까지의 범위

(4) 인자 sty는 세로좌표 시작점으로 1부터 25까지의 범위

(5) 인자 enx는 가로좌표 끝점으로 1부터 80까지의 범위

(6) 인자 eny는 세로좌표 끝점으로 1부터 25까지의 범위

(7) 실행 결과값인 result는 항상 정수 1이다.

4. 사용예

vfree color; // 재 진입시 배열의 중복선언 방지

string color[5]= { "CLW", "CLY", "CLR", "CLG", "CLB", "CLC" };

c= 0;

str= NULL;

for(i=0; i<13; i++)

{

str~= parser(color[c]) ~ "Wesoft";

if(++c>5) c= 0;

}

for(i=1; i<17; i++) print(str, "\n");

cls(10,10,30,15);

cls(50,10,70,15);

------------------------------ [ 출력결과 ] ------------------------------

11.2  locate()

1. 형식: result= locate(x, y)

2. 기능: 커서의 위치를 x, y의 좌표로 이동시킨다.

3. 설명 (이 함수를 웹 상에서 사용하면 에러로 처리됩니다)

(1) 인자 x는 가로좌표, y는 세로 좌표이다.

(2) 가로좌표의 범위는 1 에서 80까지

(3) 세로좌표의 범위는 1 에서 25까지

(4) 실행 결과값인 result는 항상 정수 1이다.

4. 사용예

for(i=0; i<16; i++)

{

for(j=0; j<13; j++) print("Wesoft");

print();

}

cls(10,10,30,15);

cls(50,10,70,15);

locate(20,13); print("W");

locate(60,13); print("e");

------------------------------ [ 출력결과 ] ------------------------------

12.  File 및 Directory 관련 함수

12.1  File 입출력 함수

12.1.1  fclose()

1. 형식: result= fclose(fp)

2. 기능: 인자 fp에 해당하는 개방된 파일(file)을 폐쇄한다.

3. 설명

(1) 인자 fp는 파일 포인터이며 파일 개방시 얻은 값이어야 하고  파일 포인터가

아니면 에러 처리되며 이미 폐쇄된 파일 포인터일 때는 경고 메시지를 출력

하고 result에 -1의 값을 되돌린다.

(2) 실행 결과값 result는 정상 실행시 0, 실패시 -1(EOF)의 값을 갖는다.

4. 사용예

filename= helpdir ~ "temp/sample.txt"; // 도움말 디렉토리와 문자열 결합

fp= fopen(filename, "r");

if(fp==FILE_OPEN_ERR) // 또는 if(fp==NULL) 또는 if(!fp)

{

print("file open error!\n");

return;

}

getline= finput(fp);

print(getline);

fclose(fp);   // 파일 닫기

------------------------------ [ 출력결과 ] ------------------------------

안녕하세요?

12.1.2  fdump()

1. 형식

형식1) result= fdump(fp)

형식2) result= fdump(filename)

2. 기능: 파일의 내용을 빠른 속도로 표준 출력장치에 출력한다.

3. 설명

(1) 인자 fp는 파일 포인터이며 파일 개방시 얻은 값이어야 하고  파일 포인터가

아니면 에러 처리되며 이미 폐쇄된 파일 포인터일 때는 경고 메시지를 출력

하고 result에 -1의 값을 되돌린다.

(2) 형식1)은 파일의 현재위치로부터 파일의 끝까지 출력한다.

(3) 형식2)의 filename은 문자열로 파일의 이름이다.(경로명 포함 가능)

(4) 형식2)는 개방되지 않은 파일을 처음부터 끝까지 출력을 한다.

(5) result가 -1(EOF)이면 형식2)의 파일 개방시 에러 발생

(6) result의 값이 -1(EOF)이 아닐때에는 출력한 byte수이다.

4. 사용예

fdump(helpdir ~ "temp/sample.txt");

------------------------------ [ 출력결과 ] ------------------------------

안녕하세요?

"문서화 및 웹 프로그래밍을 쉽고 편하고 빠르게"

이것이 Wel 프로그래밍의 모토(motto)이자 목표입니다.

12.1.3  feof()

1. 형식: result= feof(fp)

2. 기능: 인자 fp 파일의 끝에 도달했는지를 검사하는 함수이다. flastch() 함수로도

파일의 끝을 검사할 수 있다.

3. 설명

(1) 인자 fp는 파일 포인터이며 파일 개방시 얻은 값이어야 하고  파일 포인터가

아니면 에러 처리되며 이미 폐쇄된 파일 포인터일 때는 경고 메시지를 출력

하고 result에 -1의 값을 되돌린다.

(2) result에는 파일의 끝을 검사한 결과가 정수로 돌려진다.

(3) result의 값이 0 이면 파일의 끝이 아님을 의미한다.

(4) result의 값이 0 이 아니면 파일의 끝임을 의미한다.

4. 사용예

filename= helpdir ~ "temp/sample.txt"; // 도움말 디렉토리와 문자열 결합

fp= fopen(filename, "r");

if(fp==FILE_OPEN_ERR) { print("file open error!\n"); return; }

while(1) // 무한 루프(Endless loop)

{

getline= finput(fp); // 한줄 단위로 읽는다.

if(feof(fp)) break;  // 파일의 끝이면 loop를 탈출한다.

print(getline, "\n");

}

fclose(fp);

------------------------------ [ 출력결과 ] ------------------------------

안녕하세요?

"문서화 및 웹 프로그래밍을 쉽고 편하고 빠르게"

이것이 Wel 프로그래밍의 모토(motto)이자 목표입니다.

12.1.4  fexist()

1. 형식: result= fexist(filename)

2. 기능: 인자 filename에 해당하는 파일 또는 디렉토리가 존재하는지를 검사한다.

3. 설명

(1) 인자 filename은 문자열로 파일의 이름이다.(경로명 포함 가능)

(2) 인자 filename이 수치일 때에는 문자열로 변환된다.

(3) result의 값은 정수 0 또는 1 중의 한 수이다.

(4) result가 0 이면 파일 또는 디렉토리가 존재하지 않는 경우이다.

(5) result가 1이면 파일 또는 디렉토리가 존재하는 경우이다.

4. 사용예

filename= helpdir ~ "temp/sample.txt"; // 도움말 디렉토리와 문자열 결합

rt= fexist(filename); // 파일의 존재 여부 검사

if(rt==1) print(filename, " 파일이 존재합니다.\n");

else print(filename, " 파일이 존재하지 않습니다.\n");

------------------------------ [ 출력결과 ] ------------------------------

./help/temp/sample.txt 파일이 존재합니다.

12.1.5  ffield()

1. 형식

형식1) result= ffield(fp)

형식2) result= ffield(fp, separator)

2. 기능: 인자 fp 파일에서 자료를 항목 단위로 읽어온다.

3. 설명

(1) 인자 fp는 파일 포인터이며 파일 개방시 얻은 값이어야 하고  파일 포인터가

아니면 에러 처리되며 이미 폐쇄된 파일 포인터일 때는 경고 메시지를 출력

하고 result에 -1의 값을 되돌린다.

(2) 형식1)은 항목과 항목의 구분문자가 ','와 개행문자('\n')이다.

(3) 형식2)의 2번째 인자인 separator는 문자열로써 항목과 항목의 분리 문자의

집합이다. 예를 들어 그 값이 ";/,"이면 이 3개의 문자로만 항목을 분리한다.

(4) 인자 fp 파일로부터 읽은 문자열이 result에 돌려진다.

4. 사용예

filename= helpdir ~ "temp/sample.txt"; // 도움말 디렉토리와 문자열 결합

fp= fopen(filename, "r");

if(fp==FILE_OPEN_ERR)

{

print("file open error!\n");

return;

}

for(i=1; i<=7; i++)

{

getline= ffield(fp," "); // 공백으로 분리된 항목을 읽음

print("   단어",i,"= ",getline, "\n");

}

fclose(fp);

------------------------------ [ 출력결과 ] ------------------------------

단어1= 안녕하세요?

단어2= 문서화 및 웹 프로그래밍을 쉽고 편하고 빠르게

단어3= 이것이

단어4= Wel

단어5= 프로그래밍의

단어6= 모토(motto)이자

단어7= 목표입니다.

12.1.6  fflush()

1. 형식: result= fflush(fp)

2. 기능: 인자 fp 파일을 출력하기 위해 개방했을 경우에 대부분 출력내용이 버퍼링

되었다가 파일에 기록되는데 현재까지 버퍼링된 것을 모두 파일에 저장하고

버퍼를 비워버리는 역할을 한다.

3. 설명

(1) 인자 fp는 파일 포인터이며 파일 개방시 얻은 값이어야 하고  파일 포인터가

아니면 에러 처리되며 이미 폐쇄된 파일 포인터일 때는 경고 메시지를 출력

하고 result에 -1의 값을 되돌린다.

(2) result는 성공하면 0, 실패시 -1(EOF)의 값을 갖는다.

12.1.7  finput()

1. 형식

형식1) result= finput(fp)

형식2) result= finput(fp, rbyte)

2. 기능: 인자 fp 파일에서 개행문자 또는 인자 rbyte 크기까지를 얻는다.

3. 설명

(1) 인자 fp는 파일 포인터이며 파일 개방시 얻은 값이어야 하고  파일 포인터가

아니면 에러 처리되며 이미 폐쇄된 파일 포인터일 때는 경고 메시지를 출력

하고 result에 -1의 값을 되돌린다.

(2) 형식1)은 개행문자('\n')까지 읽은 후 개행문자 전까지를 문자열로 되돌린다.

(3) 형식2)에서 인자 rbyte는 한번에 읽을 문자수이다.

(4) 이진파일은 '\0'문자 때문에 정상적으로 읽혀지지 않을 수도 있다.

(5) 인자 rbyte의 값은 -1보다 크고 512보다 작아야 한다.(그외는 에러 발생)

(6) 인자 rbyte의 값이 0 이면 파일에서 입력을 받지 않는다.

(7) 인자 fp 파일에서 입력을 받은 문자열이 result에 돌려진다.

4. 사용예

filename= helpdir ~ "temp/sample.txt"; // 도움말 디렉토리와 문자열 결합

fp= fopen(filename, "r");

if(fp==FILE_OPEN_ERR)

{

print("file open error!\n");

return;

}

getline= finput(fp, 11); // 11byte를 읽는다.

print(getline);

fclose(fp);

------------------------------ [ 출력결과 ] ------------------------------

안녕하세

12.1.8  flastch()

1. 형식: result= flastch()

2. 기능: 파일에서 입력을 받는 함수들은 읽혀진 내용중에서 최후의 문자를 기억

하게 되는데 이 함수는 이것을 읽어오는 역할을 한다.

3. 설명

(1) 파일에서 직접 문자를 읽는 것은 아니라 읽혀진 최후의 문자를 되돌린다.

(2) result는 읽혀진 최후의 문자 코드 값이다.(문자열이 아님)

(3) result의 값이 -1(EOF)이면 파일의 끝까지를 읽은 경우이다.

4. 사용예

filename= helpdir ~ "temp/sample.txt"; // 도움말 디렉토리와 문자열 결합

fp= fopen(filename, "r");

if(fp==FILE_OPEN_ERR) { print("file open error!\n"); return; }

while(1) // 무한 루프(Endless loop)

{

getline= finput(fp); // 한줄 단위로 읽는다.

lastchar= flastch();

print(getline, " --> 최후 문자 코드: ", lastchar, "\n");

if(lastchar==EOF) break; // 파일의 내용을 모두 읽었을 경우

}

fclose(fp);

------------------------------ [ 출력결과 ] ------------------------------

안녕하세요? --> 최후 문자 코드: 10

"문서화 및 웹 프로그래밍을 쉽고 편하고 빠르게" --> 최후 문자 코드: 10

이것이 Wel 프로그래밍의 모토(motto)이자 목표입니다. --> 최후 문자 코드: 10

--> 최후 문자 코드: -1

12.1.9  fopen()

1. 형식: fp= fopen(filename, mode)

2. 기능: 인자 filename 파일을 인자 mode 의 형태로 개방한다.

< 파일의 사용 절차 >

(1) fopen() 함수로 입력 또는 출력등의 모드로 파일을 개방 한다.

(2) 파일에 대하여 입력 또는 출력을 한다.

(3) fclose() 함수로 개방된 파일을 폐쇄한다.

3. 설명

(1) 인자 filename은 문자열로 파일의 이름이다.(경로명 포함 가능)

(2) 인자 filename이 수치일 때에는 문자열로 변환된다.

(3) 인자 mode가 문자열이 아니면 에러 처리된다.

(4) 결과값 fp는 개방된 파일의 포인터이거나 정수 0 이다.

(5) fp가 0(FILE_OPEN_ERR , NULL)이면 파일을 개방할 수 없는 경우이다.

(6) 인자 mode는 파일에 대한 개방 형태를 의미하며 아래와 같이 사용한다.

mode	파일 개방 형태
a	추가, 텍스트
ab	추가, 바이너리
a+	추가, 텍스트
ab+	추가, 바이너리
a+b	추가, 바이너리

mode	파일 개방 형태
r	읽기, 텍스트
rb	읽기, 바이너리
r+	갱신, 텍스트
rb+	갱신, 바이너리
r+b	갱신, 바이너리

mode	파일 개방 형태
w	기록, 텍스트
wb	기록, 바이너리
w+	갱신, 텍스트
wb+	갱신, 바이너리
w+b	갱신, 바이너리

12.1.10  fprint()

1. 형식

형식1) result= fprint(fp)

형식2) result= fprint(fp, 인자1, 인자2, ... , 인자N)

2. 기능: 인자 fp 파일에 문자열을 출력하는 역할을 한다.

3. 설명

(1) 인자 fp는 파일 포인터이며 파일 개방시 얻은 값이어야 하고  파일 포인터가

아니면 에러 처리되며 이미 폐쇄된 파일 포인터일 때는 경고 메시지를 출력

하고 result에 -1의 값을 되돌린다.

(2) 형식1)은 파일에 개행문자('\n')만을 출력한다. 즉, 줄을 바꿔준다.

(3) 형식2)는 인자들의 값을 파일에 출력한다. 출력 내용중에 개행문자가

없으면 줄바꿈을 하지 않는다.

(4) result의 값이 -1(EOF)이면 출력시 에러가 발생한 것이다.

(5) result의 값이 -1(EOF)이 아닐때에는 출력한 byte수이다.

4. 사용예

fp= fopen("/dev/null", "w"); // 파일을 쓰기 모드로 개방

if(fp==FILE_OPEN_ERR) // 또는 if(fp==NULL) 또는 if(!fp)

{

print("file open error!\n");

return;

}

for(i=1; i<=10; i++)

{

fprint(fp, "안녕하세요: ", i, "\n");

}

fclose(fp);

------------------------------ [ 출력결과 ] ------------------------------

12.1.11  fprintf()

1. 형식: result= fprintf(fp, 서식문자열, 인자3, ... , 인자N)

2. 기능: 인자 fp 파일에 서식문자열의 형태로 인자3 부터 인자N 까지를 출력한다.

3. 설명

(1) 인자 fp는 파일 포인터이며 파일 개방시 얻은 값이어야 하고  파일 포인터가

아니면 에러 처리되며 이미 폐쇄된 파일 포인터일 때는 경고 메시지를 출력

하고 result에 -1의 값을 되돌린다.

(2) 이 함수는 printf()함수처럼 표준출력으로 출력을 하지않고 해당 파일로

출력하는 것이 printf()함수와 다르다.

(3) result의 값이 -1(EOF)이면 출력시 에러가 발생한 것이다.

(4) result의 값이 -1(EOF)이 아닐때에는 출력한 byte수이다.

(5) 서식(format)의 종류 - printf()함수를 참고

(6) 서식(format)의 형식 - printf()함수를 참고

4. 사용예

fp= fopen("/dev/null", "w"); // 파일을 쓰기모드로 개방

if(fp==FILE_OPEN_ERR) // 또는 if(fp==NULL) 또는 if(!fp)

{

print("file open error!\n");

return;

}

fprintf(fp, "decimal=%d octal=%o hex=%x real=%f", 123,123,123,123.4);

fprintf(fp, "(%.3ld)(%#o)(%#X)(%09.4b)", 1234567,123,123,96);

fprintf(fp, "(%10.2f)(%10.1f)(%010.2f)(%-10.2f)", 5.67,5.67,5.67,5.67);

fprintf(fp, "%.3ld", 123456789);

fclose(fp);

------------------------------ [ 출력결과 ] ------------------------------

12.1.12  fputc()

1. 형식

형식1) result= fputc(fp, ch)

형식2) result= fputc(fp, ch, wcnt)

2. 기능: 인자 fp 파일에 한문자를 기록한다. ( '\0'문자도 기록됨 )

3. 설명

(1) 인자 fp는 파일 포인터이며 파일 개방시 얻은 값이어야 하고  파일 포인터가

아니면 에러 처리되며 이미 폐쇄된 파일 포인터일 때는 경고 메시지를 출력

하고 result에 -1의 값을 되돌린다.

(2) 인자 ch는 파일에 출력할 문자 코드이다.

(3) 형식2)에서 wcnt는 반복 출력할 문자수를 의미하며 0보다 작으면 에러이다.

(4) 형식2)에서 wcnt가 0 이면 파일에 출력을 하지 않는다.

(5) result의 값이 -1(EOF)이면 출력시 에러가 발생한 것이다.

(6) result의 값이 -1(EOF)가 아니면 출력한 문자의 코드값이다.

4. 사용예

char text[5]= {'W','e','s','o','f','t'}; // 1차원 배열을 0 에서 5 까지 확보

fp= fopen("/dev/null", "w");

if(fp==FILE_OPEN_ERR) { print("file open error!\n"); return; }

for(i=0; i<=5; i++)

{

result= fputc(fp, text[i]);

if(result==EOF) { print("쓰기실패\n"); return; }

}

fclose(fp);

------------------------------ [ 출력결과 ] ------------------------------

12.1.13  fseek()

1. 형식: result= fseek(fp, pos, mode)

2. 기능: 인자 fp 파일의 현재 위치를 변경한다.

3. 설명

(1) 인자 fp는 파일 포인터이며 파일 개방시 얻은 값이어야 하고  파일 포인터가

아니면 에러 처리되며 이미 폐쇄된 파일 포인터일 때는 경고 메시지를 출력

하고 result에 -1의 값을 되돌린다.

(2) 인자 pos와 mode의 값이 실수이면 소수아래는 절삭한다.

(3) 인자 pos와 mode가 문자열이고 수치로 변환될 수 없을 때는 에러가 발생한다.

(4) 인자 pos는 이동할 파일의 위치이다.

(5) 인자 mode의 값이 0(SEEK_SET)이면 파일의 처음 위치로부터 pos로 이동된다.

(6) 인자 mode의 값이 1(SEEK_CUR)이면 파일의 현재 위치로부터 pos로 이동된다.

(7) 인자 mode의 값이 2(SEEK_END)이면 파일의 마지막 위치로부터 pos로 이동된다.

(8) result의 값이 0 이면 정상적으로 수행을 한 경우이다.

(9) result의 값이 0 이 아니면 파일의 위치를 변경하지 못한 경우이다.

4. 사용예

filename= helpdir ~ "temp/sample.txt"; // 도움말 디렉토리와 문자열 결합

fp= fopen(filename, "r");

if(fp==FILE_OPEN_ERR) { print("file open error!\n"); return; }

fseek(fp, 15, SEEK_SET); // 파일의 처음부터 16byte 위치로 이동

// 인자 pos의 값이 0 이면 파일의 처음 위치로 이동함

getline= finput(fp); // 한 줄 읽기

print(getline, "\n");

fclose(fp);

------------------------------ [ 출력결과 ] ------------------------------

"문서화 및 웹 프로그래밍을 쉽고 편하고 빠르게"

12.1.14  fsizeof()

1. 형식: result= fsizeof(filename)

2. 기능: 인자 filename의 파일의 크기(byte)를 얻어온다.

3. 설명

(1) 인자 filename은 문자열로 파일의 이름이다.(경로명 포함 가능)

(2) 인자 filename의 크기에 대한 수치값이 result에 돌려진다.

(3) result의 값이 -1(ERROR)이면 에러가 발생된 경우이다.

4. 사용예

filename= helpdir ~ "temp/sample.txt"; // 도움말 디렉토리와 문자열 결합

size= fsizeof(filename);

print("sample.txt는 ", size, "bytes입니다.");

------------------------------ [ 출력결과 ] ------------------------------

sample.txt는 120bytes입니다.

12.1.15  ftell()

1. 형식: result= ftell(fp)

2. 기능: 인자 fp 파일의 현재 위치를 얻는다.

3. 설명

(1) 인자 fp는 파일 포인터이며 파일 개방시 얻은 값이어야 하고  파일 포인터가

아니면 에러 처리되며 이미 폐쇄된 파일 포인터일 때는 경고 메시지를 출력

하고 result에 -1의 값을 되돌린다.

(2) 파일의 위치가 result에 돌려지며 최초 위치의 값은 정수 0 이다.

(3) result의 값이 -1이면 에러가 발생한 경우이다.

4. 사용예

filename= helpdir ~ "temp/sample.txt"; // 도움말 디렉토리와 문자열 결합

fp= fopen(filename, "r");

if(fp==FILE_OPEN_ERR) { print("file open error!\n"); return; }

getline= finput(fp);

pos= ftell(fp); // 파일의 현재위치를 얻어온다.

print("   파일로부터 읽은 내용: ", getline, "\n");

print("   파일의 현재 위치: ", pos, "\n");

fclose(fp);

------------------------------ [ 출력결과 ] ------------------------------

파일로부터 읽은 내용:    안녕하세요?

파일의 현재 위치: 15

12.1.16  pclose()

1. 형식: result= pclose(fp)

2. 기능: popen() 함수로 개방한 파이프를 닫는다.

3. 설명

(1) 인자 fp는 파이프에 대한 파일 포인터이며 파이프 개방시 얻은 값이어야 하고

파일 포인터가 아니면 에러 처리되며 이미 폐쇄된 파일 포인터일 때는 경고

메시지를 출력하고 result에 -1의 값을 되돌린다.

(2) 실행 결과값 result는 정상 실행시 0, 실패시 -1(EOF)의 값을 갖는다.

4. 사용예

filename= helpdir ~ "temp/pipe.wel";

fp= popen(filename, "r"); // 파이프를 읽기 모드로 개방함

if(fp==FILE_OPEN_ERR) // 또는 if(fp==NULL) 또는 if(!fp)

{

print("pipe open error!");

print();

return;

}

getline= finput(fp);

print(getline);

pclose(fp);

------------------------------ [ 출력결과 ] ------------------------------

파이프 시험중입니다.

12.1.17  popen()

1. 형식: fp= popen(filename, mode)

2. 기능: filename의 실행파일을 실행하고 파이프(pipe)를 mode의 형태로 개방한다.

※ 파이프(pipe): 프로세스를 다른 프로세스에 연결시켜주는 일방통행의

통신채널로 한 프로세스의 표준 출력을 다른 프로세스의

표준 입력으로 읽어온다.

3. 설명

(1) 인자 filename과 mode의 세부 설명은 fopen() 함수와 동일하다.

(2) 인자 filename은 문자열로 실행파일의 이름이다.(경로명 포함 가능)

(3) 인자 filename이 수치일 때에는 문자열로 변환된다.

(4) 인자 mode가 문자열이 아니면 에러 처리된다.

(5) 결과값 fp는 개방된 파일의 포인터이거나 정수 0 이다.

(6) fp가 0(FILE_OPEN_ERR , NULL)이면 파일 개방시 에러가 발생한 것이다.

4. 사용예

filename= helpdir ~ "temp/pipe.wel";

fp= popen(filename, "r"); // 파이프를 읽기 모드로 개방함

if(fp==FILE_OPEN_ERR) // 또는 if(fp==NULL) 또는 if(!fp)

{

print("pipe open error!\n");

return;

}

getline= finput(fp);

print(getline);

pclose(fp);

------------------------------ [ 출력결과 ] ------------------------------

파이프 시험중입니다.

12.1.18  rename()

1. 형식: result= rename(OldFileName, NewFileName)

2. 기능: 인자 OldFileName 파일을 인자 NewFileName 파일로 파일명을 변경한다.

3. 설명

(1) 인자 OldFileName과 NewFileName은 문자열이며 수치이면 문자열로 변환된다.

(2) 인자 OldFileName과 NewFileName은 파일명으로 wild card ("*" 이나 "?")를

대표문자로 인식하지 않고 파일 이름으로 처리한다.

(3) result의 값이 정수 0 이면 정상적으로 처리한 경우이다.

(4) result의 값이 정수 -1(EOF)이면 에러가 발생한 것이다.

4. 사용예

// 아래의 예제는 주석 처리되어 있습니다.

// rt= rename("test", "test2"); // test파일을 test2로 이름을 변경

// if(rt==0) print("test를 test2로 변경했습니다!\n");

//   else print("에러가 발생하여 파일명을 변경하지 못했습니다!\n");

------------------------------ [ 출력결과 ] ------------------------------

12.1.19  unlink()

1. 형식: result= unlink(filename)

2. 기능: 인자 filename의 파일을 삭제한다.

3. 설명

(1) 인자 filename은 문자열이며 수치이면 문자열로 변환된다.

(2) 인자 filename은 파일 이름으로 wild card ("*" 이나 "?")를 대표문자로

인식하지 않고 파일 이름으로 처리한다.

(3) result의 값이 정수 0 이면 정상적으로 처리한 경우이다.

(4) result의 값이 정수 -1(EOF)이면 에러가 발생한 것이다.

4. 사용예

// 아래의 예제는 주석 처리되어 있습니다.

// rt= unlink("test");

// if(rt==0) print("test 파일을 삭제했습니다!\n");

//   else print("test 파일이 없거나 에러가 발생했습니다!\n");

------------------------------ [ 출력결과 ] ------------------------------

12.2  Directory 관련 함수

12.2.1  chdir()

1. 형식: result= chdir(dirname)

2. 기능: 현재 작업중인 디렉토리를 인자 dirname명의 디렉토리로 이동한다.

3. 설명

(1) 인자 dirname은 문자열이며 수치이면 문자열로 변환된다.

(2) 인자 dirname은 디렉토리 이름으로 wild card ("*" 이나 "?")를 대표문자로

인식하지 않고 디렉토리 이름으로 처리한다.

(3) result의 값이 정수 0 이면 정상적으로 처리한 경우이다.

(4) result의 값이 정수 -1(ERROR)이면 에러가 발생한 것이다.

4. 사용예

// 아래의 예제는 주석 처리되어 있습니다.

// rt= chdir("test");

// if(rt==ERROR) print("test 디렉토리가 없거나 에러가 발생했습니다!\n");

//  else print("test 하위 디렉토리로 이동했습니다!\n");

// print("현재 디렉토리: ", getcwd(), "\n");

------------------------------ [ 출력결과 ] ------------------------------

12.2.2  getcwd()

1. 형식: result= getcwd()

2. 기능: 현재 작업중인 디렉토리에 대한 절대경로를 문자열로 얻는다.

3. 설명

(1) 이 함수는 인자를 사용할 수 없다.

(2) 현재 디렉토리에 대한 절대경로명의 문자열이 result에 돌려진다.

4. 사용예

cur_dir= getcwd();

print("현재 디렉토리: ", cur_dir);

------------------------------ [ 출력결과 ] ------------------------------

현재 디렉토리: /home/httpd/cgi-pub/makehelp

12.2.3  mkdir()

1. 형식

형식1) result= mkdir(dirname)

형식2) result= mkdir(dirname, permission_mode)

2. 기능: 인자 dirname명의 디렉토리를 생성한다.

3. 설명

(1) 인자 dirname은 문자열이며 수치이면 문자열로 변환된다.

(2) 인자 dirname은 디렉토리 이름으로 wild card ("*" 이나 "?")를 대표문자로

인식하지 않고 디렉토리 이름으로 처리한다.

(3) 형식2)에서 permission_mode는 정수이며 정수가 아니면 형변환된다.

(4) permission_mode가 문자열이고 수치로 변환될 수 없을 때는 에러 처리된다.

(5) 형식1)은 허가모드가 8진수로 755가 되며 형식2)는 임의로 지정할 수 있다.

(6) result의 값이 정수 0 이면 정상적으로 처리한 경우이다.

(7) result의 값이 정수 -1(ERROR)이면 에러가 발생한 것이다.

4. 사용예

dir= helpdir ~ "test"; // 시험용 디렉토리명

// rt= mkdir(dir); 은 rt= mkdir(dir, 0c755)와 같다

rt= mkdir(dir, 0c700); // 디렉토리 생성(허가모드: rwx------)

if(rt==ERROR) print(dir, " 디렉토리가 이미 있거나 에러가 발생했습니다!\n");

else print(dir, " 디렉토리를 생성했습니다!\n");

rmdir(dir); // 시험용 디렉토리 삭제

------------------------------ [ 출력결과 ] ------------------------------

./help/test 디렉토리를 생성했습니다!

12.2.4  rmdir()

1. 형식: result= rmdir(dirname)

2. 기능: 인자 dirname명의 디렉토리를 삭제한다.

3. 설명

(1) 인자 dirname은 문자열이며 수치이면 문자열로 변환된다.

(2) 인자 dirname은 디렉토리 이름으로 wild card ("*" 이나 "?")를 대표문자로

인식 하지 않고 디렉토리 이름으로 처리한다.

(3) result의 값이 정수 0 이면 정상적으로 처리한 경우이다.

(4) result의 값이 정수 -1(ERROR)이면 에러가 발생한 것이다.

4. 사용예

dir= helpdir ~ "test"; // 시험용 디렉토리명

mkdir(dir); // 시험용 디렉토리 생성

rt= rmdir(dir); // 시험용 디렉토리 삭제

if(rt==ERROR) print(dir, " 디렉토리가 없거나 에러가 발생했습니다!\n");

else print(dir, " 디렉토리를 삭제했습니다!\n");

------------------------------ [ 출력결과 ] ------------------------------

./help/test 디렉토리를 삭제했습니다!

12.3  File 과 Directory 관련 함수

12.3.1  chmod()

1. 형식: result= chmod(name, permission_mode)

2. 기능: 인자 name의 파일 또는 디렉토리를 인자 permission_mode로 허가 모드를

변경한다.

3. 설명

(1) 인자 name은 문자열이며 수치이면 문자열로 변환된다.

(2) 인자 name은 파일 또는 디렉토리 이름으로 wild card ("*" 이나 "?")를

대표문자로 인식하지 않고 파일 또는 디렉토리 이름으로 처리한다.

(3) 인자 permission_mode는 정수이며 정수가 아니면 형변환된다.

(4) 인자 permission_mode가 문자열이고 수치로 변환될 수 없을 때는

에러 처리된다.

(5) result의 값이 정수 0 이면 정상적으로 처리한 경우이다.

(6) result의 값이 정수 -1(ERROR)이면 에러가 발생한 것이다.

(7) 허가 모드에 대하여

- UNIX 또는 Linux는 모든 파일을 소유주(Owner), 그룹(Group), 기타(Other)

사용자로 구분하여 서로 다른 접근 허가를 지정할 수 있다. 예를 들어서

chmod("test", 0c750)라 설정한다면 8진수 0c750는 2진수로 111 101 000

이고 이때 각 2진수의 1은 허가, 0은 불허이며 아래와 같은 의미이다.

1  1  1   1  0  1   0  0  0   test

r  w  x   r  w  x   r  w  x

-------   -------   -------   ls명령의 표시형식: rwxr-x---

소유주    그룹      기타                (r: 읽기, w: 쓰기, x: 실행)

test라는 파일의 주인(소유주)은 읽기(r), 쓰기(w), 실행(x)가 모두 가능

하고 소유주가 속한 그룹의 사용자는 읽기,실행만 가능(쓰기 및 삭제 불능)

하며 그 외의 기타 사용자는 읽기,쓰기,실행이 모두 금지된다.

4. 사용예

// 아래의 예제는 주석 처리되어 있습니다.

// rt= chmod("test", 0c700);

// if(rt==ERROR) print("test가 없거나 에러가 발생했습니다!\n");

//  else print("test의 허가 모드를 변경했습니다!\n");

------------------------------ [ 출력결과 ] ------------------------------

12.3.2  getmod()

1. 형식: permission_mode= getmod(name)

2. 기능: 인자 name의 파일 또는 디렉토리에 대한 허가 모드를 얻는다.

3. 설명

(1) 인자 name은 문자열이며 수치이면 문자열로 변환된다.

(2) 인자 name은 파일 또는 디렉토리 이름으로 wild card ("*" 이나 "?")를

대표문자로 인식하지 않고 파일 또는 디렉토리 이름으로 처리한다.

(3) permission_mode의 값이 정수 -1(ERROR)이면 에러가 발생한 것이다.

(4) permission_mode의 값이 정수 -1(ERROR)이 아니면 인자 name의 파일 또는

디렉토리에 대한 허가 모드이다.

(5) 허가 모드에 대하여

- UNIX 또는 Linux는 모든 파일을 소유주(Owner), 그룹(Group), 기타(Other)

사용자로 구분하여 서로 다른 접근 허가를 지정할 수 있다. 예를 들어서

chmod("test", 0c750)라 설정한다면 8진수 0c750는 2진수로 111 101 000

이고 이때 각 2진수의 1은 허가, 0은 불허이며 아래와 같은 의미이다.

1  1  1   1  0  1   0  0  0   test

r  w  x   r  w  x   r  w  x

-------   -------   -------   ls명령의 표시형식: rwxr-x---

소유주    그룹      기타                (r: 읽기, w: 쓰기, x: 실행)

test라는 파일의 주인(소유주)은 읽기(r), 쓰기(w), 실행(x)가 모두 가능

하고 소유주가 속한 그룹의 사용자는 읽기,실행만 가능(쓰기 및 삭제 불능)

하며 그 외의 기타 사용자는 읽기,쓰기,실행이 모두 금지된다.

4. 사용예

mode= getmod("/bin");

if(mode==ERROR) // 또는 if(mode==-1)

{

print("/bin이 없거나 에러가 발생했습니다!\n");

}

else

{

print("/bin의 허가모드는 ",mode,"(8진수: 0c", oct(mode), ")입니다.\n");

}

------------------------------ [ 출력결과 ] ------------------------------

/bin의 허가모드는 493(8진수: 0c755)입니다.

12.3.3  isdir()

1. 형식: result= isdir(name)

2. 기능: 이 함수는 인자 name이 디렉토리인지를 검사할 때 사용한다.

3. 설명

(1) 인자 name은 문자열이며 수치이면 문자열로 변환된다.

(2) 인자 name은 파일 또는 디렉토리 이름으로 wild card ("*" 이나 "?")를

대표문자로 인식하지 않고 파일 또는 디렉토리 이름으로 처리한다.

(3) result의 값이 정수 -1(ERROR)이면 에러가 발생한 것이다.

(4) result의 값이 정수 1 이면 인자 name은 디렉토리이다.

(5) result의 값이 정수 0 이면 인자 name은 파일이다.

4. 사용예

rt= isdir("/bin");

if(rt==ERROR) print("/bin이 없거나 에러가 발생했습니다!\n");

else if(rt==1) print("/bin은 디렉토리입니다.\n");

else print("/bin은 파일입니다.\n");

------------------------------ [ 출력결과 ] ------------------------------

/bin은 디렉토리입니다.

13.  Form macro 함수

13.1  formclose()

1. 형식: result= formclose()

2. 기능: formopen()에 의해 개방된 폼 중에서 최후의 폼을 닫는다.

3. 설명

(1) 폼은 최대 32개까지 개방될 수 있으며 이들중 최후의 한 폼만 폐쇄된다.

(2) result는 정수 0 또는 1 의 값을 갖는다.

(3) result의 값이 정수 0 이면 개방된 폼이 없는 경우이다.

(4) result의 값이 정수 1 이면 성공적으로 폼을 폐쇄한 경우이다.

4. 사용예

제목="1999년 11월 정기모임";

날짜="11월10일", 장소="먹자갈비", 보낸이="웰동호회 회장";

이름="홍길동", 회비="10,000", FORM_CNT= 0;

formname= helpdir ~ "temp/test.fom";

rtcode= formopen(formname);

if(rtcode!=FORM_NOERR)

{

print("form file open error!\n");

return;

}

formdump();

formclose();   // 최후에 개방된 폼을 닫는다.

------------------------------ [ 출력결과 ] ------------------------------

□□□□□□□□□□□□□□□□□

□     1999년 11월 정기모임     □

□□□□□□□□□□□□□□□□□

□     홍길동님 안녕하십니까?   □

□                              □

□  이번 모임은 11월10일 입니다 □

□모임 장소는 먹자갈비이고      □

□    홍길동님이 납입할 회비는  □

□일금 10,000원입니다.          □

□                              □

□                              □

□           웰동호회 회장드림  □

□                No. 1         □

□□□□□□□□□□□□□□□□□

13.2  formdump()

1. 형식

형식1) result= formdump()

형식2) result= formdump(filename)

형식3) result= formdump(NULL, str)

2. 기능: 형식1)은 formopen()을 사용하여 이미 개방된 폼을 현재 위치로부터

끝까지 표준 출력장치로 출력하며 형식2)는 인자 filename의 폼을 처음부터

끝까지 출력하고 형식3)은 인자 str 의 문자열을 폼으로 출력한다.

(폼의 내용중에서 잘못된 폼 매크로가 사용되었다면 에러 처리된다)

3. 설명

(1) 형식1)은 formopen()을 사용하여 이미 개방된 폼을 출력한다.

(2) 형식2)는 현재 개방된 폼과는 무관하게 지정한 파일의 폼을 출력한다.

(3) 형식2)의 인자 filename은 출력할 폼의 파일명으로 문자열이어야 하며

문자열이 아니면 형변환된다.

(4) 형식3)의 인자 str은 문자열의 폼을 출력하기 위한 것이며 문자열이 아니면

문자열로 형변환된다.

(5) 형식3)에서 첫번째 인자는 사용되지 않는다.

(6) 형식3)에서 개방된 폼이 32 개를 초과하면 에러 처리된다.

(7) 폼 매크로 변수의 값은 확장된 후 출력된다.

(8) 폼의 제어 명령어 중에서 stop 명령어는 무시한다.

(9) endrep 명령어는 최소 반복횟수만큼 반복후 탈출한다.

(10) end명령을 처리했거나 폼의 마지막까지 처리한 상태에서 이 함수를 실행하게

되면 아무런 출력을 하지 않는다.

(11) result의 값은 폼의 반복횟수이다.

(12) 형식2)에서 result에 0 보다 작은 값(음수)이 돌려지면 formopen()함수와

같은 의미의 오류가 발생한 경우이다(formopen() 함수 참고)

(13) result의 값이 정수 0 이면 폼을 출력하지 못한 경우이다.

(14) result의 값이 1 이면 폼을 1 회 출력한 경우이다.

(15) 폼에 endrep , stop명령이 있다면 그 개수도 result의 값에 포함된다.

4. 사용예

제목="1999년 11월 정기모임";

날짜="11월10일", 장소="먹자갈비", 보낸이="웰동호회 회장";

이름="홍길동", 회비="10,000", FORM_CNT= 0;

formdump(helpdir ~ "temp/test.fom");

------------------------------ [ 출력결과 ] ------------------------------

□□□□□□□□□□□□□□□□□

□     1999년 11월 정기모임     □

□□□□□□□□□□□□□□□□□

□     홍길동님 안녕하십니까?   □

□                              □

□  이번 모임은 11월10일 입니다 □

□모임 장소는 먹자갈비이고      □

□    홍길동님이 납입할 회비는  □

□일금 10,000원입니다.          □

□                              □

□                              □

□           웰동호회 회장드림  □

□                No. 1         □

□□□□□□□□□□□□□□□□□

13.3  formgoto()

1. 형식: result= formgoto(label)

2. 기능: 개방된 폼의 현재 위치를 인자 label의 위치로 이동한다.  만일 label을

찾지 못했다면 현재 위치는 변경되지 않는다.

3. 설명

(1) 이 함수를 사용하기 전에 반드시 formopen()을 해야한다.

(2) 인자 label은 문자열로 레이블 매크로의 레이블명이다.

(3) 레이블명의 영문 소문자와 대문자는 서로 다른 것으로 취급된다.

(4) result는 정수 0 또는 1 의 값을 갖는다.

(5) result의 값이 정수 0 이면 폼에서 label을 찾지 못한 경우이다.

(6) result의 값이 정수 1 이면 폼의 현재 위치를 label로 옮긴 경우이다.

4. 사용예

제목="1999년 11월 정기모임";

날짜="11월10일", 장소="먹자갈비", 보낸이="웰동호회 회장";

이름="홍길동", 회비="10,000", FORM_CNT= 0;

formname= helpdir ~ "temp/test.fom";

rtcode= formopen(formname);

if(rtcode!=FORM_NOERR)

{

print("form file open error!\n");

return;

}

formgoto("TAIL"); // 폼의 {:TAIL} 레이블로 이동함

formdump();

formclose();   // 최후에 개방된 폼을 닫는다.

------------------------------ [ 출력결과 ] ------------------------------

□                No. 0         □

□□□□□□□□□□□□□□□□□

13.4  formmerge()

1. 형식: result= formmerge(depth)

2. 기능: formopen()을 사용하여 이미 개방된 폼의 내용을 현재 위치로부터 표준

출력장치로 출력하는 것은 formdump()와 동일하지만 폼을 보다 더 정밀

하게 수동적으로 제어를 할 수 있는 차이점이 있다.

(폼의 내용중에서 잘못된 폼 매크로가 사용되었다면 에러 처리된다)

3. 설명

(1) 이 함수를 사용하기 전에 반드시 formopen()을 해야한다.

(2) 인자 depth의 값은 0 보다 크거나 같아야 한다.(0보다 작으면 에러 처리됨)

(3) 폼의 내용에 명령어 매크로 중에서 반복을 의미하는 repeat과 endrep이

없을 경우에 depth의 값은 의미가 없고 반복 명령이 단계적으로 중첩이

되어 있다면 depth는 중첩 부분을 탈출하는 깊이(수)의 값이 된다.

(4) 폼의 제어 명령어 중에서 stop 명령을 처리하게 되면 이 함수는 종료되며

다시 formmerge()를 수행하면 stop 명령의 다음 위치부터 처리한다.

(5) endrep명령을 처리하게 되면 그 위치에서 종료되며 다시 formmerge()를 수행

하면 repeat명령어 다음 위치부터 endrep명령어 사이를 반복 후 종료한다.

이때 formmerge(0)을 계속하게 되면 반복 부분을 영원히 탈출할 수 없으며

formmerge(1)을 해야만 탈출을 할 수 있다.  만일 반복 부분이 이중으로

중첩되어 있을 때 전체 중첩 부분을 탈출하려면 formmerge(2)로 해야한다.

(6) end명령을 처리했거나 폼의 마지막까지 처리한 상태에서 이 함수를 실행하게

되면 아무런 출력을 하지 않는다.

(7) result의 값은 폼의 현재 상태이며 정수 -1, -2, -3 중의 한 수이다.

(8) result가 -1 이면 폼의 끝까지 출력했거나 end명령을 실행한 경우이다.

(9) result가 -2 이면 stop 명령에 의해 종료된 경우이다.

(10) result가 -3 이면 endrep 명령에 의해 종료된 경우이다.

4. 사용예

제목="1999년 11월 정기모임";

날짜="11월10일", 장소="먹자갈비", 보낸이="웰동호회 회장";

이름="홍길동", 회비="10,000", FORM_CNT= 0;

formname= helpdir ~ "temp/test.fom";

rtcode= formopen(formname);

if(rtcode!=FORM_NOERR)

{

print("form file open error!\n");

print();

return;

}

formmerge(0);

formclose();   // 최후에 개방된 폼을 닫는다.

------------------------------ [ 출력결과 ] ------------------------------

□□□□□□□□□□□□□□□□□

□     1999년 11월 정기모임     □

□□□□□□□□□□□□□□□□□

□     홍길동님 안녕하십니까?   □

□                              □

□  이번 모임은 11월10일 입니다 □

□모임 장소는 먹자갈비이고      □

□    홍길동님이 납입할 회비는  □

□일금 10,000원입니다.          □

□                              □

□                              □

□           웰동호회 회장드림  □

□                No. 1         □

□□□□□□□□□□□□□□□□□

13.5  formopen()

1. 형식

형식1) result= formopen(formname)

형식2) result= formopen(NULL, str)

2. 기능: 형식1)은 인자 formname의 폼 파일을 개방하고   형식2)는 인자 str 의

문자열의 폼을 개방한다.  폼이 개방된 상태에서  다른 폼을  중첩해서

개방할 수 있으며,  최후에 개방된 것만 활성화되어 처리된다.  개방된

폼을 폐쇄하게 되면 개방한 역순으로 순서있게 활성화된다.

3. 설명

(1) 인자 formname은 문자열로 폼 파일의 이름이며 경로명을 포함할 수 있다.

(2) 형식2)의 인자 str은 문자열의 폼을 출력하기 위한 것이며 문자열이 아니면

문자열로 형변환된다.

(3) 형식2)에서 첫번째 인자는 사용되지 않는다.

(4) formopen() 및 폼을 개방하여 사용하는 관련 함수와 Inline print가 폼을

폐쇄하지 않은 상태에서 중첨하여 개방할 수 있는 최대 개수는 32 개이며

이것을 초과하여 중첩 개방하면 에러 처리된다.

(5) result의 값은 정수 0, -1, -2, -3, -5 중의 한 수이다.

(6) result가  0(FORM_NOERR)이면 정상적으로 폼을 개방한 경우이다.

(7) result가 -1(FORM_OPENERR)이면 formname이 없거나 개방할 수 없을 때이다.

(8) result가 -2(FORM_READERR)이면 폼이 0 byte이거나 읽기 에러인 경우이다.

(9) result가 -3(FORM_OUTMEMERR)이면 폼을 저장할 메모리가 부족한 경우이다.

4. 사용예

제목="1999년 11월 정기모임";

날짜="11월10일", 장소="먹자갈비", 보낸이="웰동호회 회장";

이름="홍길동", 회비="10,000", FORM_CNT= 0;

formname= helpdir ~ "temp/test.fom";

rtcode= formopen(formname);

if(rtcode!=FORM_NOERR)

{

print("form file open error!\n");

return;

}

formdump(); // form을 끝까지 출력한다.

formclose();   // 최후에 개방된 폼을 닫는다.

------------------------------ [ 출력결과 ] ------------------------------

□□□□□□□□□□□□□□□□□

□     1999년 11월 정기모임     □

□□□□□□□□□□□□□□□□□

□     홍길동님 안녕하십니까?   □

□                              □

□  이번 모임은 11월10일 입니다 □

□모임 장소는 먹자갈비이고      □

□    홍길동님이 납입할 회비는  □

□일금 10,000원입니다.          □

□                              □

□                              □

□           웰동호회 회장드림  □

□                No. 1         □

□□□□□□□□□□□□□□□□□

13.6  formredir()

1. 형식

형식1) result= formredir(fp)

형식2) result= formredir(filename)

형식3) result= formredir(filename, mode)

2. 기능: 폼의 출력결과를 표준출력에서 방향전환하여 fp나 filename에 저장한다.

3. 설명

(1) formredir()함수는 formopen()이나 formdump()함수를 실행하기 전에 사용해야

적용이 되며 이후에 사용하면 무시된다.

(2) 형식1)의 인자 fp는 파일 포인터이며 파일 개방시 얻은 값이어야 하고

파일 포인터가 아니면 에러 처리되며 이미 폐쇄된 파일 포인터일 때는

경고 메시지를 출력하고 result에 -1의 값을 되돌린다.

(3) 형식2)와 형식3)의 인자 filename은 문자열로써 폼의 출력결과를 저장할

파일명이며 경로명을 포함할 수 있다. filename의 파일은 formclose() 이후

에도 개방 상태로 있기 때문에 필요시 직접 fclose() 함수로 폐쇄해야 한다.

(4) 형식3)의 mode는 파일 개방 모드로 "w"나 "a"를 사용해야한다.

(5) 출력방향전환을 해제 하려면 formredir("") 또는 formredir(NULL)을 한다.

(6) result의 값은 개방된 파일의 파일 포인터이거나 0 또는 1 의 정수이다.

(7) result의 값이 0 이면 형식1)에서는 인자의 값이 "" 또는 NULL 이고 출력방향

전환을  해제 할 수 없을 때의 결과 값이며,  형식2)와 형식3)에서는  파일이

없거나 개방 에러가 발생했을 때의 결과 값을 의미한다.

(8) result의 값이 1 이면 출력방향전환을 해제한 것을 의미한다.

(9) result의 값이 0 또는 1 이 아니면 파일 포인터를 되돌린다.

4. 사용예

제목="1999년 11월 정기모임";

날짜="11월10일", 장소="먹자갈비", 보낸이="웰동호회 회장";

이름="홍길동", 회비="10,000", FORM_CNT= 0;

formredir("/dev/null"); // form의 출력 결과를 /dev/null로 출력한다.

formname= helpdir ~ "temp/test.fom";

if(formopen(formname)!=FORM_NOERR)

{

print("form file open error!\n");

return;

}

formdump(); // form을 끝까지 출력한다.

formredir(NULL); // form 출력 방향전환을 해제한다.

formclose();   // 최후에 개방된 폼을 닫는다.

------------------------------ [ 출력결과 ] ------------------------------

13.7  listmerge()

1. 형식: result= listmerge(listfile)

2. 기능: 형식화된 자료(목록) 파일을 읽어서 폼과 병합(합성)하여 표준출력장치로

출력을 한다.  만일 개방된 폼이 없다면 출력을 하지 않으며 변수에 값만

대입한다.  대입되는 변수의 값은 모두 문자열로 저장된다.

( 폼의 내용중에서 잘못된 폼 매크로가 사용되었다면 에러 처리된다 )

( setlocal(ON) 이면 전역 변수, setlocal(OFF) 이면 지역 변수에 대입된다 )

3. 설명

(1) 인자 listfile은 문자열로 자료(목록) 파일명이며 경로명을 포함할 수 있다.

(2) 개방된 폼이 없는 상태에서 result의 값은 대입된 변수의 개수이다.

(3) 개방된 폼이 있는 상태에서 result의 값은 폼의 병합 횟수로 폼의 제어

명령이 없었다면 출력된 폼의 개수이고 폼 제어 명령이 있었다면 endrep과

stop명령의 반복 횟수가 포함된다.

(4) result의 값이 -4(LIST_OPENERR)이면 자료(목록)파일이 없거나 개방할 수

없는 경우이다.

4. 자료(목록) 파일의 구조

(1) 주석(Comment): 공백을 제외한 최초 문자 또는 변수값의 분리문자가 ';'이나

'#'이면 그 문자로부터 그 줄 끝까지는 주석으로 처리된다.

(2) 자료 필드의 구조

형식1) 변수명=["|']변수값["|'],...[자료처리명령어]

형식2) ["|']변수값["|'],...[자료처리명령어]

1) 대괄호([])는 그 안의 내용이 생략 될 수 있음을 의미한다.

2) 대괄호 안의 '"'와 '''사이의 '|'기호는 '또는'을 의미하며

'"'로 시작하면 '"'로 끝나야 하고 '''로 시작하면 '''로 끝나야 한다.

3) '...'은 형식의 처음부터 표시 전의 내용이 반복될 수 있음을 의미한다.

4) 등호기호(=)는 변수명의 분리기호로써 등호 외에 ':'을 사용할 수도 있다.

5) 쉼표기호(,)는 변수값의 분리기호로써 쉼표 외에 공백,'#',';','\n'를

사용할 수도 있다.

6) 변수값은 모두 문자열로 저장된다.(수치가 아니다)

7) 변수값에 공백이 있으면 인용부호(" 또는 ')를 생략할 수 없다.

8) 형식1)에서 변수명과 분리기호(=)에는 공백이 있을 수 없다.

9) 형식2)에서 변수값에 대한 변수명은 내부변수로써 "field"와 순번으로

변수명이 할당된다.  예를 들어 처음 변수값은 field1에 두번째 변수값은

field2에 이와 같이 순서 있게 대입되며 개행문자('\n')에서 강제로 !merge

기능을 수행한 후 다음 줄의 자료는 다시 field1부터 순서 있게 대입된다.

10) 자료처리명령어는 아래와 같은 종류가 있으며 폼을 제어하기 위한 것으로

폼이 없으면 이 명령들은 무시된다.

-. !merge : 이 명령 이전까지의 자료만으로 폼을 병합하여 출력한다.

주로 폼에 반복부분이 있는 목록 형식의 출력에 사용한다.

-. !exitrep : 폼의 반복부분을 탈출한다.  반복부분이 중첩되어 있을

때에는 제일 안쪽의 하나의 반복부분만 탈출한다.

11) 형식1)의 자료(목록) 파일의 예

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□;이것은 시험용 자료입니다.                                      □

□a=1, b="test", c=3; 변수 a와 b와 c가 확보되며 각각 값이 대입됨  □

□d=10, !merge; 개방된 form이 있다면 출력을 한다.                 □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

12) 형식2)의 자료(목록) 파일의 예

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□1, 2, 3; field1=1, field2=2, field3=3이 대입된 후 form이 출력됨 □

□"ab","cd","ef"; field1="ab", field2="cd", field3="ef" 대입된 후 □

□;               개방된 form이 있다면 출력을 한다.               □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

4. 사용예

formname= helpdir ~ "temp/addr.fom";

listname= helpdir ~ "temp/addr.dat";

if(formopen(formname)!=FORM_NOERR)

{

print("form file open error!\n");

return;

}

if(listmerge(listname)==LIST_OPENERR)

{

print("list file open error!\n");

}

formclose();

------------------------------ [ 출력결과 ] ------------------------------

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ 123-456                                    123-4567(☞) □

□                                                         □

□ 서울시 oooo구 oooo동 123번지                            □

□                                                     ooo □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ 123-456                                    765-4321(☞) □

□                                                         □

□ 서울시 oooo구 oooo동 123번지                            □

□                                                     Wel □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

14.  통신 관련 함수

14.1  gethostbyaddr()

1. 형식: result= gethostbyaddr(ipaddr)

2. 기능: 인자 ipaddr의 IP 주소에 대한 사이트 주소(FQDN; 호스트명+도메인명)를

얻어온다.

3. 설명

(1) 인자 ipaddr은 문자열로 사이트에 대한 IP 주소(x.x.x.x)이어야 한다.

(2) 인자 ipaddr에 대한 사이트 주소(FQDN)가 문자열로 result에 돌려진다.

(3) 사이트 주소(FQDN)을 얻어오지 못하거나 에러가 발생하면 인자 ipaddr이

result에 돌려진다.

4. 사용예

hostname= gethostbyaddr("202.30.50.120");

print("202.30.50.120은", hostname, " 사이트입니다.\n");

------------------------------ [ 출력결과 ] ------------------------------

202.30.50.120은 whois.nic.or.kr 사이트입니다.

14.2  gethostbyname()

1. 형식: result= gethostbyname(hostname)

2. 기능: 인자 hostname의 사이트 주소(FQDN; 호스트명+도메인명)에 대한 IP 주소를

얻어온다.

3. 설명

(1) 인자 hostname은 문자열로 사이트 주소(FQDN)이어야 한다.

(2) 인자 hostname에 대한 IP주소가 문자열로 result에 돌려진다.

(3) IP 주소를 얻어오지 못하거나 에러가 발생하면 인자 hostname이 result에

돌려진다.

4. 사용예

ipaddr= gethostbyname("whois.nic.or.kr");

print("whois.nic.or.kr의 IP 주소는 ", ipaddr, " 입니다.\n");

------------------------------ [ 출력결과 ] ------------------------------

whois.nic.or.kr의 IP 주소는 202.30.50.120 입니다.

14.3  sockclose()

1. 형식: result= sockclose(sock)

2. 기능: sockopen() 함수로 개방한 인자 sock의 소켓(socket)을 폐쇄한다.

3. 설명

(1) 인자 sock은 소켓 포인터이며 소켓 개방시 얻은 값이어야 하고 소켓 포인터가

아니면 에러 처리되며 이미 폐쇄된 소켓 포인터일 때는 경고 메시지를 출력

하고 result에 -1의 값을 되돌린다.

(2) 실행 결과값 result는 설명(1)의 경우가 아닐 때는 항상 1 의 값을 갖는다.

4. 사용예

sock= sockopen("wesoft.co.kr", 80); // wesoft.co.kr의 80포트를 개방한다.

sockclose(sock); // 개방된 소켓을 폐쇄한다.

------------------------------ [ 출력결과 ] ------------------------------

14.4  sockopen()

1. 형식: result= sockopen(site, port)

2. 기능: 인자 site에 대한 사이트의 인자 port에 대한 해당 포트를 개방한다.

3. 설명

(1) 인자 site는 연결할 사이트의 문자열 주소(FQDN) 또는 IP주소이어야 한다.

(2) 인자 port는 해당 사이트의 개방할 포트 번호이어야 한다.

예를 들면 보통 웹 서버(httpd)는 포트 번호가 80 이다.

(3) 결과값 result는 개방 성공시 소켓에 대한 포인터의 값을 갖는다.

(4) 결과값 result는 개방 실패시 -1 의 값을 갖는다.

(5) 현재 버전의 소켓 관련 함수는 개발중이기 때문에 제한적으로 사용을 할 수

있다.  소켓의 개방은  sfd= socket(AF_INET, SOCK_STREM, IPPROTO_TCP) 만

되도록 프로그래밍되어 있다.

4. 사용예

sock= sockopen("wesoft.co.kr", 80); // wesoft.co.kr의 80포트를 개방한다.

sockclose(sock); // 개방된 소켓을 폐쇄한다.

------------------------------ [ 출력결과 ] ------------------------------

14.5  sockread()

1. 형식: result= sockread(sock)

2. 기능: sockopen() 함수로 개방한 인자 sock의 소켓으로부터 입력을 받는다.

3. 설명

(1) 인자 sock은 소켓 포인터이며 소켓 개방시 얻은 값이어야 하고 소켓 포인터가

아니면 에러 처리되며 이미 폐쇄된 소켓 포인터일 때는 경고 메시지를 출력

하고 result에 -1의 값을 되돌린다.

(2) 소켓으로부터 읽은 문자열이 result에 돌려진다. 현재 버전은 한 줄('\n')

단위로 소켓으로부터 읽기를 하며 한번의 사용으로 최대 1024bytes를 읽을

수 있고 개행문자('\n')도 result에 돌려진다.

(3) result의 값이 NULL 또는 ""(null string), 즉 문자열 길이가 0 이면 소켓에서

더 이상 읽을 자료가 없는(EOF) 경우이다.

(4) 현재 버전의 소켓 관련 함수는 개발중이기 때문에 제한적으로 사용을 할 수

있으며 읽은 문자열에 '\0'이 포함되어 있으면 그곳이 문자열의 끝이 된다.

4. 사용예

// 아래 내용은 wesoft.co.kr의 웹 서버를 연결하여 웹 서버에게 명령을 전달한

// 후 웹 문서를 읽고 종료되는 예이다.  웹 서버에 명령을 전달할 때는 필히

// '\n'을 명령뒤에 추가해야한다.  그렇지 않으면 연결된 웹 서버는 명령이

// 종료되기를 기다리기만 할 것이다.

sock= sockopen("wesoft.co.kr", 80); // wesoft.co.kr의 80포트를 개방한다.

sockwrite(sock, "GET /index.html\n"); // 소켓 출력(index.html을 얻기위해)

while( (str= sockread(sock)) != NULL ) // 소켓 EOF일때까지 읽기

{

print(str);

}

sockclose(sock); // 개방된 소켓을 폐쇄한다.

------------------------------ [ 출력결과 ] ------------------------------

14.6  sockwrite()

1. 형식: result= sockwrite(sock, str)

2. 기능: sockopen() 함수로 개방한 인자 sock의 소켓에 인자 str을 출력한다.

3. 설명

(1) 인자 sock은 소켓 포인터이며 소켓 개방시 얻은 값이어야 하고 소켓 포인터가

아니면 에러 처리되며 이미 폐쇄된 소켓 포인터일 때는 경고 메시지를 출력

하고 result에 -1의 값을 되돌린다.

(2) 인자 str은 소켓에 출력할 문자열이다.

(3) 소켓에 출력한 인자 str의 총 byte 수가 result에 돌려진다.

(4) 현재 버전의 소켓 관련 함수는 개발중이기 때문에 제한적으로 사용을 할 수

있으며 '\0'을 출력하지는 못한다.

4. 사용예

// 아래 내용은 wesoft.co.kr의 웹 서버를 연결하여 웹 서버에게 명령을 전달한

// 후 웹 문서를 읽고 종료되는 예이다.  웹 서버에 명령을 전달할 때는 필히

// '\n'을 명령뒤에 추가해야한다.  그렇지 않으면 연결된 웹 서버는 명령이

// 종료되기를 기다리기만 할 것이다.

sock= sockopen("wesoft.co.kr", 80); // wesoft.co.kr의 80포트를 개방한다.

sockwrite(sock, "GET /index.html\n"); // 소켓 출력(index.html을 얻기위해)

while( (str= sockread(sock)) != NULL ) // 소켓 EOF일때까지 읽기

{

print(str);

}

sockclose(sock); // 개방된 소켓을 폐쇄한다.

------------------------------ [ 출력결과 ] ------------------------------

15.  데이터베이스 관련 함수

15.1  mSQL 데이터베이스 함수

15.1.1  mSQL 사용 절차

1. mSQL database 사용 절차(방법#1)

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ 1. msqlConnect() 함수로 mSQL 서버를 연결한다.                 □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

↓

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ 2. msqlSelectDB() 함수로 데이터베이스를 선택한다.             □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

↓

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ 3. msqlQuery() 함수로 SQL 질의어를 실행하여 자료를 추출한다.  □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

↓

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ 4. msqlStoreResult() 함수로 추출한 자료를 임시 저장한다.      □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

↓

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ 5. msqlNumRows() 함수로 추출된 자료의 레코드 개수를 얻어온다. □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

↓

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ 6. msqlNumFields() 함수로 항목의 개수를 얻어온다.             □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□

□□□□□□□□□□□□□□□□→□

□                                ↓

□ □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ □ 7. msqlFetchRow() 함수로 추출된 레코드를 한개씩 얻어온다.     □

□ □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□                                ↓

□ □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ □ 8. msqlFetchRow()의 리턴값인 항목에 대한 배열을 처리한다.     □

□ □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□                                □

□□□□□□□□□□□□□□□□□◇ 추출한 마지막 레코드까지 반복한다.

□

↓

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ 9. msqlFreeResult() 함수로 임시 저장했던 자료를 해제한다.     □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

↓

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ 10. msqlClose() 함수로 mSQL의 접속을 종료한다.                □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

2. mSQL database 사용 절차(방법#2)

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ 1. msqlConnect() 함수로 mSQL 서버를 연결한다.                 □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

↓

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ 2. msqlSelectDB() 함수로 데이터베이스를 선택한다.             □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

↓

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ 3. msqlQueryResult() 함수로 SQL 질의어를 실행한 후 자료가     □

□    임시 저장된 포인터를 얻어온다.                             □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□

□□□□□□□□□□□□□□□□→□

□                                ↓

□ □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ □ 4. msqlFetchRow(), msqlFetchGlobal(), msqlFetchObject() 함수  □

□ □    중의 하나를 이용하여 레코드를 한개씩 얻어온다.             □

□ □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□                                □

□□□□□□□□□□□□□□□□□◇ 추출한 마지막 레코드까지 반복한다.

□

↓

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ 5. msqlFreeResult() 함수로 임시 저장된 자료를 해제한다.       □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

↓

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ 6. msqlClose() 함수로 mSQL의 접속을 종료한다.                 □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

15.1.2  msqlClose()

1. 형식: result= msqlClose(msql)

2. 기능: 인자 msql의 mSQL 접속을 폐쇄(해제)한다.

3. 설명

(1) 이 함수는 mSQL에서 지원하는 함수이며 함수명은 mSQL의 C API와 동일하다.

(2) 인자 msql은 mSQL 포인터이며 mSQL 연결시 얻은 값이어야 하고 mSQL 포인터

가 아니면 에러 처리되며 이미 폐쇄된 mSQL 포인터일 때에는 경고 메시지를

출력하고 result에 -1 의 값을 되돌린다.

(3) 설명(2)의 경우가 아니면 항상 정수 1 이 result에 돌려진다.

4. 사용예

msql= msqlConnect(NULL); // localhost를 연결한다.

msqlClose(msql); // mSQL 서버와의 연결을 끊는다.

------------------------------ [ 출력결과 ] ------------------------------

15.1.3  msqlConnect()

1. 형식: msql= msqlConnect(hostname)

2. 기능: mSQL 서버에 접속을 한다.  mSQL 데이터베이스를 사용하려면 mSQL관련 함수

중에서 가장 먼저 이 함수를 사용해야한다. 접속하지 못하면 결과값 msql에

-1(MSQL_ERR)이 돌려지며 성공하면 mSQL 포인터가 돌려진다.

3. 설명

(1) 이 함수는 mSQL에서 지원하는 함수이며 함수명은 mSQL의 C API와 동일하다.

(2) 인자 hostname은 문자열이며 수치이면 문자열로 형변환된다.

(3) 인자 hostname의 값은 mSQL 서버의 호스트명이나 IP 주소이다.

(4) 인자 hostname의 값이 NULL 또는 ""이면 localhost에 접속을 시도한다.

(5) 결과값 msql은 연결된 mSQL에 대한 mSQL 포인터이다.

(6) 동일 또는 서로 다른 호스트의 mSQL 데이터베이스를 동시에 여러개 연결했을

때, 이 함수의 리턴값인 msql으로 각각을 구별하며 파일 입출력시 파일 포인

터처럼 중요한 의미를 지닌다.

(7) msql의 값이 -1(MSQL_ERR)이면 mSQL 서버에 접속을 실패한 경우이다.

4. 사용예

msql= msqlConnect(NULL); // localhost를 연결한다.

if(msql==MSQL_ERR) { print("mSQL 서버 연결 에러!"); return; }

print("mSQL 서버를 연결하였습니다!\n");

msqlClose(msql); // msql DB와의 연결을 끊는다.

------------------------------ [ 출력결과 ] ------------------------------

mSQL 서버를 연결하였습니다!

15.1.4  msqlDataSeek()

1. 형식: result= msqlDataSeek(mres_ptr, pos)

2. 기능: 인자 mres_ptr의 임시 저장된 결과 자료에서 인자 pos번째 레코드의

위치로 이동한다.

3. 설명

(1) 이 함수는 mSQL에서 지원하는 함수이며 함수명은 mSQL의 C API와 동일하다.

(2) 인자 mres_ptr은 mSQL result 포인터이며 msqlStoreResult()함수나 기타

결과를 저장하는 함수에 의하여 얻은 값이어야 하고 mSQL result 포인터가

아니면 에러 처리되며, 이미 해제된 mSQL result 포인터일 때에는 경고

메시지를 출력하고 result에 -1 의 값을 되돌린다.

(3) 인자 pos는 레코드에 대한 순번( 0 부터 레코드 개수 - 1 )이며 이 값이

문자열이고 수치로 변환될 수 없을 때는 에러 처리된다.

(4) 인자 pos가 0 보다 작거나 또는 레코드의 개수보다 크거나 같으면 정수 -1 이

result에 돌려진다.

(5) 위의 설명(2)나 설명(4)의 경우가 아니면 정수 1 이 result에 돌려진다.

4. 사용예

// 아래 프로그램은 mSQL 서버가 정상 작동하지 않거나 또는 welhelp 라는

// 데이터베이스가 없거나 addr 이라는 테이블이 없으면 에러가 발생한다.

msql= msqlConnect(NULL); // localhost에 연결함

if(msql==MSQL_ERR) { print("mSQL 서버 연결 에러!\n"); return(-1); }

if(msqlSelectDB(msql, "welhelp")==MSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n"); return(-1);

}

query= "select * from addr"; // addr 테이블의 모든 항목을 선택

if(msqlQuery(msql, query)==MSQL_ERR)

{

print("query error!\n"); return(-1);

}

mres= msqlStoreResult(); // 추출된 자료를 저장하고 포인터를 돌려줌

row_count= msqlNumRows(mres); // 추출된 자료의 레코드 개수 얻기

field_count= msqlNumFields(mres); // 추출된 자료의 항목 개수 얻기

msqlDataSeek(mres, 1); // 2번째 레코드로 이동한다.

row_count-= 1; // 추출된 레코드의 개수를 조정

for(i=0; i<row_count; i++)

{

row= msqlFetchRow(mres); // 저장된 자료에서 한 레코드를 읽는다

if( isarray(row) ) // 또는 if(row!=MSQL_ERR)

for(j=0; j<field_count; j++) print("\t", row[j]); // 항목 출력

print();

}

msqlFreeResult(mres); // 임시 저장된 자료를 해제(free)한다.

msqlClose(msql); // mSQL 서버와의 접속을 해제한다.

------------------------------ [ 출력결과 ] ------------------------------

한여름	35	oo시 oo동 456번지

서지연	20	A시 B동 789번지

15.1.5  msqlError()

1. 형식: result= msqlError()

2. 기능: mSQL의 에러 메시지를 얻는다.

3. 설명

(1) 이 함수는 mSQL에서 지원하지 않으며 mSQL의 에러 메시지 변수를 응용했다.

(2) mSQL 사용시 에러가 발생했을 때 에러 메시지의 문자열이 result에 돌려진다.

(3) 발생된 에러가 없을 때는 널 스트링(Null string, "")이 result에 돌려진다.

4. 사용예

msql= msqlConnect(NULL); // localhost를 연결한다.

if(msql==MSQL_ERR) { print("mSQL 서버 연결 에러!\n"); return; }

rt= msqlSelectDB(msql, "no_db"); // no_db 의 데이터베이스가 없다고 가정함

errmsg= msqlError();

msqlClose(msql); // mSQL 서버와의 접속을 폐쇄한다.

printf("rt= %d  errmsg= %s\n", rt, errmsg);

------------------------------ [ 출력결과 ] ------------------------------

rt= -1  errmsg= Unknown database "no_db"

15.1.6  msqlFetchField()

1. 형식

형식1) result= msqlFetchField(mres_ptr)

형식2) result= msqlFetchField(mres_ptr, field_no)

2. 기능: 인자 mres_ptr의 항목에 대한 정보(이름, 소속 테이블, 자료형, 크기,

플래그)를 객체로 얻는다.

3. 설명

(1) 이 함수는 mSQL에서 지원하는 함수이며 함수명은 mSQL의 C API와 동일하다.

(2) 인자 mres_ptr은 mSQL result 포인터이며 msqlStoreResult()함수나 기타

결과를 저장하는 함수에 의하여 얻은 값이어야 하고 mSQL result 포인터가

아니면 에러 처리되며, 이미 해제된 mSQL result 포인터일 때에는 경고

메시지를 출력하고 result에 -1 의 값을 되돌린다.

(3) 형식1)은 필드 커서 위치, 형식2)는 field_no 위치의 항목 정보를 얻는다.

(4) 형식2)의 인자 field_no는 항목에 대한 순번( 0 부터 항목개수 - 1 )이며 이

값이 문자열이고 수치로 변환될 수 없을 때는 에러 처리된다.

(5) 형식2)의 인자 field_no가 0 보다 작거나 또는 항목의 개수보다 크거나 같으

면 정수 -1 이 result에 돌려진다.

(6) 위의 설명(2)나 설명(5)의 경우가 아니면 설명(7)의 멤버 변수를 지닌 객체가

result에 돌려진다.

(7) 결과값 객체인 result의 멤버변수 설명

객체와 멤버변수명	자료형	설 명
result.name	문자열	항목의 이름
result.table	문자열	소속 테이블 이름
result.type	문자열	항목의 자료형
result.type_value	정수	항목의 자료형을 의미하는 수치
result.length	정수	항목의 크기(bytes)
result.flags	정수	항목의 플래그

1) result.type_value의 값 설명(mSQL의 버전에 따라 차이가 있을 수 있음)

값	자료형	값	자료형	값	자료형	값	자료형
1	int	5	null	9	money	255	any(?)
2	char	6	text	10	time
3	real	7	date	253	index
4	ident	8	uint	254	sysvar(?)

2) result.flags의 설명(mSQL의 버전에 따라 차이가 있을 수 있음)

bit번호 (10진값)	7 (128)	6 (64)	5 (32)	4 (16)	3 (8)	2 (4)	1 (2)	0 (1)
의미							UNIQUE	NOT NULL

4. 사용예#1

msql= msqlConnect(NULL); // localhost를 연결한다.

if(msql==MSQL_ERR) { print("mSQL 서버 연결 에러!\n"); return(-1); }

if(msqlSelectDB(msql, "welhelp")==MSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n"); return(-1);

}

mres= msqlListFields(msql, "addr"); // addr 테이블의 항목 리스트 얻기

if(mres==MSQL_ERR) { print("addr error!\n"); return(-1); }

fd= msqlFetchField(mres, 1); // 두번째 항목에 대한 정보를 얻는다.

printf("항목: %s, 테이블: %s, 자료형: %s [%d], 크기: %lu, 플래그: %X\n",

fd.name, fd.table, fd.type, fd.type_value, fd.length, fd.flags);

msqlFreeResult(mres);

msqlClose(msql);

------------------------------ [ 출력결과 ] ------------------------------

항목: age, 테이블: addr, 자료형: int [1], 크기: 4, 플래그: 0

5. 사용예#2

msql= msqlConnect(NULL); // localhost를 연결한다.

if(msql==MSQL_ERR) { print("mSQL 서버 연결 에러!\n"); return(-1); }

if(msqlSelectDB(msql, "welhelp")==MSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n"); return(-1);

}

mres= msqlListFields(msql, "addr"); // addr 테이블의 항목 리스트 얻기

if(mres==MSQL_ERR) { print("addr error!\n"); return(-1); }

msqlFieldSeek(mres, 2); // 3번째 항목으로 필드 커서를 이동한다.

fd= msqlFetchField(mres); // 필드 커서의 항목에 대한 정보를 얻는다.

printf("항목: %s, 테이블: %s, 자료형: %s [%d], 크기: %lu, 플래그: %X\n",

fd.name, fd.table, fd.type, fd.type_value, fd.length, fd.flags);

msqlFreeResult(mres);

msqlClose(msql);

------------------------------ [ 출력결과 ] ------------------------------

항목: address, 테이블: addr, 자료형: char [2], 크기: 120, 플래그: 0

6. 사용예#3

msql= msqlConnect(NULL); // localhost를 연결한다.

if(msql==MSQL_ERR) { print("mSQL 서버 연결 에러!\n"); return(-1); }

if(msqlSelectDB(msql,"welhelp")==MSQL_ERR) { print("DB Err!"); return(-1); }

mres= msqlListFields(msql, "addr"); // addr 테이블의 항목 리스트 얻기

if(mres==MSQL_ERR) { print("addr error!\n"); return(-1); }

while( (fd= msqlFetchField(mres))!=MSQL_ERR )

{

printf("   항목: %s, 테이블: %s, 자료형: %s [%d], 크기: %lu, flag: %X\n",

fd.name, fd.table, fd.type, fd.type_value, fd.length, fd.flags);

}

msqlFreeResult(mres); msqlClose(msql);

------------------------------ [ 출력결과 ] ------------------------------

항목: name, 테이블: addr, 자료형: char [2], 크기: 10, flag: 1

항목: age, 테이블: addr, 자료형: int [1], 크기: 4, flag: 0

항목: address, 테이블: addr, 자료형: char [2], 크기: 120, flag: 0

15.1.7  msqlFetchGlobal()

1. 형식

형식1) result= msqlFetchGlobal(mres_ptr)

형식2) result= msqlFetchGlobal(mres_ptr, prefix)

2. 기능: 인자 mres_ptr의 임시 저장된 결과 자료에서 한 레코드씩 순차적으로 읽어

전역변수로 항목의 값을 얻는다. 이때 형식1)은 데이터베이스의 항목 명칭

과 같은 변수명의 전역변수,  형식2)에서  인자 prefix로 지정한 접두사가

포함된 항목 명칭의 전역변수,  항목 명칭과 무관하게 인자 prefix에 순번

을 부여한 변수명의 전역변수로 값을 얻어올 수 있다.

( setlocal(ON) 이면 전역 변수, setlocal(OFF) 이면 지역 변수에 대입된다 )

3. 설명

(1) 이 함수는 mSQL에서 지원하지 않으며 msqlFetchRow() 함수를 응용한 것이다.

(2) 인자 mres_ptr은 mSQL result 포인터이며 msqlStoreResult()함수나 기타

결과를 저장하는 함수에 의하여 얻은 값이어야 하고 mSQL result 포인터가

아니면 에러 처리되며, 이미 해제된 mSQL result 포인터일 때에는 경고

메시지를 출력하고 result에 -1 의 값을 되돌린다.

(3) 형식1)은 데이터베이스의 항목 명칭과 동일한 전역변수에 값이 돌려진다.

(4) 형식2)는 인자 prefix에 의해 응용된 명칭의 전역변수에 값이 돌려진다.

(5) 인자 prefix는 문자열이어야 하며 문자열이 아니면 형변환된다.

(6) 인자 prefix가 15 문자(bytes)를 초과하거나 그 값이 변수명 작성규칙(첫글자

는 영문/한글, 그 다음부터는 숫자도 조합가능)에 위배되면 에러 처리된다.

(7) 인자 prefix의 값이 '#'으로 끝나면 '#' 문자를 제외한 명칭에 순번(1 부터

항목개수)을 부여한 변수명으로 값이 돌려지며,  '#'으로 끝나지 않으면

prefix의 값에 데이터베이스의 항목명칭을 조합한 변수명에 값이 돌려진다.

(예를 들어 mres_ptr의 대상 항목의 명칭이 각각 name 과 addr 이고 prefix의

값이 "DB"이면 이 함수를 수행한 후에는 name 항목의 값은 DBname , addr 항

목의 값은 DBaddr에 기억되며, prefix의 값이 "Field#"과 같이 '#'으로 끝나

면 name 항목의 값은 Field1 , addr 항목의 값은 Field2에 기억된다)

(8) mres_ptr의 항목명이 변수명 작성규칙에 위배되면 그 항목은 field + 항목

순번(1부터)의 변수명에 값이 돌려진다.(예를 들어 3번째 항목의 항목명이

234abc와 같이 될 수 있다면 그 항목의 값은 field3의 변수명에 기억된다)

(9) 인자 prefix의 값이 NULL 또는 ""이면 형식1)과 같다.

(10) mres_ptr에 대한 항목의 개수가 결과값 result에 돌려진다.

(11) result의 값이 정수 -1(MSQL_ERR)이면 에러가 발생한 경우이다.

4. 사용예#1

// 아래 프로그램은 mSQL 서버가 정상 작동하지 않거나 또는 welhelp 라는

// 데이터베이스가 없거나 addr 이라는 테이블이 없으면 에러가 발생한다.

msql= msqlConnect(NULL); // localhost에 연결함

if(msql==MSQL_ERR) { print("mSQL 서버 연결 에러!\n"); return(-1); }

if(msqlSelectDB(msql, "welhelp")==MSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n");

return(-1);

}

query= "select * from addr"; // addr 테이블의 모든 항목을 선택

mres= msqlQueryResult(msql, query);

if(mres==MSQL_ERR) { print("query error!!\n"); return(-1); }

if(mres==NULL) { print("store result error!\n"); return(-1); }

while( msqlFetchGlobal(mres) > 0 )

{

print("\t", name);    // addr 테이블의 name 항목의 값은 name

print("\t", age);     // addr 테이블의 age 항목의 값은 age

print("\t", address); // addr 테이블의 address 항목의 값은 address

print(); // 줄을 바꿔준다.

}

msqlFreeResult(mres); // 임시 저장된 자료를 해제(free)한다.

msqlClose(msql); // mSQL 서버와의 접속을 해제한다.

------------------------------ [ 출력결과 ] ------------------------------

홍길동	28	xx시 xx동 123번지

한여름	35	oo시 oo동 456번지

서지연	20	A시 B동 789번지

5. 사용예#2

// 아래 프로그램은 mSQL 서버가 정상 작동하지 않거나 또는 welhelp 라는

// 데이터베이스가 없거나 addr 이라는 테이블이 없으면 에러가 발생한다.

msql= msqlConnect(NULL); // localhost에 연결함

if(msql==MSQL_ERR) { print("mSQL 서버 연결 에러!\n"); return(-1); }

if(msqlSelectDB(msql, "welhelp")==MSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n");

return(-1);

}

query= "select * from addr"; // addr 테이블의 모든 항목을 선택

mres= msqlQueryResult(msql, query);

if(mres==MSQL_ERR) { print("query error!!\n"); return(-1); }

if(mres==NULL) { print("store result error!\n"); return(-1); }

while( msqlFetchGlobal(mres, "DB_") > 0 )

{

print("\t", DB_name);    // addr 테이블의 name 항목의 값은 DB_name

print("\t", DB_age);     // addr 테이블의 age 항목의 값은 DB_age

print("\t", DB_address); // addr 의 address 항목의 값은 DB_address

print(); // 줄을 바꿔준다.

}

msqlFreeResult(mres); // 임시 저장된 자료를 해제(free)한다.

msqlClose(msql); // mSQL 서버와의 접속을 해제한다.

------------------------------ [ 출력결과 ] ------------------------------

홍길동	28	xx시 xx동 123번지

한여름	35	oo시 oo동 456번지

서지연	20	A시 B동 789번지

6. 사용예#3

// 아래 프로그램은 mSQL 서버가 정상 작동하지 않거나 또는 welhelp 라는

// 데이터베이스가 없거나 addr 이라는 테이블이 없으면 에러가 발생한다.

msql= msqlConnect(NULL); // localhost에 연결함

if(msql==MSQL_ERR) { print("mSQL 서버 연결 에러!\n"); return(-1); }

if(msqlSelectDB(msql, "welhelp")==MSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n");

return(-1);

}

query= "select * from addr"; // addr 테이블의 모든 항목을 선택

mres= msqlQueryResult(msql, query);

if(mres==MSQL_ERR) { print("query error!!\n"); return(-1); }

if(mres==NULL) { print("store result error!\n"); return(-1); }

while( msqlFetchGlobal(mres, "dbfield#") > 0 )

{

print("\t", dbfield1); // addr 테이블의 name 항목의 값은 dbfield1

print("\t", dbfield2); // addr 테이블의 age 항목의 값은 dbfield2

print("\t", dbfield3); // addr 테이블의 address 항목의 값은 dbfield3

print(); // 줄을 바꿔준다.

}

msqlFreeResult(mres); // 임시 저장된 자료를 해제(free)한다.

msqlClose(msql); // mSQL 서버와의 접속을 해제한다.

------------------------------ [ 출력결과 ] ------------------------------

홍길동	28	xx시 xx동 123번지

한여름	35	oo시 oo동 456번지

서지연	20	A시 B동 789번지

15.1.8  msqlFetchObject()

1. 형식

형식1) result= msqlFetchObject(mres_ptr)

형식2) result= msqlFetchObject(mres_ptr, prefix)

2. 기능: 인자 mres_ptr의 임시 저장된 결과 자료에서  한 레코드씩 순차적으로 읽어

객체의 맴버변수로 항목의 값을 얻는다.  이때 형식1)은 데이터베이스의 항

목 명칭과 같은 변수명의 맴버변수,  형식2)에서 인자 prefix로 지정한  접

두사가 포함된 항목 명칭의 맴버변수, 항목 명칭과 무관하게 인자 prefix에

순번을 부여한 변수명의 맴버변수로 값을 얻어올 수 있다.

3. 설명

(1) 이 함수는 mSQL에서 지원하지 않으며 msqlFetchRow() 함수를 응용한 것이다.

(2) 인자 mres_ptr은 mSQL result 포인터이며 msqlStoreResult()함수나 기타

결과를 저장하는 함수에 의하여 얻은 값이어야 하고 mSQL result 포인터가

아니면 에러 처리되며, 이미 해제된 mSQL result 포인터일 때에는 경고

메시지를 출력하고 result에 -1 의 값을 되돌린다.

(3) 형식1)은 데이터베이스의 항목 명칭과 동일한 맴버변수에 값이 돌려진다.

(4) 형식2)는 인자 prefix에 의해 응용된 명칭의 맴버변수에 값이 돌려진다.

(5) 인자 prefix는 문자열이어야 하며 문자열이 아니면 형변환된다.

(6) 인자 prefix가 15 문자(bytes)를 초과하거나 그 값이 변수명 작성규칙(첫글자

는 영문/한글, 그 다음부터는 숫자도 조합가능)에 위배되면 에러 처리된다.

(7) 인자 prefix의 값이 '#'으로 끝나면 '#' 문자를 제외한 명칭에 순번(1 부터

항목개수)을 부여한 변수명으로 값이 돌려지며,  '#'으로 끝나지 않으면

prefix의 값에 데이터베이스의 항목명칭을 조합한 변수명에 값이 돌려진다.

(예를 들어 mres_ptr의 대상 항목의 명칭이 각각 name 과 addr 이고 prefix의

값이 "DB"이면 이 함수를 수행한 후에는 name 항목의 값은 DBname , addr 항

목의 값은 DBaddr에 기억되며, prefix의 값이 "Field#"과 같이 '#'으로 끝나

면 name 항목의 값은 Field1 , addr 항목의 값은 Field2에 기억된다)

(8) mres_ptr의 항목명이 변수명 작성규칙에 위배되면 그 항목은 field + 항목

순번(1부터)의 변수명에 값이 돌려진다.(예를 들어 3번째 항목의 항목명이

234abc와 같이 될 수 있다면 그 항목의 값은 field3의 변수명에 기억된다)

(9) 인자 prefix의 값이 NULL 또는 ""이면 형식1)과 같다.

(10) 위의 설명에 관련된 맴버변수를 지닌 객체가 result에 돌려진다.

(11) result의 값이 객체가 아닌 정수 -1(MSQL_ERR)이면 에러가 발생한 경우이다.

4. 사용예#1

// 아래 프로그램은 mSQL 서버가 정상 작동하지 않거나 또는 welhelp 라는

// 데이터베이스가 없거나 addr 이라는 테이블이 없으면 에러가 발생한다.

msql= msqlConnect(NULL); // localhost에 연결함

if(msql==MSQL_ERR) { print("mSQL 서버 연결 에러!\n"); return(-1); }

if(msqlSelectDB(msql, "welhelp")==MSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n");

return(-1);

}

query= "select * from addr"; // addr 테이블의 모든 항목을 선택

mres= msqlQueryResult(msql, query);

if(mres==MSQL_ERR) { print("query error!!\n"); return(-1); }

if(mres==NULL) { print("store result error!\n"); return(-1); }

while( (rec=msqlFetchObject(mres))!=MSQL_ERR )

{

print("\t", rec.name);    // addr 테이블의 name 항목의 값은 rec.name

print("\t", rec.age);     // addr 테이블의 age 항목의 값은 rec.age

print("\t", rec.address); // addr 의 address 항목의 값은 rec.address

print(); // 줄을 바꿔준다.

}

msqlFreeResult(mres); // 임시 저장된 자료를 해제(free)한다.

msqlClose(msql); // mSQL 서버와의 접속을 해제한다.

------------------------------ [ 출력결과 ] ------------------------------

홍길동	28	xx시 xx동 123번지

한여름	35	oo시 oo동 456번지

서지연	20	A시 B동 789번지

5. 사용예#2

// 아래 프로그램은 mSQL 서버가 정상 작동하지 않거나 또는 welhelp 라는

// 데이터베이스가 없거나 addr 이라는 테이블이 없으면 에러가 발생한다.

msql= msqlConnect(NULL); // localhost에 연결함

if(msql==MSQL_ERR) { print("mSQL 서버 연결 에러!\n"); return(-1); }

if(msqlSelectDB(msql, "welhelp")==MSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n");

return(-1);

}

query= "select * from addr"; // addr 테이블의 모든 항목을 선택

mres= msqlQueryResult(msql, query);

if(mres==MSQL_ERR) { print("query error!!\n"); return(-1); }

if(mres==NULL) { print("store result error!\n"); return(-1); }

while( isobject(rec=msqlFetchObject(mres, "m_")) )

{

print("\t", rec.m_name);    // addr 의 name 항목의 값은 rec.m_name

print("\t", rec.m_age);     // addr 의 age 항목의 값은 rec.m_age

print("\t", rec.m_address); // addr의 address항목의 값은 rec.m_address

print(); // 줄을 바꿔준다.

}

msqlFreeResult(mres); // 임시 저장된 자료를 해제(free)한다.

msqlClose(msql); // mSQL 서버와의 접속을 해제한다.

------------------------------ [ 출력결과 ] ------------------------------

홍길동	28	xx시 xx동 123번지

한여름	35	oo시 oo동 456번지

서지연	20	A시 B동 789번지

6. 사용예#3

// 아래 프로그램은 mSQL 서버가 정상 작동하지 않거나 또는 welhelp 라는

// 데이터베이스가 없거나 addr 이라는 테이블이 없으면 에러가 발생한다.

msql= msqlConnect(NULL); // localhost에 연결함

if(msql==MSQL_ERR) { print("mSQL 서버 연결 에러!\n"); return(-1); }

if(msqlSelectDB(msql, "welhelp")==MSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n");

return(-1);

}

query= "select * from addr"; // addr 테이블의 모든 항목을 선택

mres= msqlQueryResult(msql, query);

if(mres==MSQL_ERR) { print("query error!!\n"); return(-1); }

if(mres==NULL) { print("store result error!\n"); return(-1); }

while( isobject(rec=msqlFetchObject(mres, "dbf#")) )

{

print("\t", rec.dbf1); // addr 의 name 항목의 값은 rec.dbf1

print("\t", rec.dbf2); // addr 의 age 항목의 값은 rec.dbf2

print("\t", rec.dbf3); // addr 의 address 항목의 값은 rec.dbf3

print(); // 줄을 바꿔준다.

}

msqlFreeResult(mres); // 임시 저장된 자료를 해제(free)한다.

msqlClose(msql); // mSQL 서버와의 접속을 해제한다.

------------------------------ [ 출력결과 ] ------------------------------

홍길동	28	xx시 xx동 123번지

한여름	35	oo시 oo동 456번지

서지연	20	A시 B동 789번지

15.1.9  msqlFetchRow()

1. 형식: result= msqlFetchRow(mres_ptr)

2. 기능: 인자 mres_ptr의 임시 저장된 결과 자료에서 한 레코드씩 순차적으로 읽어

배열로 항목의 값을 얻는다.

3. 설명

(1) 이 함수는 mSQL에서 지원하는 함수이며 함수명은 mSQL의 C API와 동일하다.

(2) 인자 mres_ptr은 mSQL result 포인터이며 msqlStoreResult()함수나 기타

결과를 저장하는 함수에 의하여 얻은 값이어야 하고 mSQL result 포인터가

아니면 에러 처리되며, 이미 해제된 mSQL result 포인터일 때에는 경고

메시지를 출력하고 result에 -1 의 값을 되돌린다.

(3) mres_ptr에 대한 항목의 값이 배열로 result에 돌려진다.

(4) result의 값이 정수 -1(MSQL_ERR)이면 에러가 발생한 경우이다.

4. 사용예

// 아래 프로그램은 mSQL 서버가 정상 작동하지 않거나 또는 welhelp 라는

// 데이터베이스가 없거나 addr 이라는 테이블이 없으면 에러가 발생한다.

msql= msqlConnect(NULL); // localhost에 연결함

if(msql==MSQL_ERR) { print("mSQL 서버 연결 에러!\n"); return(-1); }

if(msqlSelectDB(msql, "welhelp")==MSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n"); return(-1);

}

query= "select * from addr"; // addr 테이블의 모든 항목을 선택

if(msqlQuery(msql, query)==MSQL_ERR)

{

print("query error!\n"); return(-1);

}

mres= msqlStoreResult(); // 추출된 자료를 저장하고 포인터를 돌려줌

row_count= msqlNumRows(mres); // 추출된 자료의 레코드 개수 얻기

field_count= msqlNumFields(mres); // 추출된 자료의 항목 개수 얻기

msqlDataSeek(mres, 1); // 2번째 레코드로 이동한다.

row_count-= 1; // 추출된 레코드의 개수를 조정

for(i=0; i<row_count; i++)

{

row= msqlFetchRow(mres); // 저장된 자료에서 한 레코드를 읽는다

if( isarray(row) ) // 또는 if(row!=MSQL_ERR)

for(j=0; j<field_count; j++) print("\t", row[j]); // 항목 출력

print();

}

msqlFreeResult(mres); // 임시 저장된 자료를 해제(free)한다.

msqlClose(msql); // mSQL 서버와의 접속을 해제한다.

------------------------------ [ 출력결과 ] ------------------------------

한여름	35	oo시 oo동 456번지

서지연	20	A시 B동 789번지

15.1.10  msqlFieldSeek()

1. 형식: result= msqlFieldSeek(mres_ptr, field_no)

2. 기능: 인자 mres_ptr의 항목에 대한 필드 커서를 이동시키며 msqlFetchField()

함수로 필드 커서의 위치에 있는 항목의 정보를 얻어올 때 사용한다.

3. 설명

(1) 이 함수는 mSQL에서 지원하는 함수이며 함수명은 mSQL의 C API와 동일하다.

(2) 인자 mres_ptr은 mSQL result 포인터이며 msqlStoreResult()함수나 기타

결과를 저장하는 함수에 의하여 얻은 값이어야 하고 mSQL result 포인터가

아니면 에러 처리되며, 이미 해제된 mSQL result 포인터일 때에는 경고

메시지를 출력하고 result에 -1 의 값을 되돌린다.

(3) 인자 field_no는 항목에 대한 순번( 0 부터 항목개수 - 1 )이며 이 값이

문자열이고 수치로 변환될 수 없을 때는 에러 처리된다.

(4) 인자 field_no가 0 보다 작거나 또는 항목의 개수보다 크거나 같으면 정수

-1 이 result에 돌려진다.

(5) 위의 설명(2)나 설명(4)의 경우가 아니면 정수 1 이 result에 돌려진다.

4. 사용예

msql= msqlConnect(NULL); // localhost를 연결한다.

if(msql==MSQL_ERR) { print("mSQL 서버 연결 에러!\n"); return(-1); }

if(msqlSelectDB(msql, "welhelp")==MSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n"); return(-1);

}

mres= msqlListFields(msql, "addr"); // addr 테이블의 항목 리스트 얻기

if(mres==MSQL_ERR) { print("addr error!\n"); return(-1); }

msqlFieldSeek(mres, 2); // 3번째 항목으로 필드 커서를 이동한다.

fd= msqlFetchField(mres); // 필드 커서의 항목에 대한 정보를 얻는다.

printf("항목: %s, 테이블: %s, 자료형: %s [%d], 크기: %lu, 플래그: %X\n",

fd.name, fd.table, fd.type, fd.type_value, fd.length, fd.flags);

msqlFreeResult(mres); msqlClose(msql);

------------------------------ [ 출력결과 ] ------------------------------

항목: address, 테이블: addr, 자료형: char [2], 크기: 120, 플래그: 0

15.1.11  msqlFreeResult()

1. 형식: result= msqlFreeResult(mres_ptr)

2. 기능: msqlStoreResult() 함수나 기타 결과를 저장하는 함수에 의하여 저장된

자료를 해제(메모리 해제)하는 역할을 한다.

3. 설명

(1) 이 함수는 mSQL에서 지원하는 함수이며 함수명은 mSQL의 C API와 동일하다.

(2) 인자 mres_ptr은 mSQL result 포인터이며 msqlStoreResult()함수나 기타

결과를 저장하는 함수에 의하여 얻은 값이어야 하고 mSQL result 포인터가

아니면 에러 처리되며, 이미 해제된 mSQL result 포인터일 때에는 경고

메시지를 출력하고 result에 -1 의 값을 되돌린다.

(3) 항상 정수 1 이 result에 돌려진다.

4. 사용예

// 아래 프로그램은 mSQL 서버가 정상 작동하지 않거나 또는 welhelp 라는

// 데이터베이스가 없거나 addr 이라는 테이블이 없으면 에러가 발생한다.

msql= msqlConnect(NULL); // localhost에 연결함

if(msql==MSQL_ERR) { print("mSQL 서버 연결 에러!\n"); return(-1); }

if(msqlSelectDB(msql, "welhelp")==MSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n"); return(-1);

}

query= "select * from addr"; // addr 테이블의 모든 항목을 선택

if(msqlQuery(msql, query)==MSQL_ERR)

{

print("query error!\n"); return(-1);

}

mres= msqlStoreResult(); // 추출된 자료를 저장하고 포인터를 돌려줌

row_count= msqlNumRows(mres); // 추출된 자료의 레코드 개수 얻기

field_count= msqlNumFields(mres); // 추출된 자료의 항목 개수 얻기

msqlDataSeek(mres, 1); // 2번째 레코드로 이동한다.

row_count-= 1; // 추출된 레코드의 개수를 조정

for(i=0; i<row_count; i++)

{

row= msqlFetchRow(mres); // 저장된 자료에서 한 레코드를 읽는다

if( isarray(row) ) // 또는 if(row!=MSQL_ERR)

for(j=0; j<field_count; j++) print("\t", row[j]); // 항목 출력

print();

}

msqlFreeResult(mres); // 임시 저장된 자료를 해제(free)한다.

msqlClose(msql); // mSQL 서버와의 접속을 해제한다.

------------------------------ [ 출력결과 ] ------------------------------

한여름	35	oo시 oo동 456번지

서지연	20	A시 B동 789번지

15.1.12  msqlGetHostInfo()

1. 형식: result= msqlGetHostInfo()

2. 기능: mSQL 서버의 접속 정보를 얻는다.

3. 설명

(1) 이 함수는 mSQL에서 지원하는 함수이며 함수명은 mSQL의 C API와 동일하다.

(2) msqlConnect() 함수를 호출한 후에 연결된 mSQL의 정보를 얻는다.

(3) mSQL의 접속 정보가 문자열로 result에 돌려진다.

4. 사용예

msql= msqlConnect(NULL); // localhost를 연결한다.

if(msql==MSQL_ERR) { print("mSQL 서버 연결 에러!\n"); return(-1); }

mSQL_connection= msqlGetHostInfo();

msqlClose(msql);

print("mSQL connection= ", mSQL_connection);

------------------------------ [ 출력결과 ] ------------------------------

mSQL connection= Localhost via UNIX socket

15.1.13  msqlGetProtoInfo()

1. 형식: result= msqlGetProtoInfo()

2. 기능: mSQL 서버의 프로토콜 버전(protocol version)을 얻는다.

3. 설명

(1) 이 함수는 mSQL에서 지원하는 함수이며 함수명은 mSQL의 C API와 동일하다.

(2) msqlConnect() 함수를 호출한 후에 연결된 mSQL의 정보를 얻는다.

(3) mSQL의 프로토콜 버전이 정수로 result에 돌려진다.

4. 사용예

msql= msqlConnect(NULL); // localhost를 연결한다.

if(msql==MSQL_ERR) { print("mSQL 서버 연결 에러!\n"); return(-1); }

mSQL_proto_version= msqlGetProtoInfo();

msqlClose(msql);

print("mSQL protocol version= ", mSQL_proto_version);

------------------------------ [ 출력결과 ] ------------------------------

mSQL protocol version= 23

15.1.14  msqlGetServerInfo()

1. 형식: result= msqlGetServerInfo()

2. 기능: mSQL 서버의 버전(version)을 얻는다.

3. 설명

(1) 이 함수는 mSQL에서 지원하는 함수이며 함수명은 mSQL의 C API와 동일하다.

(2) msqlConnect() 함수를 호출한 후에 연결된 mSQL의 정보를 얻는다.

(3) mSQL 서버의 버전이 문자열로 result에 돌려진다.

4. 사용예

msql= msqlConnect(NULL); // localhost를 연결한다.

if(msql==MSQL_ERR) { print("mSQL 서버 연결 에러!\n"); return(-1); }

mSQL_server_version= msqlGetServerInfo();

msqlClose(msql);

print("mSQL server version= ", mSQL_server_version);

------------------------------ [ 출력결과 ] ------------------------------

mSQL server version= 2.0.11

15.1.15  msqlListDBs()

1. 형식: mres_ptr= msqlListDBs(msql)

2. 기능: 접속된 mSQL 서버의 데이터베이스 목록을 얻는다.

3. 설명

(1) 이 함수는 mSQL에서 지원하는 함수이며 함수명은 mSQL의 C API와 동일하다.

(2) 인자 msql은 mSQL 포인터이며 mSQL 연결시 얻은 값이어야 하고 mSQL 포인터

가 아니면 에러 처리되며 이미 폐쇄된 mSQL 포인터일 때에는 경고 메시지를

출력하고 mres_ptr에 -1 의 값을 되돌린다.

(3) mSQL의 데이터베이스 목록을 얻지 못하면 정수 -1(MSQL_ERR)이 mres_ptr에

돌려진다.

(4) 설명(2)와 설명(3)의 경우가 아니면 임시 저장된 자료에 대한 mSQL result

포인터가 mres_ptr에 돌려진다.

4. 사용예

// 아래의 예제는 연결된 mSQL에 최소 3개의 데이터베이스가 존재한다고 가정함

msql= msqlConnect(NULL); // localhost를 연결한다.

if(msql==MSQL_ERR) { print("mSQL 서버 연결 에러!\n"); return(-1); }

mres= msqlListDBs(msql); // 얻어진 목록의 항목명은 Database 이다.

if(mres==MSQL_ERR) { print("error!\n"); return; }

msqlFetchGlobal(mres);           // Database 변수에 값이 얻어짐

msqlFetchGlobal(mres, "dbase#"); // dbase1 변수에 값이 얻어짐

msqlFetchGlobal(mres, "ms_");    // ms_Database 변수에 값이 얻어짐

msqlFreeResult(mres);

msqlClose(msql);

printf("DB 명= [%s] [%s] [%s]\n", Database, dbase1, ms_Database);

------------------------------ [ 출력결과 ] ------------------------------

DB 명= [welhelp] [test] [w3-msql]

15.1.16  msqlListFields()

1. 형식: mres_ptr= msqlListFields(msql, table_name)

2. 기능: 접속된 mSQL 서버에 대하여 msqlSelectDB() 함수로 선택한 데이터베이스의

인자 table_name 테이블의 항목 목록을 얻는다.

(개별적인 항목의 정보는 msqlFetchField() 함수를 사용하여 얻어야한다)

3. 설명

(1) 이 함수는 mSQL에서 지원하는 함수이며 함수명은 mSQL의 C API와 동일하다.

(2) 인자 msql은 mSQL 포인터이며 mSQL 연결시 얻은 값이어야 하고 mSQL 포인터

가 아니면 에러 처리되며 이미 폐쇄된 mSQL 포인터일 때에는 경고 메시지를

출력하고 mres_ptr에 -1 의 값을 되돌린다.

(3) 인자 table_name은 테이블명으로 문자열이며 문자열이 아니면 형변환된다.

(4) 인자 table_name 테이블의 항목 목록을 얻지 못하면 정수 -1(MSQL_ERR)이

mres_ptr에 돌려진다.

(5) 설명(2)와 설명(4)의 경우가 아니면 임시 저장된 자료에 대한 mSQL result

포인터가 mres_ptr에 돌려진다.

4. 사용예

// 아래의 예제는 welhelp 데이터베이스와 addr 테이블이 존재한다고 가정함

msql= msqlConnect(NULL); // localhost를 연결한다.

if(msql==MSQL_ERR) { print("mSQL 서버 연결 에러!\n"); return(-1); }

if(msqlSelectDB(msql,"welhelp")==MSQL_ERR) { print("DB error!\n"); return; }

mres= msqlListFields(msql, "addr"); // addr 테이블의 항목 리스트 얻기

if(mres==MSQL_ERR) { print("addr error!\n"); return(-1); }

fd= msqlFetchField(mres); // 첫번째 항목에 대한 정보를 얻는다.

printf("항목: %s, 테이블: %s, 자료형: %s [%d], 크기: %lu, 플래그: %X\n",

fd.name, fd.table, fd.type, fd.type_value, fd.length, fd.flags);

msqlFreeResult(mres);

msqlClose(msql);

------------------------------ [ 출력결과 ] ------------------------------

항목: name, 테이블: addr, 자료형: char [2], 크기: 10, 플래그: 1

15.1.17  msqlListTables()

1. 형식: mres_ptr= msqlListTables(msql)

2. 기능: 접속된 mSQL 서버에 대하여 msqlSelectDB() 함수로 선택한 데이터베이스의

테이블 목록을 얻는다.

3. 설명

(1) 이 함수는 mSQL에서 지원하는 함수이며 함수명은 mSQL의 C API와 동일하다.

(2) 인자 msql은 mSQL 포인터이며 mSQL 연결시 얻은 값이어야 하고 mSQL 포인터

가 아니면 에러 처리되며 이미 폐쇄된 mSQL 포인터일 때에는 경고 메시지를

출력하고 mres_ptr에 -1 의 값을 되돌린다.

(3) 선택된 데이터베이스의 테이블 목록을 얻지 못하면 정수 -1(MSQL_ERR) 이

mres_ptr에 돌려진다.

(4) 설명(2)와 설명(3)의 경우가 아니면 임시 저장된 자료에 대한 mSQL result

포인터가 mres_ptr에 돌려진다.

4. 사용예

// 아래의 예제는 welhelp 데이터베이스에 한개의 테이블만 존재한다고 가정함

msql= msqlConnect(NULL); // localhost를 연결한다.

if(msql==MSQL_ERR) { print("mSQL 서버 연결 에러!\n"); return(-1); }

if(msqlSelectDB(msql,"welhelp")==MSQL_ERR) { print("DB error!\n"); return; }

mres= msqlListTables(msql); // 얻이진 목록의 항목명은 Table 이다.

if(mres==MSQL_ERR) { print("error!\n"); return; }

msqlFetchGlobal(mres);            // Table 변수에 값이 얻어짐

msqlDataSeek(mres, 0); // 첫번째 위치로 다시 이동(테이블이 한개라고 가정함)

msqlFetchGlobal(mres, "테이블#"); // 테이블1 변수에 값이 얻어짐

msqlDataSeek(mres, 0); // 첫번째 위치로 다시 이동(테이블이 한개라고 가정함)

msqlFetchGlobal(mres, "ms_");     // ms_Table 변수에 값이 얻어짐

msqlFreeResult(mres); msqlClose(msql);

printf("welhelp 의 테이블명= [%s] [%s] [%s]\n", Table, 테이블1, ms_Table);

------------------------------ [ 출력결과 ] ------------------------------

welhelp 의 테이블명= [addr] [addr] [addr]

15.1.18  msqlNumFields()

1. 형식: field_count= msqlNumFields(mres_ptr)

2. 기능: 인자 mres_ptr의 임시 저장된 결과 자료에서 항목의 개수를 얻는다.

3. 설명

(1) 이 함수는 mSQL에서 지원하는 함수이며 함수명은 mSQL의 C API와 동일하다.

(2) 인자 mres_ptr은 mSQL result 포인터이며 msqlStoreResult()함수나 기타

결과를 저장하는 함수에 의하여 얻은 값이어야 하고 mSQL result 포인터가

아니면 에러 처리되며, 이미 해제된 mSQL result 포인터일 때에는 경고

메시지를 출력하고 field_count에 -1 의 값을 되돌린다.

(3) field_count에는 항목 개수를 의미하는 정수가 돌려진다.

4. 사용예

// 아래 프로그램은 mSQL 서버가 정상 작동하지 않거나 또는 welhelp 라는

// 데이터베이스가 없거나 addr 이라는 테이블이 없으면 에러가 발생한다.

msql= msqlConnect(NULL); // localhost에 연결함

if(msql==MSQL_ERR) { print("mSQL 서버 연결 에러!\n"); return(-1); }

if(msqlSelectDB(msql, "welhelp")==MSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n"); return(-1);

}

query= "select * from addr"; // addr 테이블의 모든 항목을 선택

if(msqlQuery(msql, query)==MSQL_ERR)

{

print("query error!\n"); return(-1);

}

mres= msqlStoreResult(); // 추출된 자료를 저장하고 포인터를 돌려줌

row_count= msqlNumRows(mres); // 추출된 자료의 레코드 개수 얻기

field_count= msqlNumFields(mres); // 추출된 자료의 항목 개수 얻기

msqlDataSeek(mres, 1); // 2번째 레코드로 이동한다.

row_count-= 1; // 추출된 레코드의 개수를 조정

for(i=0; i<row_count; i++)

{

row= msqlFetchRow(mres); // 저장된 자료에서 한 레코드를 읽는다

if( isarray(row) ) // 또는 if(row!=MSQL_ERR)

for(j=0; j<field_count; j++) print("\t", row[j]); // 항목 출력

print();

}

msqlFreeResult(mres); // 임시 저장된 자료를 해제(free)한다.

msqlClose(msql); // mSQL 서버와의 접속을 해제한다.

------------------------------ [ 출력결과 ] ------------------------------

한여름	35	oo시 oo동 456번지

서지연	20	A시 B동 789번지

15.1.19  msqlNumRows()

1. 형식: row_count= msqlNumRows(mres_ptr)

2. 기능: 인자 mres_ptr의 임시 저장된 결과 자료에서 레코드의 개수를 얻는다.

3. 설명

(1) 이 함수는 mSQL에서 지원하는 함수이며 함수명은 mSQL의 C API와 동일하다.

(2) 인자 mres_ptr은 mSQL result 포인터이며 msqlStoreResult()함수나 기타

결과를 저장하는 함수에 의하여 얻은 값이어야 하고 mSQL result 포인터가

아니면 에러 처리되며, 이미 해제된 mSQL result 포인터일 때에는 경고

메시지를 출력하고 row_count에 -1 의 값을 되돌린다.

(3) row_count에는 레코드 개수를 의미하는 정수가 돌려진다.

4. 사용예

// 아래 프로그램은 mSQL 서버가 정상 작동하지 않거나 또는 welhelp 라는

// 데이터베이스가 없거나 addr 이라는 테이블이 없으면 에러가 발생한다.

msql= msqlConnect(NULL); // localhost에 연결함

if(msql==MSQL_ERR) { print("mSQL 서버 연결 에러!\n"); return(-1); }

if(msqlSelectDB(msql, "welhelp")==MSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n"); return(-1);

}

query= "select * from addr"; // addr 테이블의 모든 항목을 선택

if(msqlQuery(msql, query)==MSQL_ERR)

{

print("query error!\n"); return(-1);

}

mres= msqlStoreResult(); // 추출된 자료를 저장하고 포인터를 돌려줌

row_count= msqlNumRows(mres); // 추출된 자료의 레코드 개수 얻기

field_count= msqlNumFields(mres); // 추출된 자료의 항목 개수 얻기

msqlDataSeek(mres, 1); // 2번째 레코드로 이동한다.

row_count-= 1; // 추출된 레코드의 개수를 조정

for(i=0; i<row_count; i++)

{

row= msqlFetchRow(mres); // 저장된 자료에서 한 레코드를 읽는다

if( isarray(row) ) // 또는 if(row!=MSQL_ERR)

for(j=0; j<field_count; j++) print("\t", row[j]); // 항목 출력

print();

}

msqlFreeResult(mres); // 임시 저장된 자료를 해제(free)한다.

msqlClose(msql); // mSQL 서버와의 접속을 해제한다.

------------------------------ [ 출력결과 ] ------------------------------

한여름	35	oo시 oo동 456번지

서지연	20	A시 B동 789번지

15.1.20  msqlQuery()

1. 형식: result= msqlQuery(msql, query)

2. 기능: 인자 msql으로 접속된 mSQL 서버에 인자 query의 SQL 질의어를 전달하여

실행한다.

3. 설명

(1) 이 함수는 mSQL에서 지원하는 함수이며 함수명은 mSQL의 C API와 동일하다.

(2) 인자 msql은 mSQL 포인터이며 mSQL 연결시 얻은 값이어야 하고 mSQL 포인터

가 아니면 에러 처리되며 이미 폐쇄된 mSQL 포인터일 때에는 경고 메시지를

출력하고 result에 -1 의 값을 되돌린다.

(3) 인자 query는 SQL 질의어로 문자열이어야 하며 수치이면 문자열로 변환된다.

(4) result의 값이 정수 -1(MSQL_ERR)이면 질의어 실행을 실패한 경우이다.

4. 사용예

// 아래 프로그램은 mSQL 서버가 정상 작동하지 않거나 또는 welhelp 라는

// 데이터베이스가 없거나 addr 이라는 테이블이 없으면 에러가 발생한다.

msql= msqlConnect(NULL); // localhost에 연결함

if(msql==MSQL_ERR) { print("mSQL 서버 연결 에러!\n"); return(-1); }

if(msqlSelectDB(msql, "welhelp")==MSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n"); return(-1);

}

query= "select * from addr"; // addr 테이블의 모든 항목을 선택

if(msqlQuery(msql, query)==MSQL_ERR)

{

print("query error!\n"); return(-1);

}

mres= msqlStoreResult(); // 추출된 자료를 저장하고 포인터를 돌려줌

row_count= msqlNumRows(mres); // 추출된 자료의 레코드 개수 얻기

field_count= msqlNumFields(mres); // 추출된 자료의 항목 개수 얻기

msqlDataSeek(mres, 1); // 2번째 레코드로 이동한다.

row_count-= 1; // 추출된 레코드의 개수를 조정

for(i=0; i<row_count; i++)

{

row= msqlFetchRow(mres); // 저장된 자료에서 한 레코드를 읽는다

if( isarray(row) ) // 또는 if(row!=MSQL_ERR)

for(j=0; j<field_count; j++) print("\t", row[j]); // 항목 출력

print();

}

msqlFreeResult(mres); // 임시 저장된 자료를 해제(free)한다.

msqlClose(msql); // mSQL 서버와의 접속을 해제한다.

------------------------------ [ 출력결과 ] ------------------------------

한여름	35	oo시 oo동 456번지

서지연	20	A시 B동 789번지

15.1.21  msqlQueryResult()

1. 형식: mres_ptr= msqlQueryResult(msql, query)

2. 기능: 인자 msql으로 접속된 mSQL 서버에 인자 query의 SQL 질의어를 전달하여

실행한 후 결과 자료를 임시 저장한다. 즉, msqlQuery() 함수를 실행한 후

msqlStoreResult() 함수를 실행하는 것과 같다.

3. 설명

(1) 이 함수는 mSQL에서 지원하지 않으며 msqlQuery() 와 msqlStoreResult()를

응용한 것이다.

(2) 인자 msql은 mSQL 포인터이며 mSQL 연결시 얻은 값이어야 하고 mSQL 포인터

가 아니면 에러 처리되며 이미 폐쇄된 mSQL 포인터일 때에는 경고 메시지를

출력하고 result에 -1 의 값을 되돌린다.

(3) 인자 query는 SQL 질의어로 문자열이어야 하며 수치이면 문자열로 변환된다.

(4) 임시 저장된 자료에 대한 mSQL result 포인터가 mres_ptr에 돌려진다.

(5) mres_ptr의 값이 정수 -1(MSQL_ERR)이면 질의어 실행을 실패한 경우이다.

(6) mres_ptr의 값이 정수 0 이면 결과를 저장할 수 없거나 또는 인자 query가

결과 자료가 없는 SQL 질의어인 경우이다.(예: INSERT, DELETE, UPDATE 등)

4. 사용예

// 아래 프로그램은 mSQL 서버가 정상 작동하지 않거나 또는 welhelp 라는

// 데이터베이스가 없거나 addr 이라는 테이블이 없으면 에러가 발생한다.

msql= msqlConnect(NULL); // localhost에 연결함

if(msql==MSQL_ERR) { print("mSQL 서버 연결 에러!\n"); return(-1); }

if(msqlSelectDB(msql, "welhelp")==MSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n");

return(-1);

}

query= "select * from addr"; // addr 테이블의 모든 항목을 선택

mres= msqlQueryResult(msql, query);

if(mres==MSQL_ERR) { print("query error!!\n"); return(-1); }

if(mres==NULL) { print("store result error!\n"); return(-1); }

while( msqlFetchGlobal(mres) > 0 )

{

print("\t", name);    // addr 테이블의 name 항목의 값은 name

print("\t", age);     // addr 테이블의 age 항목의 값은 age

print("\t", address); // addr 테이블의 address 항목의 값은 address

print(); // 줄을 바꿔준다.

}

msqlFreeResult(mres); // 임시 저장된 자료를 해제(free)한다.

msqlClose(msql); // mSQL 서버와의 접속을 해제한다.

------------------------------ [ 출력결과 ] ------------------------------

홍길동	28	xx시 xx동 123번지

한여름	35	oo시 oo동 456번지

서지연	20	A시 B동 789번지

15.1.22  msqlSelectDB()

1. 형식: result= msqlSelectDB(msql, db_name)

2. 기능: 인자 msql으로 접속된 mSQL 서버로부터 인자 db_name의 데이터베이스를

선택한다.

3. 설명

(1) 이 함수는 mSQL에서 지원하는 함수이며 함수명은 mSQL의 C API와 동일하다.

(2) 인자 msql은 mSQL 포인터이며 mSQL 연결시 얻은 값이어야 하고 mSQL 포인터

가 아니면 에러 처리되며 이미 폐쇄된 mSQL 포인터일 때에는 경고 메시지를

출력하고 result에 -1 의 값을 되돌린다.

(3) 인자 db_name은 선택할 데이터베이스 이름으로 문자열이어야 하며 수치이면

문자열로 형변환된다.

(4) result의 값이 정수 -1(MSQL_ERR)이면 데이터베이스 선택을 실패한 경우로

대부분 해당 데이터베이스의 이름이 mSQL 서버에 없는 경우이다.

4. 사용예

// 아래 프로그램은 mSQL 서버가 정상 작동하지 않거나 또는 welhelp 라는

// 데이터베이스가 없거나 addr 이라는 테이블이 없으면 에러가 발생한다.

msql= msqlConnect(NULL); // localhost에 연결함

if(msql==MSQL_ERR) { print("mSQL 서버 연결 에러!\n"); return(-1); }

if(msqlSelectDB(msql, "welhelp")==MSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n"); return(-1);

}

query= "select * from addr"; // addr 테이블의 모든 항목을 선택

if(msqlQuery(msql, query)==MSQL_ERR)

{

print("query error!\n"); return(-1);

}

mres= msqlStoreResult(); // 추출된 자료를 저장하고 포인터를 돌려줌

row_count= msqlNumRows(mres); // 추출된 자료의 레코드 개수 얻기

field_count= msqlNumFields(mres); // 추출된 자료의 항목 개수 얻기

msqlDataSeek(mres, 1); // 2번째 레코드로 이동한다.

row_count-= 1; // 추출된 레코드의 개수를 조정

for(i=0; i<row_count; i++)

{

row= msqlFetchRow(mres); // 저장된 자료에서 한 레코드를 읽는다

if( isarray(row) ) // 또는 if(row!=MSQL_ERR)

for(j=0; j<field_count; j++) print("\t", row[j]); // 항목 출력

print();

}

msqlFreeResult(mres); // 임시 저장된 자료를 해제(free)한다.

msqlClose(msql); // mSQL 서버와의 접속을 해제한다.

------------------------------ [ 출력결과 ] ------------------------------

한여름	35	oo시 oo동 456번지

서지연	20	A시 B동 789번지

15.1.23  msqlStoreResult()

1. 형식: mres_ptr= msqlStoreResult()

2. 기능: msqlQuery() 함수를 실행하여 SQL 질의어에 대한 결과 자료가 있을 때

그 결과 자료를 임시 저장하는 역할을 한다.

3. 설명

(1) 이 함수는 mSQL에서 지원하는 함수이며 함수명은 mSQL의 C API와 동일하다.

(2) 임시 저장된 자료에 대한 mSQL result 포인터가 mres_ptr에 돌려진다.

(3) mres_ptr이 정수 -1(MSQL_ERR)이면 에러가 발생한 경우이다.

4. 사용예

// 아래 프로그램은 mSQL 서버가 정상 작동하지 않거나 또는 welhelp 라는

// 데이터베이스가 없거나 addr 이라는 테이블이 없으면 에러가 발생한다.

msql= msqlConnect(NULL); // localhost에 연결함

if(msql==MSQL_ERR) { print("mSQL 서버 연결 에러!\n"); return(-1); }

if(msqlSelectDB(msql, "welhelp")==MSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n"); return(-1);

}

query= "select * from addr"; // addr 테이블의 모든 항목을 선택

if(msqlQuery(msql, query)==MSQL_ERR)

{

print("query error!\n"); return(-1);

}

mres= msqlStoreResult(); // 추출된 자료를 저장하고 포인터를 돌려줌

row_count= msqlNumRows(mres); // 추출된 자료의 레코드 개수 얻기

field_count= msqlNumFields(mres); // 추출된 자료의 항목 개수 얻기

msqlDataSeek(mres, 1); // 2번째 레코드로 이동한다.

row_count-= 1; // 추출된 레코드의 개수를 조정

for(i=0; i<row_count; i++)

{

row= msqlFetchRow(mres); // 저장된 자료에서 한 레코드를 읽는다

if( isarray(row) ) // 또는 if(row!=MSQL_ERR)

for(j=0; j<field_count; j++) print("\t", row[j]); // 항목 출력

print();

}

msqlFreeResult(mres); // 임시 저장된 자료를 해제(free)한다.

msqlClose(msql); // mSQL 서버와의 접속을 해제한다.

------------------------------ [ 출력결과 ] ------------------------------

한여름	35	oo시 oo동 456번지

서지연	20	A시 B동 789번지

15.2  MySQL 데이터베이스 함수

15.2.1  MySQL 사용 절차

1. MySQL database 사용 절차(방법#1)

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ 1. mysql_connect() 함수로 MySQL 서버를 연결한다.                 □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

↓

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ 2. mysql_select_db() 함수로 데이터베이스를 선택한다.             □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

↓

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ 3. mysql_query() 함수로 SQL 질의어를 실행하여 자료를 추출한다.   □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

↓

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ 4. mysql_store_result() 함수로 추출한 자료를 임시 저장한다.      □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

↓

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ 5. mysql_num_rows() 함수로 추출된 자료의 레코드 개수를 얻어온다. □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

↓

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ 6. mysql_num_fields() 함수로 항목의 개수를 얻어온다.             □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□

□□□□□□□□□□□□□□□□→□

□                                ↓

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□□ 7. mysql_fetch_row() 함수로 추출된 레코드를 한개씩 얻어온다.     □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□                                ↓

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□□ 8. mysql_fetch_row()의 리턴값인 항목에 대한 배열을 처리한다.     □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□                                □

□                                □

□□□□□□□□□□□□□□□□□◇ 추출한 마지막 레코드까지 반복한다.

□

↓

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ 9. mysql_free_result() 함수로 임시 저장했던 자료를 해제한다.     □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

↓

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ 10. mysql_close() 함수로 MySQL의 접속을 종료한다.                □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

2. MySQL database 사용 절차(방법#2)

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ 1. mysql_connect() 함수로 MySQL 서버를 연결한다.                 □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

↓

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ 2. mysql_select_db() 함수로 데이터베이스를 선택한다.             □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

↓

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ 3. mysql_query_result() 함수로 SQL 질의어를 실행한 후 자료가     □

□    임시 저장된 포인터를 얻어온다.                                □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□

□□□□□□□□□□□□□□□□→□

□                                ↓

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□□ 4. mysql_fetch_row(), mysql_fetch_global(), mysql_fetch_object() □

□□    함수중의 하나를 이용하여 레코드를 한개씩 얻어온다.            □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□                                □

□                                □

□□□□□□□□□□□□□□□□□◇ 추출한 마지막 레코드까지 반복한다.

□

↓

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ 5. mysql_free_result() 함수로 임시 저장된 자료를 해제한다.       □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

↓

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□ 6. mysql_close() 함수로 MySQL의 접속을 종료한다.                 □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

15.2.2  mysql_close()

1. 형식: result= mysql_close(mysql)

2. 기능: 인자 mysql의 MySQL 접속을 폐쇄(해제)한다.

3. 설명

(1) 이 함수는 MySQL에서 지원하는 함수이며 함수명은 MySQL의 C API와 동일하다.

(2) 인자 mysql은 MySQL 포인터이며 MySQL 연결시 얻은 값이고 MySQL 포인터가

아니면 에러 처리되며, 이미 폐쇄된 MySQL 포인터일 때에는 경고 메시지를

출력하고 result에 -1 의 값을 되돌린다.

(3) 설명(2)의 경우가 아니면 항상 정수 1 이 result에 돌려진다.

4. 사용예

mysql= mysql_connect(NULL, myuser, mypass); // localhost를 연결한다.

mysql_close(mysql); // MySQL 서버와의 접속을 폐쇄한다.

------------------------------ [ 출력결과 ] ------------------------------

15.2.3  mysql_connect()

1. 형식: mysql= mysql_connect(hostname, user, passwd)

2. 기능: MySQL 서버에 접속을 한다.  MySQL 데이터베이스를 사용하려면 MySQL관련

함수중에서 가장 먼저 이 함수를 사용해야한다.  접속하지 못하면 결과값

mysql에 -1(MYSQL_ERR)이 돌려지며 성공하면 MySQL 포인터가 돌려진다.

3. 설명

(1) 이 함수는 MySQL에서 지원하는 함수이며 함수명은 MySQL의 C API와 동일하다.

(2) 인자 hostname, user, passwd는 문자열이며 수치이면 문자열로 변환된다.

(3) 인자 hostname의 값은 MySQL 서버의 호스트명이나 IP 주소이다.

(4) 인자 hostname의 값이 NULL 또는 ""이면 localhost에 접속을 시도한다.

(5) 인자 user는 MySQL의 사용자로 등록된 사용자명이어야 한다.

(6) 인자 passwd는 MySQL 사용자의 등록된 암호이어야 한다.

(7) 결과값 mysql은 연결된 MySQL에 대한 MySQL 포인터이다.

(8) 동일 또는 서로 다른 호스트의 MySQL 데이터베이스를  동시에  여러개 연결

했을 때, 이 함수의 리턴값인 mysql로 각각을 구별하며 파일 입출력시 파일

포인터처럼 중요한 의미를 지닌다.

(9) mysql의 값이 -1(MYSQL_ERR)이면 MySQL 서버에 접속을 실패한 경우이다.

4. 사용예

mysql= mysql_connect(NULL, myuser, mypass); // localhost를 연결한다.

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return; }

print("MySQL 서버를 연결하였습니다!\n");

mysql_close(mysql); // mysql DB와의 접속을 폐쇄한다.

------------------------------ [ 출력결과 ] ------------------------------

MySQL 서버를 연결하였습니다!

15.2.4  mysql_data_seek()

1. 형식: result= mysql_data_seek(myres_ptr, pos)

2. 기능: 인자 myres_ptr의 임시 저장된 결과 자료에서 인자 pos번째 레코드의

위치로 이동한다.

3. 설명

(1) 이 함수는 MySQL에서 지원하는 함수이며 함수명은 MySQL의 C API와 동일하다.

(2) 인자 myres_ptr은 MySQL result 포인터이며 mysql_store_result()함수나 기타

결과를 저장하는 함수에 의하여 얻은 값이고 MySQL result 포인터가 아니면

에러 처리되며, 이미 해제된 MySQL result 포인터일 때에는 경고 메시지를

출력하고 result에 -1 의 값을 되돌린다.

(3) 인자 pos는 레코드에 대한 순번( 0 부터 레코드 개수 - 1 )이며 이 값이

문자열이고 수치로 변환될 수 없을 때는 에러 처리된다.

(4) 인자 pos가 0보다 작거나 또는 레코드의 개수보다 크거나 같으면 정수 -1 이

result에 돌려진다.

(5) 위의 설명(2)나 설명(4)의 경우가 아니면 정수 1 이 result에 돌려진다.

4. 사용예

// 아래 프로그램은 MySQL 서버가 정상 작동하지 않거나 또는 welhelp 라는

// 데이터베이스가 없거나 addr 이라는 테이블이 없으면 에러가 발생한다.

mysql= mysql_connect(NULLL, myuser, mypass); // localhost에 연결함

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return(-1); }

if(mysql_select_db(mysql, "welhelp")==MYSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n"); return(-1);

}

query= "select * from addr"; // addr 테이블의 모든 항목을 선택

if(mysql_query(mysql, query)==MYSQL_ERR)

{

print("query error!!\n"); return(-1);

}

myres= mysql_store_result(mysql); // 추출된 자료를 저장하고 포인터를 돌려줌

row_count= mysql_num_rows(myres); // 추출된 자료의 레코드 개수 얻기

field_count= mysql_num_fields(myres); // 추출된 자료의 항목 개수 얻기

mysql_data_seek(myres, 1); // 2번째 레코드로 이동한다.

row_count-= 1; // 추출된 레코드의 개수를 조정

for(i=0; i<row_count; i++)

{

row= mysql_fetch_row(myres); // 저장된 자료에서 한 레코드를 읽는다

if( isarray(row) ) // 또는 if(row!=MYSQL_ERR)

for(j=0; j<field_count; j++) print("\t", row[j]); // 항목 출력

print();

}

mysql_free_result(myres); // 임시 저장된 자료를 해제(free)한다.

mysql_close(mysql); // MySQL 서버와의 접속을 해제한다.

------------------------------ [ 출력결과 ] ------------------------------

한여름	35	oo시 oo동 456번지

서지연	20	A시 B동 789번지

15.2.5  mysql_errno()

1. 형식: err_no= mysql_errno(mysql)

2. 기능: 가장 최근에 수행된 MySQL 관련 함수에 대한 에러 코드를 얻는다.

3. 설명

(1) 이 함수는 MySQL에서 지원하는 함수이며 함수명은 MySQL의 C API와 동일하다.

(2) 인자 mysql은 MySQL 포인터이며 MySQL 연결시 얻은 값이고 MySQL 포인터가

아니면 에러 처리되며, 이미 폐쇄된 MySQL 포인터일 때에는 경고 메시지를

출력하고 result에 -1 의 값을 되돌린다.

(3) 에러 코드가 err_no에 돌려지며 그 값이 0 이면 에러가 없는 경우이다.

(4) err_no의 에러 코드는 MySQL 데이터베이스에서 지원하며 에러 코드의 종류나

그 의미는 MySQL에 관련된 메뉴얼을 참고하여야 한다.

4. 사용예

mysql= mysql_connect(NULLL, myuser, mypass); // localhost를 연결한다.

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return; }

mysql_select_db(mysql, "no_db"); // no_db 의 데이터베이스가 없다고 가정함

err_code= mysql_errno(mysql);

mysql_close(mysql); // MySQL 서버와의 접속을 폐쇄한다.

print("error code= ", err_code, "\n");

------------------------------ [ 출력결과 ] ------------------------------

error code= 1049

15.2.6  mysql_error()

1. 형식: err_msg= mysql_error(mysql)

2. 기능: 가장 최근에 수행된 MySQL 관련 함수에 대한 에러 메시지를 얻는다.

3. 설명

(1) 이 함수는 MySQL에서 지원하는 함수이며 함수명은 MySQL의 C API와 동일하다.

(2) 인자 mysql은 MySQL 포인터이며 MySQL 연결시 얻은 값이고 MySQL 포인터가

아니면 에러 처리되며, 이미 폐쇄된 MySQL 포인터일 때에는 경고 메시지를

출력하고 result에 -1 의 값을 되돌린다.

(3) 에러 메시지에 대한 문자열이 err_msg에 돌려지며 그 값이 Null string("")

이면 에러가 발생하지 않은 것이다.

(4) err_msg의 에러 메시지는 MySQL 데이터베이스에서 지원하며 메시지의 종류나

그 의미는 MySQL에 관련된 메뉴얼을 참고하여야 한다.

4. 사용예

mysql= mysql_connect(NULLL, myuser, mypass); // localhost를 연결한다.

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return; }

rt= mysql_select_db(mysql, "no_db"); // no_db의 데이터베이스가 없다고 가정함

errmsg= mysql_error(mysql);

mysql_close(mysql); // MySQL 서버와의 접속을 폐쇄한다.

printf("rt= %d  errmsg= %s\n", rt, errmsg);

------------------------------ [ 출력결과 ] ------------------------------

rt= -1  errmsg= 데이타베이스 'no_db'는 알수 없음

15.2.7  mysql_fetch_field()

1. 형식

형식1) result= mysql_fetch_field(myres_ptr)

형식2) result= mysql_fetch_field(myres_ptr, field_no)

2. 기능: 인자 myres_ptr의 항목에 대한 정보(이름, 소속 테이블, 초기값, 자료형,

크기, 최대 크기, 플래그, 소수 아래 자리수)를 객체로 얻는다.

3. 설명

(1) 이 함수는 MySQL에서 지원하는 함수이며 함수명은 MySQL의 C API와 동일하다.

(2) 인자 myres_ptr은 MySQL result 포인터이며 mysql_store_result()함수나 기타

결과를 저장하는 함수에 의하여 얻은 값이고 MySQL result 포인터가 아니면

에러 처리되며, 이미 해제된 MySQL result 포인터일 때에는 경고 메시지를

출력하고 result에 -1 의 값을 되돌린다.

(3) 형식1)은 필드 커서 위치, 형식2)는 field_no 위치의 항목 정보를 얻는다.

(4) 형식2)의 인자 field_no는 항목에 대한 순번( 0 부터 항목개수 - 1 )이며 이

값이 문자열이고 수치로 변환될 수 없을 때는 에러 처리된다.

(5) 형식2)의 인자 field_no가 0 보다 작거나 또는 항목의 개수보다 크거나 같으

면 정수 -1 이 result에 돌려진다.

(6) 위의 설명(2)나 설명(5)의 경우가 아니면 설명(7)의 멤버 변수를 지닌 객체가

result에 돌려진다.

(7) 결과값 객체인 result의 멤버변수 설명

객체와 멤버변수명	자료형	설 명
result.name	문자열	항목의 이름
result.table	문자열	소속 테이블 이름
result.default	문자열	항목의 초기값
result.type	문자열	항목의 자료형
result.type_value	정수	항목의 자료형을 의미하는 수치
result.length	정수	항목의 크기(bytes)
result.max_length	정수	항목의 최대 크기(bytes)
result.decimals	정수	항목의 소수아래 자리수
result.flags	정수	항목의 플래그

1) result.type의 값 설명(MySQL의 버전에 따라 차이가 있을 수 있음)

값	자료형	값	자료형	값	자료형	값	자료형
0	decimal	6	null	12	datetime	250	mediumblob mediumtext
1	tinyint	7	timestamp	13	year	251	longblob longtext
2	smallint	8	bigint	14	date	252	blob text
3	int	9	mediumint	247	enum	253	varchar
4	float	10	date	248	set	254	char
5	double	11	time	249	tinyblob tinytext

2) result.flags의 설명(MySQL의 버전에 따라 차이가 있을 수 있음)

bit번호 (10진값)	15 (32768)	14 (16384)	13 (8192)	12 (4096)	11 (2048)	10 (1024)	9 (512)	8 (256)
의미						GROUP FLAG	PART KEY	ENUM FLAG

bit번호 (10진값)	7 (128)	6 (64)	5 (32)	4 (16)	3 (8)	2 (4)	1 (2)	0 (1)
의미	BINARY FLAG	ZEROFILL FLAG	UNSIGNED FLAG	BLOB FLAG	MULTIPLE KEY	UNIQUE KEY	PRIMARY KEY	NOT NULL

4. 사용예#1

mysql= mysql_connect(NULL, myuser, mypass); // localhost를 연결한다.

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return(-1); }

if(mysql_select_db(mysql, "welhelp")==MYSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n"); return(-1);

}

myres= mysql_list_fields(mysql, "addr"); // addr 테이블의 항목 리스트 얻기

if(myres==MYSQL_ERR) { print("addr error!\n"); return; }

fd= mysql_fetch_field(myres, 1); // 두번째 항목에 대한 정보를 얻는다.

printf("%s %s %s [%d] (%s) %lu %lu %u %u\n", fd.name, fd.table, fd.type,

fd.type_value,fd.default,fd.length,fd.max_length,fd.decimals,fd.flags);

mysql_free_result(myres);

mysql_close(mysql);

------------------------------ [ 출력결과 ] ------------------------------

age addr int [3] () 4 0 0 0

5. 사용예#2

mysql= mysql_connect(NULL, myuser, mypass); // localhost를 연결한다.

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return(-1); }

if(mysql_select_db(mysql, "welhelp")==MYSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n"); return(-1);

}

myres= mysql_list_fields(mysql, "addr"); // addr 테이블의 항목 리스트 얻기

if(myres==MYSQL_ERR) { print("addr error!\n"); return; }

mysql_field_seek(myres, 2); // 3번째 항목으로 필드 커서를 이동한다.

fd= mysql_fetch_field(myres); // 필드 커서의 항목에 대한 정보를 얻는다.

printf("%s %s %s [%d] (%s) %lu %lu %u %u\n", fd.name, fd.table, fd.type,

fd.type_value,fd.default,fd.length,fd.max_length,fd.decimals,fd.flags);

mysql_free_result(myres);

mysql_close(mysql);

------------------------------ [ 출력결과 ] ------------------------------

address addr tinytext [252] () 255 0 0 16

6. 사용예#3

mysql= mysql_connect(NULL, myuser, mypass); // localhost를 연결한다.

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return(-1); }

if(mysql_select_db(mysql,"welhelp")==-1) { print("DB Err!"); return(-1); }

myres= mysql_list_fields(mysql, "addr"); // addr 테이블의 항목 리스트 얻기

if(myres==MYSQL_ERR) { print("addr error!\n"); return; }

while( (fd= mysql_fetch_field(myres))!=MYSQL_ERR ) {

printf("   %s %s %s [%d] (%s) %lu %lu %u %u\n", fd.name,fd.table,fd.type,

fd.type_value, fd.default, fd.length, fd.max_length,

fd.decimals, fd.flags);

}

mysql_free_result(myres); mysql_close(mysql);

------------------------------ [ 출력결과 ] ------------------------------

name addr tinytext [252] () 255 0 0 17

age addr int [3] () 4 0 0 0

address addr tinytext [252] () 255 0 0 16

15.2.8  mysql_fetch_global()

1. 형식

형식1) result= mysql_fetch_global(myres_ptr)

형식2) result= mysql_fetch_global(myres_ptr, prefix)

2. 기능: 인자 myres_ptr의 임시 저장된 결과 자료에서 한 레코드씩 순차적으로 읽어

전역변수로 항목의 값을 얻는다. 이때 형식1)은 데이터베이스의 항목 명칭

과 같은 변수명의 전역변수,  형식2)에서  인자 prefix로 지정한 접두사가

포함된 항목 명칭의 전역변수,  항목 명칭과 무관하게 인자 prefix에 순번

을 부여한 변수명의 전역변수로 값을 얻어올 수 있다.

( setlocal(ON) 이면 전역 변수, setlocal(OFF) 이면 지역 변수에 대입된다 )

3. 설명

(1) 이 함수는 MySQL에서 지원하지 않으며 mysql_fetch_row()를 응용한 것이다.

(2) 인자 myres_ptr은 MySQL result 포인터이며 mysql_store_result()함수나 기타

결과를 저장하는 함수에 의하여 얻은 값이고 MySQL result 포인터가 아니면

에러 처리되며, 이미 해제된 MySQL result 포인터일 때에는 경고 메시지를

출력하고 result에 -1 의 값을 되돌린다.

(3) 형식1)은 데이터베이스의 항목 명칭과 동일한 전역변수에 값이 돌려진다.

(4) 형식2)는 인자 prefix에 의해 응용된 명칭의 전역변수에 값이 돌려진다.

(5) 인자 prefix는 문자열이어야 하며 문자열이 아니면 형변환된다.

(6) 인자 prefix가 15 문자(bytes)를 초과하거나 그 값이 변수명 작성규칙(첫글자

는 영문/한글, 그 다음부터는 숫자도 조합가능)에 위배되면 에러 처리된다.

(7) 인자 prefix의 값이 '#'으로 끝나면 '#' 문자를 제외한 명칭에 순번(1 부터

항목개수)을 부여한 변수명으로 값이 돌려지며,  '#'으로 끝나지 않으면

prefix의 값에 데이터베이스의 항목명칭을 조합한 변수명에 값이 돌려진다.

(예를 들어 myres_ptr의 대상 항목의 명칭이 각각 name과 addr이고 prefix의

값이 "DB"이면 이 함수를 수행한 후에는 name 항목의 값은 DBname , addr 항

목의 값은 DBaddr에 기억되며, prefix의 값이 "Field#"과 같이 '#'으로 끝나

면 name 항목의 값은 Field1 , addr 항목의 값은 Field2에 기억된다)

(8) myres_ptr의 항목명이 변수명 작성규칙에 위배되면 그 항목은 field + 항목

순번(1부터)의 변수명에 값이 돌려진다.(예를 들어 3번째 항목의 항목명이

234abc와 같이 될 수 있다면 그 항목의 값은 field3의 변수명에 기억된다)

(9) 인자 prefix의 값이 NULL 또는 ""이면 형식1)과 같다.

(10) myres_ptr에 대한 항목의 개수가 결과값 result에 돌려진다.

(11) result의 값이 정수 -1(MYSQL_ERR)이면 에러가 발생한 경우이다.

4. 사용예#1

// 아래 프로그램은 MySQL 서버가 정상 작동하지 않거나 또는 welhelp 라는

// 데이터베이스가 없거나 addr 이라는 테이블이 없으면 에러가 발생한다.

mysql= mysql_connect(NULL, myuser, mypass); // localhost에 연결함

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return(-1); }

if(mysql_select_db(mysql, "welhelp")==MYSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n");

return(-1);

}

query= "select * from addr"; // addr 테이블의 모든 항목을 선택

myres= mysql_query_result(mysql, query);

if(myres==MYSQL_ERR) { print("query error!!\n"); return(-1); }

if(myres==NULL) { print("store result error!\n"); return(-1); }

while( mysql_fetch_global(myres) > 0 )

{

print("\t", name);    // addr 테이블의 name 항목의 값은 name

print("\t", age);     // addr 테이블의 age 항목의 값은 age

print("\t", address); // addr 테이블의 address 항목의 값은 address

print(); // 줄을 바꿔준다.

}

mysql_free_result(myres); // 임시 저장된 자료를 해제(free)한다.

mysql_close(mysql); // MySQL 서버와의 접속을 해제한다.

------------------------------ [ 출력결과 ] ------------------------------

홍길동	28	xx시 xx동 123번지

한여름	35	oo시 oo동 456번지

서지연	20	A시 B동 789번지

5. 사용예#2

// 아래 프로그램은 MySQL 서버가 정상 작동하지 않거나 또는 welhelp 라는

// 데이터베이스가 없거나 addr 이라는 테이블이 없으면 에러가 발생한다.

mysql= mysql_connect(NULL, myuser, mypass); // localhost에 연결함

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return(-1); }

if(mysql_select_db(mysql, "welhelp")==MYSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n");

return(-1);

}

query= "select * from addr"; // addr 테이블의 모든 항목을 선택

myres= mysql_query_result(mysql, query);

if(myres==MYSQL_ERR) { print("query error!!\n"); return(-1); }

if(myres==NULL) { print("store result error!\n"); return(-1); }

while( mysql_fetch_global(myres, "DB_") > 0 )

{

print("\t", DB_name);    // addr 테이블의 name 항목의 값은 DB_name

print("\t", DB_age);     // addr 테이블의 age 항목의 값은 DB_age

print("\t", DB_address); // addr 의 address 항목의 값은 DB_address

print(); // 줄을 바꿔준다.

}

mysql_free_result(myres); // 임시 저장된 자료를 해제(free)한다.

mysql_close(mysql); // MySQL 서버와의 접속을 해제한다.

------------------------------ [ 출력결과 ] ------------------------------

홍길동	28	xx시 xx동 123번지

한여름	35	oo시 oo동 456번지

서지연	20	A시 B동 789번지

6. 사용예#3

// 아래 프로그램은 MySQL 서버가 정상 작동하지 않거나 또는 welhelp 라는

// 데이터베이스가 없거나 addr 이라는 테이블이 없으면 에러가 발생한다.

mysql= mysql_connect(NULL, myuser, mypass); // localhost에 연결함

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return(-1); }

if(mysql_select_db(mysql, "welhelp")==MYSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n");

return(-1);

}

query= "select * from addr"; // addr 테이블의 모든 항목을 선택

myres= mysql_query_result(mysql, query);

if(myres==MYSQL_ERR) { print("query error!!\n"); return(-1); }

if(myres==NULL) { print("store result error!\n"); return(-1); }

while( mysql_fetch_global(myres, "dbfield#") > 0 )

{

print("\t", dbfield1); // addr 테이블의 name 항목의 값은 dbfield1

print("\t", dbfield2); // addr 테이블의 age 항목의 값은 dbfield2

print("\t", dbfield3); // addr 테이블의 address 항목의 값은 dbfield3

print(); // 줄을 바꿔준다.

}

mysql_free_result(myres); // 임시 저장된 자료를 해제(free)한다.

mysql_close(mysql); // MySQL 서버와의 접속을 해제한다.

------------------------------ [ 출력결과 ] ------------------------------

홍길동	28	xx시 xx동 123번지

한여름	35	oo시 oo동 456번지

서지연	20	A시 B동 789번지

15.2.9  mysql_fetch_object()

1. 형식

형식1) result= mysql_fetch_object(myres_ptr)

형식2) result= mysql_fetch_object(myres_ptr, prefix)

2. 기능: 인자 myres_ptr의 임시 저장된 결과 자료에서 한 레코드씩 순차적으로 읽어

객체의 맴버변수로 항목의 값을 얻는다.  이때 형식1)은 데이터베이스의 항

목 명칭과 같은 변수명의 맴버변수,  형식2)에서 인자 prefix로 지정한  접

두사가 포함된 항목 명칭의 맴버변수, 항목 명칭과 무관하게 인자 prefix에

순번을 부여한 변수명의 맴버변수로 값을 얻어올 수 있다.

3. 설명

(1) 이 함수는 MySQL에서 지원하지 않으며 mysql_fetch_row()를 응용한 것이다.

(2) 인자 myres_ptr은 MySQL result 포인터이며 mysql_store_result()함수나 기타

결과를 저장하는 함수에 의하여 얻은 값이고 MySQL result 포인터가 아니면

에러 처리되며, 이미 해제된 MySQL result 포인터일 때에는 경고 메시지를

출력하고 result에 -1 의 값을 되돌린다.

(3) 형식1)은 데이터베이스의 항목 명칭과 동일한 맴버변수에 값이 돌려진다.

(4) 형식2)는 인자 prefix에 의해 응용된 명칭의 맴버변수에 값이 돌려진다.

(5) 인자 prefix는 문자열이어야 하며 문자열이 아니면 형변환된다.

(6) 인자 prefix가 15 문자(bytes)를 초과하거나 그 값이 변수명 작성규칙(첫글자

는 영문/한글, 그 다음부터는 숫자도 조합가능)에 위배되면 에러 처리된다.

(7) 인자 prefix의 값이 '#'으로 끝나면 '#' 문자를 제외한 명칭에 순번(1 부터

항목개수)을 부여한 변수명으로 값이 돌려지며,  '#'으로 끝나지 않으면

prefix의 값에 데이터베이스의 항목명칭을 조합한 변수명에 값이 돌려진다.

(예를 들어 myres_ptr의 대상 항목의 명칭이 각각 name과 addr이고 prefix의

값이 "DB"이면 이 함수를 수행한 후에는 name 항목의 값은 DBname , addr 항

목의 값은 DBaddr에 기억되며, prefix의 값이 "Field#"과 같이 '#'으로 끝나

면 name 항목의 값은 Field1 , addr 항목의 값은 Field2에 기억된다)

(8) myres_ptr의 항목명이 변수명 작성규칙에 위배되면 그 항목은 field + 항목

순번(1부터)의 변수명에 값이 돌려진다.(예를 들어 3번째 항목의 항목명이

234abc와 같이 될 수 있다면 그 항목의 값은 field3의 변수명에 기억된다)

(9) 인자 prefix의 값이 NULL 또는 ""이면 형식1)과 같다.

(10) 위의 설명에 관련된 맴버변수를 지닌 객체가 result에 돌려진다.

(11) result의 값이 객체가 아닌 정수 -1(MYSQL_ERR)이면 에러가 발생한 경우이다.

4. 사용예#1

// 아래 프로그램은 MySQL 서버가 정상 작동하지 않거나 또는 welhelp 라는

// 데이터베이스가 없거나 addr 이라는 테이블이 없으면 에러가 발생한다.

mysql= mysql_connect(NULL, myuser, mypass); // localhost에 연결함

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return(-1); }

if(mysql_select_db(mysql, "welhelp")==MYSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n");

return(-1);

}

query= "select * from addr"; // addr 테이블의 모든 항목을 선택

myres= mysql_query_result(mysql, query);

if(myres==MYSQL_ERR) { print("query error!!\n"); return(-1); }

if(myres==NULL) { print("store result error!\n"); return(-1); }

while( (rec=mysql_fetch_object(myres))!=MYSQL_ERR )

{

print("\t", rec.name);    // addr 테이블의 name 항목의 값은 rec.name

print("\t", rec.age);     // addr 테이블의 age 항목의 값은 rec.age

print("\t", rec.address); // addr 의 address 항목의 값은 rec.address

print(); // 줄을 바꿔준다.

}

mysql_free_result(myres); // 임시 저장된 자료를 해제(free)한다.

mysql_close(mysql); // MySQL 서버와의 접속을 해제한다.

------------------------------ [ 출력결과 ] ------------------------------

홍길동	28	xx시 xx동 123번지

한여름	35	oo시 oo동 456번지

서지연	20	A시 B동 789번지

5. 사용예#2

// 아래 프로그램은 MySQL 서버가 정상 작동하지 않거나 또는 welhelp 라는

// 데이터베이스가 없거나 addr 이라는 테이블이 없으면 에러가 발생한다.

mysql= mysql_connect(NULL, myuser, mypass); // localhost에 연결함

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return(-1); }

if(mysql_select_db(mysql, "welhelp")==MYSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n");

return(-1);

}

query= "select * from addr"; // addr 테이블의 모든 항목을 선택

myres= mysql_query_result(mysql, query);

if(myres==MYSQL_ERR) { print("query error!!\n"); return(-1); }

if(myres==NULL) { print("store result error!\n"); return(-1); }

while( isobject(rec=mysql_fetch_object(myres, "m_")) )

{

print("\t", rec.m_name);    // addr 의 name 항목의 값은 rec.m_name

print("\t", rec.m_age);     // addr 의 age 항목의 값은 rec.m_age

print("\t", rec.m_address); // addr의 address항목의 값은 rec.m_address

print(); // 줄을 바꿔준다.

}

mysql_free_result(myres); // 임시 저장된 자료를 해제(free)한다.

mysql_close(mysql); // MySQL 서버와의 접속을 해제한다.

------------------------------ [ 출력결과 ] ------------------------------

홍길동	28	xx시 xx동 123번지

한여름	35	oo시 oo동 456번지

서지연	20	A시 B동 789번지

6. 사용예#3

// 아래 프로그램은 MySQL 서버가 정상 작동하지 않거나 또는 welhelp 라는

// 데이터베이스가 없거나 addr 이라는 테이블이 없으면 에러가 발생한다.

mysql= mysql_connect(NULL, myuser, mypass); // localhost에 연결함

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return(-1); }

if(mysql_select_db(mysql, "welhelp")==MYSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n");

return(-1);

}

query= "select * from addr"; // addr 테이블의 모든 항목을 선택

myres= mysql_query_result(mysql, query);

if(myres==MYSQL_ERR) { print("query error!!\n"); return(-1); }

if(myres==NULL) { print("store result error!\n"); return(-1); }

while( isobject(rec=mysql_fetch_object(myres, "dbf#")) )

{

print("\t", rec.dbf1); // addr 의 name 항목의 값은 rec.dbf1

print("\t", rec.dbf2); // addr 의 age 항목의 값은 rec.dbf2

print("\t", rec.dbf3); // addr 의 address 항목의 값은 rec.dbf3

print(); // 줄을 바꿔준다.

}

mysql_free_result(myres); // 임시 저장된 자료를 해제(free)한다.

mysql_close(mysql); // MySQL 서버와의 접속을 해제한다.

------------------------------ [ 출력결과 ] ------------------------------

홍길동	28	xx시 xx동 123번지

한여름	35	oo시 oo동 456번지

서지연	20	A시 B동 789번지

15.2.10  mysql_fetch_row()

1. 형식: result= mysql_fetch_row(myres_ptr)

2. 기능: 인자 myres_ptr의 임시 저장된 결과 자료에서 한 레코드씩 순차적으로 읽어

배열로 항목의 값을 얻는다.

3. 설명

(1) 이 함수는 MySQL에서 지원하는 함수이며 함수명은 MySQL의 C API와 동일하다.

(2) 인자 myres_ptr은 MySQL result 포인터이며 mysql_store_result()함수나 기타

결과를 저장하는 함수에 의하여 얻은 값이고 MySQL result 포인터가 아니면

에러 처리되며, 이미 해제된 MySQL result 포인터일 때에는 경고 메시지를

출력하고 result에 -1 의 값을 되돌린다.

(3) myres_ptr에 대한 항목의 값이 배열로 result에 돌려진다.

(4) result의 값이 정수 -1(MYSQL_ERR)이면 에러가 발생한 경우이다.

4. 사용예

// 아래 프로그램은 MySQL 서버가 정상 작동하지 않거나 또는 welhelp 라는

// 데이터베이스가 없거나 addr 이라는 테이블이 없으면 에러가 발생한다.

mysql= mysql_connect(NULLL, myuser, mypass); // localhost에 연결함

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return(-1); }

if(mysql_select_db(mysql, "welhelp")==MYSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n"); return(-1);

}

query= "select * from addr"; // addr 테이블의 모든 항목을 선택

if(mysql_query(mysql, query)==MYSQL_ERR)

{

print("query error!!\n"); return(-1);

}

myres= mysql_store_result(mysql); // 추출된 자료를 저장하고 포인터를 돌려줌

row_count= mysql_num_rows(myres); // 추출된 자료의 레코드 개수 얻기

field_count= mysql_num_fields(myres); // 추출된 자료의 항목 개수 얻기

mysql_data_seek(myres, 1); // 2번째 레코드로 이동한다.

row_count-= 1; // 추출된 레코드의 개수를 조정

for(i=0; i<row_count; i++)

{

row= mysql_fetch_row(myres); // 저장된 자료에서 한 레코드를 읽는다

if( isarray(row) ) // 또는 if(row!=MYSQL_ERR)

for(j=0; j<field_count; j++) print("\t", row[j]); // 항목 출력

print();

}

mysql_free_result(myres); // 임시 저장된 자료를 해제(free)한다.

mysql_close(mysql); // MySQL 서버와의 접속을 해제한다.

------------------------------ [ 출력결과 ] ------------------------------

한여름	35	oo시 oo동 456번지

서지연	20	A시 B동 789번지

15.2.11  mysql_field_seek()

1. 형식: result= mysql_field_seek(myres_ptr, field_no)

2. 기능: 인자 myres_ptr의 필드 커서를 이동시키며 mysql_fetch_field() 함수로

필드 커서의 위치에 있는 항목의 정보를 얻어올 때 사용한다.

3. 설명

(1) 이 함수는 MySQL에서 지원하는 함수이며 함수명은 MySQL의 C API와 동일하다.

(2) 인자 myres_ptr은 MySQL result 포인터이며 mysql_store_result()함수나 기타

결과를 저장하는 함수에 의하여 얻은 값이고 MySQL result 포인터가 아니면

에러 처리되며, 이미 해제된 MySQL result 포인터일 때에는 경고 메시지를

출력하고 result에 -1 의 값을 되돌린다.

(3) 인자 field_no는 항목에 대한 순번( 0 부터 항목개수 - 1 )이며 이 값이

문자열이고 수치로 변환될 수 없을 때는 에러 처리된다.

(4) 인자 field_no가 0 보다 작거나 또는 항목의 개수보다 크거나 같으면 정수

-1 이 result에 돌려진다.

(5) 위의 설명(2)나 설명(4)의 경우가 아니면 정수 1 이 result에 돌려진다.

4. 사용예

mysql= mysql_connect(NULL, myuser, mypass); // localhost를 연결한다.

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return(-1); }

if(mysql_select_db(mysql, "welhelp")==MYSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n"); return(-1);

}

myres= mysql_list_fields(mysql, "addr"); // addr 테이블의 항목 리스트 얻기

if(myres==MYSQL_ERR) { print("addr error!\n"); return; }

mysql_field_seek(myres, 2); // 3번째 항목으로 필드 커서를 이동한다.

fd= mysql_fetch_field(myres); // 필드 커서의 항목에 대한 정보를 얻는다.

printf("%s %s %s [%d] (%s) %lu %lu %u %u\n", fd.name, fd.table, fd.type,

fd.type_value,fd.default,fd.length,fd.max_length,fd.decimals,fd.flags);

mysql_free_result(myres); mysql_close(mysql);

------------------------------ [ 출력결과 ] ------------------------------

address addr tinytext [252] () 255 0 0 16

15.2.12  mysql_field_tell()

1. 형식: result= mysql_field_tell(myres_ptr)

2. 기능: 인자 myres_ptr의 필드 커서의 위치를 얻어오며 mysql_field_seek() 함수로

얻어온 필드 커서 위치로 다시 설정할 수 있다.

3. 설명

(1) 이 함수는 MySQL에서 지원하는 함수이며 함수명은 MySQL의 C API와 동일하다.

(2) 인자 myres_ptr은 MySQL result 포인터이며 mysql_store_result()함수나 기타

결과를 저장하는 함수에 의하여 얻은 값이고 MySQL result 포인터가 아니면

에러 처리되며, 이미 해제된 MySQL result 포인터일 때에는 경고 메시지를

출력하고 result에 -1 의 값을 되돌린다.

(3) 위의 설명(2)가 아니면 필드 커서 위치에 대한 정수값이 result에 돌려진다.

4. 사용예

myres= mysql_list_fields(mysql, "addr"); // addr 테이블의 항목 리스트 얻기

if(myres==MYSQL_ERR) { print("addr error!\n"); return; }

pos= mysql_field_tell(myres); // 필드 커서의 값을 보관

mysql_field_seek(myres, 2); // 3번째 항목으로 필드 커서를 이동한다.

fd= mysql_fetch_field(myres); // 필드 커서의 항목에 대한 정보를 얻는다.

printf("   %s %s %s [%d] (%s) %lu %lu %u %u\n", fd.name, fd.table, fd.type,

fd.type_value,fd.default,fd.length,fd.max_length,fd.decimals,fd.flags);

mysql_field_seek(myres, pos); // 보관된 필드 커서 위치로 다시 설정

fd= mysql_fetch_field(myres); // 필드 커서의 항목에 대한 정보를 얻는다.

printf("   %s %s %s [%d] (%s) %lu %lu %u %u\n", fd.name, fd.table, fd.type,

fd.type_value,fd.default,fd.length,fd.max_length,fd.decimals,fd.flags);

mysql_free_result(myres);

------------------------------ [ 출력결과 ] ------------------------------

address addr tinytext [252] () 255 0 0 16

name addr tinytext [252] () 255 0 0 17

15.2.13  mysql_free_result()

1. 형식: result= mysql_free_result(myres_ptr)

2. 기능: mysql_store_result() 함수나 기타 결과를 저장하는 함수에 의하여 저장된

자료를 해제(메모리 해제)하는 역할을 한다.

3. 설명

(1) 이 함수는 MySQL에서 지원하는 함수이며 함수명은 MySQL의 C API와 동일하다.

(2) 인자 myres_ptr은 MySQL result 포인터이며 mysql_store_result()함수나 기타

결과를 저장하는 함수에 의하여 얻은 값이고 MySQL result 포인터가 아니면

에러 처리되며, 이미 해제된 MySQL result 포인터일 때에는 경고 메시지를

출력하고 result에 -1 의 값을 되돌린다.

(3) 항상 정수 1 이 result에 돌려진다.

4. 사용예

// 아래 프로그램은 MySQL 서버가 정상 작동하지 않거나 또는 welhelp 라는

// 데이터베이스가 없거나 addr 이라는 테이블이 없으면 에러가 발생한다.

mysql= mysql_connect(NULLL, myuser, mypass); // localhost에 연결함

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return(-1); }

if(mysql_select_db(mysql, "welhelp")==MYSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n"); return(-1);

}

query= "select * from addr"; // addr 테이블의 모든 항목을 선택

if(mysql_query(mysql, query)==MYSQL_ERR)

{

print("query error!!\n"); return(-1);

}

myres= mysql_store_result(mysql); // 추출된 자료를 저장하고 포인터를 돌려줌

row_count= mysql_num_rows(myres); // 추출된 자료의 레코드 개수 얻기

field_count= mysql_num_fields(myres); // 추출된 자료의 항목 개수 얻기

mysql_data_seek(myres, 1); // 2번째 레코드로 이동한다.

row_count-= 1; // 추출된 레코드의 개수를 조정

for(i=0; i<row_count; i++)

{

row= mysql_fetch_row(myres); // 저장된 자료에서 한 레코드를 읽는다

if( isarray(row) ) // 또는 if(row!=MYSQL_ERR)

for(j=0; j<field_count; j++) print("\t", row[j]); // 항목 출력

print();

}

mysql_free_result(myres); // 임시 저장된 자료를 해제(free)한다.

mysql_close(mysql); // MySQL 서버와의 접속을 해제한다.

------------------------------ [ 출력결과 ] ------------------------------

한여름	35	oo시 oo동 456번지

서지연	20	A시 B동 789번지

15.2.14  mysql_get_client_info()

1. 형식: result= mysql_get_client_info()

2. 기능: MySQL 클라이언트의 버전(version)을 얻는다.

3. 설명

(1) 이 함수는 MySQL에서 지원하는 함수이며 함수명은 MySQL의 C API와 동일하다.

(2) MySQL 클라이언트의 버전이 문자열로 result에 돌려진다.

4. 사용예

MySQL_version= mysql_get_client_info();

print("MySQL client version= ", MySQL_version);

------------------------------ [ 출력결과 ] ------------------------------

MySQL client version= 3.22.32

15.2.15  mysql_get_host_info()

1. 형식: result= mysql_get_host_info(mysql)

2. 기능: MySQL 서버의 접속 정보를 얻는다.

3. 설명

(1) 이 함수는 MySQL에서 지원하는 함수이며 함수명은 MySQL의 C API와 동일하다.

(2) 인자 mysql은 MySQL 포인터이며 MySQL 연결시 얻은 값이고 MySQL 포인터가

아니면 에러 처리되며, 이미 폐쇄된 MySQL 포인터일 때에는 경고 메시지를

출력하고 result에 -1 의 값을 되돌린다.

(3) 설명(2)의 경우가 아니면 MySQL의 접속 정보가 문자열로 result에 돌려진다.

4. 사용예

mysql= mysql_connect(NULL, myuser, mypass); // localhost를 연결한다.

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return(-1); }

MySQL_connection= mysql_get_host_info(mysql);

mysql_close(mysql);

print("MySQL connection= ", MySQL_connection);

------------------------------ [ 출력결과 ] ------------------------------

MySQL connection= Localhost via UNIX socket

15.2.16  mysql_get_proto_info()

1. 형식: result= mysql_get_proto_info(mysql)

2. 기능: MySQL 서버의 프로토콜 버전(protocol version)을 얻는다.

3. 설명

(1) 이 함수는 MySQL에서 지원하는 함수이며 함수명은 MySQL의 C API와 동일하다.

(2) 인자 mysql은 MySQL 포인터이며 MySQL 연결시 얻은 값이고 MySQL 포인터가

아니면 에러 처리되며, 이미 폐쇄된 MySQL 포인터일 때에는 경고 메시지를

출력하고 result에 -1 의 값을 되돌린다.

(3) 설명(2)의 경우가 아니면 MySQL의 프로토콜 버전이 문자열로 result에

돌려진다.

4. 사용예

mysql= mysql_connect(NULL, myuser, mypass); // localhost를 연결한다.

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return(-1); }

MySQL_proto_version= mysql_get_proto_info(mysql);

mysql_close(mysql);

print("MySQL protocol version= ", MySQL_proto_version);

------------------------------ [ 출력결과 ] ------------------------------

MySQL protocol version= 10

15.2.17  mysql_get_server_info()

1. 형식: result= mysql_get_server_info(mysql)

2. 기능: MySQL 서버의 버전(version)을 얻는다.

3. 설명

(1) 이 함수는 MySQL에서 지원하는 함수이며 함수명은 MySQL의 C API와 동일하다.

(2) 인자 mysql은 MySQL 포인터이며 MySQL 연결시 얻은 값이고 MySQL 포인터가

아니면 에러 처리되며, 이미 폐쇄된 MySQL 포인터일 때에는 경고 메시지를

출력하고 result에 -1 의 값을 되돌린다.

(3) 설명(2)의 경우가 아니면 MySQL 서버의 버전이 문자열로 result에 돌려진다.

4. 사용예

mysql= mysql_connect(NULL, myuser, mypass); // localhost를 연결한다.

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return(-1); }

MySQL_version= mysql_get_server_info(mysql);

mysql_close(mysql);

print("MySQL server version= ", MySQL_version);

------------------------------ [ 출력결과 ] ------------------------------

MySQL server version= 3.22.32

15.2.18  mysql_info()

1. 형식: result= mysql_info(mysql)

2. 기능: 특정한 타입의 질의에 대하여 가장 최근의 질의에 관련된 정보를 얻는다.

현재는  INSERT INTO (SELECT 문과 같이  사용되었을  경우),  LOAD DATA

INFILE, ALTER TABLE, INSERT INTO TABLE(여러 가지 필드를  한번에 사용

하였을 경우)와 같은 SQL 질의들이 이 함수를 통하여 추가 정보를 제공한

다.  만약  마지막 질의가 다른 추가 정보를 가지고 있지 않을 경우에 널

스트링(Null string, "")을 얻게 된다.

3. 설명

(1) 이 함수는 MySQL에서 지원하는 함수이며 함수명은 MySQL의 C API와 동일하다.

(2) 인자 mysql은 MySQL 포인터이며 MySQL 연결시 얻은 값이고 MySQL 포인터가

아니면 에러 처리되며, 이미 폐쇄된 MySQL 포인터일 때에는 경고 메시지를

출력하고 result에 -1 의 값을 되돌린다.

(3) 설명(2)의 경우가 아니면 관련 정보가 문자열로 result에 돌려진다.

4. 사용예

mysql= mysql_connect(NULL, myuser, mypass); // localhost를 연결한다.

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return(-1); }

info= mysql_info(mysql);

mysql_close(mysql);

print("info= ", info);

------------------------------ [ 출력결과 ] ------------------------------

info=

15.2.19  mysql_insert_id()

1. 형식: result= mysql_insert_id(mysql)

2. 기능: AUTO_INCREMENT 항목으로 인하여 자동으로 생성된 마지막 번호를 얻는다.

이 함수는 보통 AUTO_INCREMENT 항목에 값이 삽입된 직후, 어떤 값이 삽입

되었나를 알아내고자 할 때 사용한다.

3. 설명

(1) 이 함수는 MySQL에서 지원하는 함수이며 함수명은 MySQL의 C API와 동일하다.

(2) 인자 mysql은 MySQL 포인터이며 MySQL 연결시 얻은 값이고 MySQL 포인터가

아니면 에러 처리되며, 이미 폐쇄된 MySQL 포인터일 때에는 경고 메시지를

출력하고 result에 -1 의 값을 되돌린다.

(3) 설명(2)의 경우가 아니면 삽입된 값이 정수로 result에 돌려진다.

4. 사용예

mysql= mysql_connect(NULL, myuser, mypass); // localhost를 연결한다.

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return(-1); }

number= mysql_insert_id(mysql); // AUTO_INCREMENT 항목이 없거나 자료를 삽입

mysql_close(mysql);             // 하는 질의를 수행하지 않으면 의미가 없다.

print("number= ", number);

------------------------------ [ 출력결과 ] ------------------------------

number= 0

15.2.20  mysql_list_dbs()

1. 형식

형식1) myres_ptr= mysql_list_dbs(mysql)

형식2) myres_ptr= mysql_list_dbs(mysql, wild)

2. 기능: 접속된 MySQL 서버의 데이터베이스 목록을 얻는다.

3. 설명

(1) 이 함수는 MySQL에서 지원하는 함수이며 함수명은 MySQL의 C API와 동일하다.

(2) 인자 mysql은 MySQL 포인터이며 MySQL 연결시 얻은 값이고 MySQL 포인터가

아니면 에러 처리되며, 이미 폐쇄된 MySQL 포인터일 때에는 경고 메시지를

출력하고 result에 -1 의 값을 되돌린다.

(3) MySQL의 데이터베이스 목록을 얻지 못하면 정수 -1(MYSQL_ERR)이 myres_ptr에

돌려진다.

(4) 설명(2)와 설명(3)의 경우가 아니면 임시 저장된 자료에 대한 MySQL result

포인터가 myres_ptr에 돌려진다.

(5) 형식2)의 인자 wild는 wildcard를 지정하는 것으로 해당 조건에 맞는 명칭의

목록만 얻으며 문자열이 아니면 문자열로 형변환한다.

(6) 인자 wild의 사용예

1) abc%  --> abc라는 명칭으로 시작되는 것만 대상으로 한다.

2) %abc  --> abc라는 명칭으로 끝나는 것만 대상으로 한다.

3) %abc% --> abc라는 명칭을 포함하고 있는 것만 대상으로 한다.

4. 사용예#1

// 아래의 예제는 연결된 MySQL에 최소 3개의 데이터베이스가 존재한다고 가정함

mysql= mysql_connect(NULL, myuser, mypass); // localhost를 연결한다.

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return(-1); }

myres= mysql_list_dbs(mysql); // 얻어진 목록의 항목명은 Database 이다.

if(myres==MYSQL_ERR) { print("error!\n"); return; }

mysql_fetch_global(myres);           // Database 변수에 값이 얻어짐

mysql_fetch_global(myres, "dbase#"); // dbase1 변수에 값이 얻어짐

mysql_fetch_global(myres, "ms_");    // ms_Database 변수에 값이 얻어짐

mysql_free_result(myres);

mysql_close(mysql);

printf("DB 명= [%s] [%s] [%s]\n", Database, dbase1, ms_Database);

------------------------------ [ 출력결과 ] ------------------------------

DB 명= [test] [test2] [welhelp]

5. 사용예#2

// 아래의 예제는 연결된 MySQL에 최소 3개의 데이터베이스가 존재한다고 가정함

mysql= mysql_connect(NULL, myuser, mypass); // localhost를 연결한다.

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return(-1); }

myres= mysql_list_dbs(mysql, "wel%"); // wel 로 시작되는 명칭만 얻는다.

if(myres==MYSQL_ERR) { print("error!\n"); return; }

mysql_fetch_global(myres);           // Database 변수에 값이 얻어짐

mysql_fetch_global(myres, "dbase#"); // dbase1 변수에 값이 얻어짐

mysql_fetch_global(myres, "ms_");    // ms_Database 변수에 값이 얻어짐

mysql_free_result(myres);

mysql_close(mysql);

printf("DB 명= [%s] [%s] [%s]\n", Database, dbase1, ms_Database);

------------------------------ [ 출력결과 ] ------------------------------

DB 명= [welhelp] [weltest] [welboard2]

15.2.21  mysql_list_fields()

1. 형식

형식1) myres_ptr= mysql_list_fields(mysql, table_name)

형식2) myres_ptr= mysql_list_fields(mysql, table_name, wild)

2. 기능: 접속된 MySQL 서버에 대하여 mysql_select_db() 함수로 선택한 데이터

베이스의 인자 table_name 테이블의 항목 목록을 얻는다.

(개별적인 항목의 정보는 mysql_fetch_field() 함수를 사용하여 얻어야한다)

3. 설명

(1) 이 함수는 MySQL에서 지원하는 함수이며 함수명은 MySQL의 C API와 동일하다.

(2) 인자 myres_ptr은 MySQL result 포인터이며 mysql_store_result()함수나 기타

결과를 저장하는 함수에 의하여 얻은 값이고 MySQL result 포인터가 아니면

에러 처리되며, 이미 해제된 MySQL result 포인터일 때에는 경고 메시지를

출력하고 result에 -1 의 값을 되돌린다.

(3) 인자 table_name은 테이블명으로 문자열이며 문자열이 아니면 형변환된다.

(4) 인자 table_name 테이블의 항목 목록을 얻지 못하면 정수 -1(MYSQL_ERR)이

myres_ptr에 돌려진다.

(5) 설명(2)와 설명(4)의 경우가 아니면 임시 저장된 자료에 대한 MySQL result

포인터가 myres_ptr에 돌려진다.

(6) 형식2)의 인자 wild는 wildcard를 지정하는 것으로 해당 조건에 맞는 명칭의

목록만 얻으며 문자열이 아니면 문자열로 형변환한다.

(7) 인자 wild의 사용예

1) abc%  --> abc라는 명칭으로 시작되는 것만 대상으로 한다.

2) %abc  --> abc라는 명칭으로 끝나는 것만 대상으로 한다.

3) %abc% --> abc라는 명칭을 포함하고 있는 것만 대상으로 한다.

4. 사용예#1

// 아래의 예제는 welhelp 데이터베이스와 addr 테이블이 존재한다고 가정함

mysql= mysql_connect(NULL, myuser, mypass); // localhost를 연결한다.

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return(-1); }

if(mysql_select_db(mysql,"welhelp")==-1) { print("DB error!\n"); return; }

myres= mysql_list_fields(mysql, "addr"); // addr 테이블의 항목 리스트 얻기

if(myres==MYSQL_ERR) { print("addr error!\n"); return(-1); }

fd= mysql_fetch_field(myres); // 첫번째 항목에 대한 정보를 얻는다.

printf("%s %s (%s) %s (%d) %lu %lu %u %u %d\n",fd.name,fd.table,fd.default,

fd.type,fd.type_value,fd.length,fd.max_length,fd.decimals,fd.flags);

mysql_free_result(myres);

mysql_close(mysql);

------------------------------ [ 출력결과 ] ------------------------------

name addr () tinytext (252) 255 0 0 17 0

5. 사용예#2

// 아래의 예제는 welhelp 데이터베이스와 addr 테이블이 존재한다고 가정함

mysql= mysql_connect(NULL, myuser, mypass); // localhost를 연결한다.

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return(-1); }

if(mysql_select_db(mysql,"welhelp")==-1) { print("DB error!\n"); return; }

myres= mysql_list_fields(mysql, "addr", "%ss"); // ss 로 끝나는 목록만 얻기

if(myres==MYSQL_ERR) { print("addr error!\n"); return(-1); }

fd= mysql_fetch_field(myres); // 첫번째 항목에 대한 정보를 얻는다.

printf("%s %s %s [%d] (%s) %lu %lu %u %u\n", fd.name, fd.table, fd.type,

fd.type_value,fd.default,fd.length,fd.max_length,fd.decimals,fd.flags);

mysql_free_result(myres);

mysql_close(mysql);

------------------------------ [ 출력결과 ] ------------------------------

address addr tinytext [252] () 255 0 0 16

15.2.22  mysql_list_tables()

1. 형식

형식1) myres_ptr= mysql_list_tables(mysql)

형식2) myres_ptr= mysql_list_tables(mysql, wild)

2. 기능: 접속된 MySQL 서버에 대하여 mysql_select_db() 함수로 선택한 데이터

베이스의 테이블 목록을 얻는다.

3. 설명

(1) 이 함수는 MySQL에서 지원하는 함수이며 함수명은 MySQL의 C API와 동일하다.

(2) 인자 mysql은 MySQL 포인터이며 MySQL 연결시 얻은 값이고 MySQL 포인터가

아니면 에러 처리되며, 이미 폐쇄된 MySQL 포인터일 때에는 경고 메시지를

출력하고 result에 -1 의 값을 되돌린다.

(3) 선택된 데이터베이스의 테이블 목록을 얻지 못하면 정수 -1(MYSQL_ERR) 이

myres_ptr에 돌려진다.

(4) 설명(2)와 설명(3)의 경우가 아니면 임시 저장된 자료에 대한 MySQL result

포인터가 myres_ptr에 돌려진다.

(5) 형식2)의 인자 wild는 wildcard를 지정하는 것으로 해당 조건에 맞는 명칭의

목록만 얻으며 문자열이 아니면 문자열로 형변환한다.

(6) 인자 wild의 사용예

1) abc%  --> abc라는 명칭으로 시작되는 것만 대상으로 한다.

2) %abc  --> abc라는 명칭으로 끝나는 것만 대상으로 한다.

3) %abc% --> abc라는 명칭을 포함하고 있는 것만 대상으로 한다.

4. 사용예#1

// 아래의 예제는 welhelp 데이터베이스에 한개의 테이블만 존재한다고 가정함

mysql= mysql_connect(NULL, myuser, mypass); // localhost를 연결한다.

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return(-1); }

if(mysql_select_db(mysql,"welhelp")==-1) { print("DB error!\n"); return; }

myres= mysql_list_tables(mysql); // 얻이진 목록의 항목명은 Tables 이다.

if(myres==MYSQL_ERR) { print("error!\n"); return; }

mysql_fetch_global(myres);            // Tables 변수에 값이 얻어짐

mysql_data_seek(myres, 0); // 첫번째 위치로 다시 이동(테이블이 한개라고 가정)

mysql_fetch_global(myres, "테이블#"); // 테이블1 변수에 값이 얻어짐

mysql_data_seek(myres, 0); // 첫번째 위치로 다시 이동(테이블이 한개라고 가정)

mysql_fetch_global(myres, "ms_");     // ms_Tables 변수에 값이 얻어짐

mysql_free_result(myres); mysql_close(mysql);

printf("welhelp 의 테이블명= [%s] [%s] [%s]\n", Tables, 테이블1, ms_Tables);

------------------------------ [ 출력결과 ] ------------------------------

welhelp 의 테이블명= [addr] [addr] [addr]

5. 사용예#2

// 아래의 예제는 welhelp 데이터베이스에 한개의 테이블만 존재한다고 가정함

mysql= mysql_connect(NULL, myuser, mypass); // localhost를 연결한다.

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return(-1); }

if(mysql_select_db(mysql,"welhelp")==-1) { print("DB error!\n"); return; }

myres= mysql_list_tables(mysql, "ad%"); // ad 로 시작되는 명칭만 얻는다.

if(myres==MYSQL_ERR) { print("error!\n"); return; }

mysql_fetch_global(myres);            // Tables 변수에 값이 얻어짐

mysql_data_seek(myres, 0); // 첫번째 위치로 다시 이동(테이블이 한개라고 가정)

mysql_fetch_global(myres, "테이블#"); // 테이블1 변수에 값이 얻어짐

mysql_data_seek(myres, 0); // 첫번째 위치로 다시 이동(테이블이 한개라고 가정)

mysql_fetch_global(myres, "ms_");     // ms_Tables 변수에 값이 얻어짐

mysql_free_result(myres); mysql_close(mysql);

printf("welhelp 의 테이블명= [%s] [%s] [%s]\n", Tables, 테이블1, ms_Tables);

------------------------------ [ 출력결과 ] ------------------------------

welhelp 의 테이블명= [addr] [addr] [addr]

15.2.23  mysql_num_fields()

1. 형식: field_count= mysql_num_fields(myres_ptr)

2. 기능: 인자 myres_ptr의 임시 저장된 결과 자료에서 항목의 개수를 얻는다.

3. 설명

(1) 이 함수는 MySQL에서 지원하는 함수이며 함수명은 MySQL의 C API와 동일하다.

(2) 인자 myres_ptr은 MySQL result 포인터이며 mysql_store_result()함수나 기타

결과를 저장하는 함수에 의하여 얻은 값이고 MySQL result 포인터가 아니면

에러 처리되며, 이미 해제된 MySQL result 포인터일 때에는 경고 메시지를

출력하고 result에 -1 의 값을 되돌린다.

(3) field_count에는 항목 개수를 의미하는 정수가 돌려진다.

4. 사용예

// 아래 프로그램은 MySQL 서버가 정상 작동하지 않거나 또는 welhelp 라는

// 데이터베이스가 없거나 addr 이라는 테이블이 없으면 에러가 발생한다.

mysql= mysql_connect(NULLL, myuser, mypass); // localhost에 연결함

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return(-1); }

if(mysql_select_db(mysql, "welhelp")==MYSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n"); return(-1);

}

query= "select * from addr"; // addr 테이블의 모든 항목을 선택

if(mysql_query(mysql, query)==MYSQL_ERR)

{

print("query error!!\n"); return(-1);

}

myres= mysql_store_result(mysql); // 추출된 자료를 저장하고 포인터를 돌려줌

row_count= mysql_num_rows(myres); // 추출된 자료의 레코드 개수 얻기

field_count= mysql_num_fields(myres); // 추출된 자료의 항목 개수 얻기

mysql_data_seek(myres, 1); // 2번째 레코드로 이동한다.

row_count-= 1; // 추출된 레코드의 개수를 조정

for(i=0; i<row_count; i++)

{

row= mysql_fetch_row(myres); // 저장된 자료에서 한 레코드를 읽는다

if( isarray(row) ) // 또는 if(row!=MYSQL_ERR)

for(j=0; j<field_count; j++) print("\t", row[j]); // 항목 출력

print();

}

mysql_free_result(myres); // 임시 저장된 자료를 해제(free)한다.

mysql_close(mysql); // MySQL 서버와의 접속을 해제한다.

------------------------------ [ 출력결과 ] ------------------------------

한여름	35	oo시 oo동 456번지

서지연	20	A시 B동 789번지

15.2.24  mysql_num_rows()

1. 형식: row_count= mysql_num_rows(myres_ptr)

2. 기능: 인자 myres_ptr의 임시 저장된 결과 자료에서 레코드의 개수를 얻는다.

3. 설명

(1) 이 함수는 MySQL에서 지원하는 함수이며 함수명은 MySQL의 C API와 동일하다.

(2) 인자 myres_ptr은 MySQL result 포인터이며 mysql_store_result()함수나 기타

결과를 저장하는 함수에 의하여 얻은 값이고 MySQL result 포인터가 아니면

에러 처리되며, 이미 해제된 MySQL result 포인터일 때에는 경고 메시지를

출력하고 result에 -1 의 값을 되돌린다.

(3) row_count에는 레코드 개수를 의미하는 정수가 돌려진다.

4. 사용예

// 아래 프로그램은 MySQL 서버가 정상 작동하지 않거나 또는 welhelp 라는

// 데이터베이스가 없거나 addr 이라는 테이블이 없으면 에러가 발생한다.

mysql= mysql_connect(NULLL, myuser, mypass); // localhost에 연결함

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return(-1); }

if(mysql_select_db(mysql, "welhelp")==MYSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n"); return(-1);

}

query= "select * from addr"; // addr 테이블의 모든 항목을 선택

if(mysql_query(mysql, query)==MYSQL_ERR)

{

print("query error!!\n"); return(-1);

}

myres= mysql_store_result(mysql); // 추출된 자료를 저장하고 포인터를 돌려줌

row_count= mysql_num_rows(myres); // 추출된 자료의 레코드 개수 얻기

field_count= mysql_num_fields(myres); // 추출된 자료의 항목 개수 얻기

mysql_data_seek(myres, 1); // 2번째 레코드로 이동한다.

row_count-= 1; // 추출된 레코드의 개수를 조정

for(i=0; i<row_count; i++)

{

row= mysql_fetch_row(myres); // 저장된 자료에서 한 레코드를 읽는다

if( isarray(row) ) // 또는 if(row!=MYSQL_ERR)

for(j=0; j<field_count; j++) print("\t", row[j]); // 항목 출력

print();

}

mysql_free_result(myres); // 임시 저장된 자료를 해제(free)한다.

mysql_close(mysql); // MySQL 서버와의 접속을 해제한다.

------------------------------ [ 출력결과 ] ------------------------------

한여름	35	oo시 oo동 456번지

서지연	20	A시 B동 789번지

15.2.25  mysql_query()

1. 형식: result= mysql_query(mysql, query)

2. 기능: 인자 mysql으로 접속된 MySQL 서버에 인자 query의 SQL 질의어를 전달하여

실행한다.

3. 설명

(1) 이 함수는 MySQL에서 지원하는 함수이며 함수명은 MySQL의 C API와 동일하다.

(2) 인자 mysql은 MySQL 포인터이며 MySQL 연결시 얻은 값이고 MySQL 포인터가

아니면 에러 처리되며, 이미 폐쇄된 MySQL 포인터일 때에는 경고 메시지를

출력하고 result에 -1 의 값을 되돌린다.

(3) 인자 query는 SQL 질의어로 문자열이어야 하며 수치이면 문자열로 변환된다.

(4) result의 값이 정수 -1(MYSQL_ERR)이면 질의어 실행을 실패한 경우이다.

4. 사용예

// 아래 프로그램은 MySQL 서버가 정상 작동하지 않거나 또는 welhelp 라는

// 데이터베이스가 없거나 addr 이라는 테이블이 없으면 에러가 발생한다.

mysql= mysql_connect(NULLL, myuser, mypass); // localhost에 연결함

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return(-1); }

if(mysql_select_db(mysql, "welhelp")==MYSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n"); return(-1);

}

query= "select * from addr"; // addr 테이블의 모든 항목을 선택

if(mysql_query(mysql, query)==MYSQL_ERR)

{

print("query error!!\n"); return(-1);

}

myres= mysql_store_result(mysql); // 추출된 자료를 저장하고 포인터를 돌려줌

row_count= mysql_num_rows(myres); // 추출된 자료의 레코드 개수 얻기

field_count= mysql_num_fields(myres); // 추출된 자료의 항목 개수 얻기

mysql_data_seek(myres, 1); // 2번째 레코드로 이동한다.

row_count-= 1; // 추출된 레코드의 개수를 조정

for(i=0; i<row_count; i++)

{

row= mysql_fetch_row(myres); // 저장된 자료에서 한 레코드를 읽는다

if( isarray(row) ) // 또는 if(row!=MYSQL_ERR)

for(j=0; j<field_count; j++) print("\t", row[j]); // 항목 출력

print();

}

mysql_free_result(myres); // 임시 저장된 자료를 해제(free)한다.

mysql_close(mysql); // MySQL 서버와의 접속을 해제한다.

------------------------------ [ 출력결과 ] ------------------------------

한여름	35	oo시 oo동 456번지

서지연	20	A시 B동 789번지

15.2.26  mysql_query_result()

1. 형식: myres_ptr= mysql_query_result(mysql, query)

2. 기능: 인자 mysql으로 접속된 MySQL 서버에 인자 query의 SQL 질의어를 전달하여

실행한 후 결과 자료를 임시 저장한다. 즉, mysql_query() 함수를 실행한

후 mysql_store_result() 함수를 실행하는 것과 같다.

3. 설명

(1) 이 함수는 MySQL에서 지원하지 않고 mysql_query()와 mysql_store_result()를

응용한 것이다.

(2) 인자 mysql은 MySQL 포인터이며 MySQL 연결시 얻은 값이고 MySQL 포인터가

아니면 에러 처리되며, 이미 폐쇄된 MySQL 포인터일 때에는 경고 메시지를

출력하고 result에 -1 의 값을 되돌린다.

(3) 인자 query는 SQL 질의어로 문자열이어야 하며 수치이면 문자열로 변환된다.

(4) 임시 저장된 자료에 대한 MySQL result 포인터가 myres_ptr에 돌려진다.

(5) myres_ptr의 값이 정수 -1(MYSQL_ERR)이면 질의어 실행을 실패한 경우이다.

(6) myres_ptr의 값이 정수 0 이면 결과를 저장할 수 없거나 또는 인자 query가

결과 자료가 없는 SQL 질의어인 경우이다.(예: INSERT, DELETE, UPDATE 등)

4. 사용예

// 아래 프로그램은 MySQL 서버가 정상 작동하지 않거나 또는 welhelp 라는

// 데이터베이스가 없거나 addr 이라는 테이블이 없으면 에러가 발생한다.

mysql= mysql_connect(NULL, myuser, mypass); // localhost에 연결함

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return(-1); }

if(mysql_select_db(mysql, "welhelp")==MYSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n");

return(-1);

}

query= "select * from addr"; // addr 테이블의 모든 항목을 선택

myres= mysql_query_result(mysql, query);

if(myres==MYSQL_ERR) { print("query error!!\n"); return(-1); }

if(myres==NULL) { print("store result error!\n"); return(-1); }

while( mysql_fetch_global(myres) > 0 )

{

print("\t", name);    // addr 테이블의 name 항목의 값은 name

print("\t", age);     // addr 테이블의 age 항목의 값은 age

print("\t", address); // addr 테이블의 address 항목의 값은 address

print(); // 줄을 바꿔준다.

}

mysql_free_result(myres); // 임시 저장된 자료를 해제(free)한다.

mysql_close(mysql); // MySQL 서버와의 접속을 해제한다.

------------------------------ [ 출력결과 ] ------------------------------

홍길동	28	xx시 xx동 123번지

한여름	35	oo시 oo동 456번지

서지연	20	A시 B동 789번지

15.2.27  mysql_select_db()

1. 형식: result= mysql_select_db(mysql, db_name)

2. 기능: 인자 mysql으로 접속된 MySQL 서버로부터 인자 db_name의 데이터베이스를

선택한다.

3. 설명

(1) 이 함수는 MySQL에서 지원하는 함수이며 함수명은 MySQL의 C API와 동일하다.

(2) 인자 mysql은 MySQL 포인터이며 MySQL 연결시 얻은 값이고 MySQL 포인터가

아니면 에러 처리되며, 이미 폐쇄된 MySQL 포인터일 때에는 경고 메시지를

출력하고 result에 -1 의 값을 되돌린다.

(3) 인자 db_name은 선택할 데이터베이스 이름으로 문자열이어야 하며 수치이면

문자열로 형변환된다.

(4) result의 값이 정수 -1(MYSQL_ERR)이면 데이터베이스 선택을 실패한 경우로

대부분 해당 데이터베이스의 이름이 MySQL 서버에 없는 경우이다.

4. 사용예

// 아래 프로그램은 MySQL 서버가 정상 작동하지 않거나 또는 welhelp 라는

// 데이터베이스가 없거나 addr 이라는 테이블이 없으면 에러가 발생한다.

mysql= mysql_connect(NULLL, myuser, mypass); // localhost에 연결함

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return(-1); }

if(mysql_select_db(mysql, "welhelp")==MYSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n"); return(-1);

}

query= "select * from addr"; // addr 테이블의 모든 항목을 선택

if(mysql_query(mysql, query)==MYSQL_ERR)

{

print("query error!!\n"); return(-1);

}

myres= mysql_store_result(mysql); // 추출된 자료를 저장하고 포인터를 돌려줌

row_count= mysql_num_rows(myres); // 추출된 자료의 레코드 개수 얻기

field_count= mysql_num_fields(myres); // 추출된 자료의 항목 개수 얻기

mysql_data_seek(myres, 1); // 2번째 레코드로 이동한다.

row_count-= 1; // 추출된 레코드의 개수를 조정

for(i=0; i<row_count; i++)

{

row= mysql_fetch_row(myres); // 저장된 자료에서 한 레코드를 읽는다

if( isarray(row) ) // 또는 if(row!=MYSQL_ERR)

for(j=0; j<field_count; j++) print("\t", row[j]); // 항목 출력

print();

}

mysql_free_result(myres); // 임시 저장된 자료를 해제(free)한다.

mysql_close(mysql); // MySQL 서버와의 접속을 해제한다.

------------------------------ [ 출력결과 ] ------------------------------

한여름	35	oo시 oo동 456번지

서지연	20	A시 B동 789번지

15.2.28  mysql_stat()

1. 형식: result= mysql_stat(mysql)

2. 기능: MySQL 서버의 운영에 관련된 상태 정보를 얻는다.

3. 설명

(1) 이 함수는 MySQL에서 지원하는 함수이며 함수명은 MySQL의 C API와 동일하다.

(2) 인자 mysql은 MySQL 포인터이며 MySQL 연결시 얻은 값이고 MySQL 포인터가

아니면 에러 처리되며, 이미 폐쇄된 MySQL 포인터일 때에는 경고 메시지를

출력하고 result에 -1 의 값을 되돌린다.

(3) 설명(2)의 경우가 아니면 MySQL 서버의 상태가 문자열로 result에 돌려진다.

4. 사용예

mysql= mysql_connect(NULL, myuser, mypass); // localhost를 연결한다.

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return(-1); }

stat= mysql_stat(mysql);

mysql_close(mysql);

print(stat);

------------------------------ [ 출력결과 ] ------------------------------

Uptime: 2079475  Threads: 1  Questions: 171200  Slow queries: 0  Opens: 214  Flush tables: 4  Open tables: 62

15.2.29  mysql_store_result()

1. 형식: myres_ptr= mysql_store_result(mysql)

2. 기능: mysql_query() 함수를 실행하여 SQL 질의어에 대한 결과 자료가 있을 때

그 결과 자료를 임시 저장하는 역할을 한다.

3. 설명

(1) 이 함수는 MySQL에서 지원하는 함수이며 함수명은 MySQL의 C API와 동일하다.

(2) 인자 mysql은 MySQL 포인터이며 MySQL 연결시 얻은 값이고 MySQL 포인터가

아니면 에러 처리되며, 이미 폐쇄된 MySQL 포인터일 때에는 경고 메시지를

출력하고 result에 -1 의 값을 되돌린다.

(3) 임시 저장된 자료에 대한 MySQL result 포인터가 myres_ptr에 돌려진다.

(4) myres_ptr이 정수 -1(MYSQL_ERR)이면 에러가 발생한 경우이다.

4. 사용예

// 아래 프로그램은 MySQL 서버가 정상 작동하지 않거나 또는 welhelp 라는

// 데이터베이스가 없거나 addr 이라는 테이블이 없으면 에러가 발생한다.

mysql= mysql_connect(NULLL, myuser, mypass); // localhost에 연결함

if(mysql==MYSQL_ERR) { print("MySQL 서버 연결 에러!\n"); return(-1); }

if(mysql_select_db(mysql, "welhelp")==MYSQL_ERR) // welhelp database 선택

{

print("welhelp database 선택 에러!\n"); return(-1);

}

query= "select * from addr"; // addr 테이블의 모든 항목을 선택

if(mysql_query(mysql, query)==MYSQL_ERR)

{

print("query error!!\n"); return(-1);

}

myres= mysql_store_result(mysql); // 추출된 자료를 저장하고 포인터를 돌려줌

row_count= mysql_num_rows(myres); // 추출된 자료의 레코드 개수 얻기

field_count= mysql_num_fields(myres); // 추출된 자료의 항목 개수 얻기

mysql_data_seek(myres, 1); // 2번째 레코드로 이동한다.

row_count-= 1; // 추출된 레코드의 개수를 조정

for(i=0; i<row_count; i++)

{

row= mysql_fetch_row(myres); // 저장된 자료에서 한 레코드를 읽는다

if( isarray(row) ) // 또는 if(row!=MYSQL_ERR)

for(j=0; j<field_count; j++) print("\t", row[j]); // 항목 출력

print();

}

mysql_free_result(myres); // 임시 저장된 자료를 해제(free)한다.

mysql_close(mysql); // MySQL 서버와의 접속을 해제한다.

------------------------------ [ 출력결과 ] ------------------------------

한여름	35	oo시 oo동 456번지

서지연	20	A시 B동 789번지

<참고1> Wel의 에러 및 경고 메시지

Wel 에러 메시지	Wel 경고 메시지
Stack overflow! 메모리가 부족합니다! 나눗셈에서 '0'으로 나눈 에러(분모가 '0'입니다)! 문법 에러! 연산식 표현 에러! 주석(Comment)이 종료되지 않았습니다! Inline print가 종료되지 않았습니다! 문자상수가 끝나지 않았거나 한문자가 아닙니다! 문자열이 종료되지 않았습니다! 괄호의 짝이 맞지 않습니다! 중괄호(Brace)의 짝이 맞지 않습니다! 수치상수 에러(수치가 될 수 없습니다)! 자료 형(Type)이 맞지 않습니다! 정의되지 않은 변수입니다! 사용중이거나 이미 선언되었습니다! 잘못된 변수명을 사용하였습니다! 대입연산자의 왼쪽값이 변수가 아닙니다! 읽기 전용변수는 대입할 수 없습니다! 읽기 전용변수는 해제할 수 없습니다! 임계 영역 변수를 대입 또는 해제할 수 없습니다! 배열이 선언되지 않았습니다! 배열이 아닙니다! 잘못된 배열 사용 에러! 배열의 차원이 선언된 것과 다릅니다! 배열의 첨자가 범위를 넘었습니다! 3차원 배열까지만 사용할 수 있습니다! 변수명만 사용해야 합니다! 잘못된 객체 사용 에러! 객체 배열이 너무 많이 중첩되었습니다! 함수 정의가 잘못었습니다! 정의되지 않은 함수를 호출하였습니다! 이미 정의된 함수는 재정의할 수 없습니다! 함수의 인수 개수 에러! 함수의 잘못된 인자 사용 에러! 함수의 회귀값의 자료 형(Type)이 맞지 않습니다! 폼(관련 기능)이 너무 많이 중첩되었습니다! 폼의 repeat 명령이 너무 많이 중첩되었습니다! 폼 매크로 변수명의 잘못된 사용 에러! 폼 매크로 폭(1 ~ 255)의 잘못된 사용 에러! 폼 매크로 명령이 아닙니다! 폼 매크로의 레이블이 정의되지 않았습니다! 초기화 자료가 너무 많습니다! 중괄호가 변수의 차원과 일치하지 않습니다! 객체 배열은 초기화할 수 없습니다! 포인터 변수가 아닙니다! 파일 포인터가 아닙니다! MSQL 포인터가 아닙니다! MSQL result 포인터가 아닙니다! MySQL 포인터가 아닙니다! MySQL result 포인터가 아닙니다! Socket 포인터가 아닙니다! IMAP mail 포인터가 아닙니다! 부 프로그램을 개방할 수 없습니다! 이 함수는 웹 프로그램에서 사용할 수 없습니다! 이 매크로는 웹 프로그램에서 사용할 수 없습니다! 프로그램 실행 제한시간을 초과하였습니다! <Break> CTRL-C나 CTRL-\에 의해 강제 종료됩니다!	개방되지 않았거나 이미 폐쇄되었습니다. 연결되지 않았거나 이미 폐쇄되었습니다. 결과를 저장하지 않았거나 이미 해제되었습니다. 내용이 없거나 무효한 Header를 사용했습니다. 내용이 없거나 무효한 Cookie를 사용했습니다.

<참고2> ASCII 코드표

10진수	8진수	16진수	문자	Name(Meaning) <Text Reference>
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63	000 001 002 003 004 005 006 007 010 011 012 013 014 015 016 017 020 021 022 023 024 025 026 027 030 031 032 033 034 035 036 037 040 041 042 043 044 045 046 047 050 051 052 053 054 055 056 057 060 061 062 063 064 065 066 067 070 071 072 073 074 075 076 077	00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F	^A ^B ^C ^D ^E ^F ^G ^H ^I ^J ^K ^L ^M ^N ^O ^P ^Q ^R ^S ^T ^U ^V ^W ^X ^Y ^Z ^[ ^\ ^] ^^ ^_ ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?	NUL (used for padding) <NULL> SOH (start of header) STX (start of text) ETX (end of text) EOT (end of transmission) ENQ (enquiry) ACK (acknowledge) BEL (bell or alarm) <BELL> BS (backspace) <BS> HT (horizontal tab) <TAB> LF (line feed) <LF> <NL> VT (vertical tab) FF (form feed new page) <FF> <NP> CR (carriage return) <CR> SO (shift out) SI (shift in) DLE (data link escape) DC1 (device control #1, XON) DC2 (device control #2) DC3 (device control #3, XOFF) DC4 (device control #4) NAK (negative acknowledge) SYN (synchronous idle) ETB (end transmission block) CAN (cancel) EM (end of medium) SUB (substitute) ESC (escape) FS (file separator) GS (group separator) RS (record separator) US (unit separator) space or blank <SP> exclamation mark quotation(double quotation) number sign(hash mark) dollar sign percent sign ampersand sign apostrophe(single quotation) opening parenthesis closing parenthesis asterisk plus sign comma hyphen or minus sign period(decimal point dot) slash numeral zero numeral one numeral two numeral three numeral four numeral five numeral six numeral seven numeral eight numeral nine colon semicolon less than sign equal sign greater than sign question mark

10진수	8진수	16진수	문자	Name(Meaning) <Text Reference>
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127	100 101 102 103 104 105 106 107 110 111 112 113 114 115 116 117 120 121 122 123 124 125 126 127 130 131 132 133 134 135 136 137 140 141 142 143 144 145 146 147 150 151 152 153 154 155 156 157 160 161 162 163 164 165 166 167 170 171 172 173 174 175 176 177	40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F	@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~	at sign uppercase(capital) A uppercase(capital) B uppercase(capital) C uppercase(capital) D uppercase(capital) E uppercase(capital) F uppercase(capital) G uppercase(capital) H uppercase(capital) I uppercase(capital) J uppercase(capital) K uppercase(capital) L uppercase(capital) M uppercase(capital) N uppercase(capital) O uppercase(capital) P uppercase(capital) Q uppercase(capital) R uppercase(capital) S uppercase(capital) T uppercase(capital) U uppercase(capital) V uppercase(capital) W uppercase(capital) X uppercase(capital) Y uppercase(capital) Z opening bracket backward slash(backslash) closing bracket caret(uparrow) underscore grave accent(back quotation) lowercase a lowercase b lowercase c lowercase d lowercase e lowercase f lowercase g lowercase h lowercase i lowercase j lowercase k lowercase l lowercase m lowercase n lowercase o lowercase p lowercase q lowercase r lowercase s lowercase t lowercase u lowercase v lowercase w lowercase x lowercase y lowercase z opening brace vertical line closing brace tilde DEL(delete, rub out) <DEL>

<참고3> Wel의 구문정리

※ 아래 표기에서 단어 뒷편의 '~' 표시는 생략 가능함을 의미한다.

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

expression:

primary

- expression

! expression

~ expression

++ lvalue

-- lvalue

lvalue ++

lvalue --

expression binop expression

lvalue asgnop expression

expression , expression

primary:

identifier

constant

string

( expression )

identifier ( expression-list~ )

identifier [ expression-list ]

lvalue:

identifier

identifier [ expression ]

binop:

,       ~      ||      &&      |       ^       &       ==      !=

>       >=     <       <=      <<      >>      +       -       *

/       %      **

asgnop:

=       ~=     +=      -=      *=      /=      %=      |=      ^=

&=      <<=    >>=     **=

declaration:

type-specifier init-declarator-list;

type-specifier:

char

int

long

float

double

string

free

init-declarator-list:

init-declarator

init-declarator, init-declarator-list

init-declarator:

declarator initializer~

declarator-list:

declarator

declarator, declarator-list

declarator:

identifier

declarator [ constant-expression ]

initializer:

= expression

compound-statement:

{ declaration-list~ statement-list~ }

declaration-list:

declaration

declaration declaration-list

statement-list:

statement

statement statement-list

statement:

compound-statement

expression;

if (expression) statement

if (expression) statement else statement

while (expression) statement

do statement while expession;

for (expression-1~; expression-2~; expression-3~) statement

break;

continue;

return;

return expression;

vlock declarator-list;

vunlock declarator-list;

vfree declarator-list;

goto identifier;

identifier : statement

;

program:

function-definition

function-definition program

function-definition:

function type-specifier~ function-declarator function-body

function-declarator:

declarator ( parameter-list~ )

parameter-list:

identifier

identifier , parameter-list

function-body:

type-decl-list function-statement

function-statement:

{ declaration-list~ statement-list }

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

<참고4> 함수 색인

[ a ] abs() 53 array() 99 asc() 59 [ c ] chdir() 131 chmod() 134 choice() 86 chr() 59 cls() 114 cos() 53 crypt() 67 [ d ] date() 62 decode() 70 [ e ] element() 99 encode() 71 encodekey() 72 exp() 54 [ f ] fclose() 116 fdump() 117 feof() 118 fexist() 119 ffield() 120 fflush() 121 finput() 121 fix() 54 flastch() 122 flush() 86 fopen() 123 formclose() 137 formdump() 138 formgoto() 139 formmerge() 140 formopen() 141 formredir() 142 fparser() 100 fprint() 123 fprintf() 124 fputc() 125 fseek() 126 fsizeof() 126 ftell() 127 [ g ] getcwd() 131 getenv() 91 getgid() 92	gethostbyaddr() 145 gethostbyname() 145 getmod() 135 getpid() 92 getuid() 92 [ h ] header() 101 hex() 61 htmldeltag() 102 htmlquery() 103 [ i ] iday() 63 idayof() 63 imonth() 64 include() 104 inkey() 87 input() 88 isarray() 105 isdir() 136 isobject() 106 istype() 107 iweek() 64 iyear() 65 [ k ] keybreak() 93 [ l ] left() 73 len() 74 listmerge() 143 locate() 115 log() 55 log10() 55 lrtrim() 74 ltrim() 75 [ m ] mid() 75 mkdir() 132 msleep() 94 msqlClose() 150 msqlConnect() 150 msqlDataSeek() 151 msqlError() 152 msqlFetchField() 153 msqlFetchGlobal() 155 msqlFetchObject() 158 msqlFetchRow() 161 msqlFieldSeek() 162 msqlFreeResult() 163 msqlGetHostInfo() 164

msqlGetProtoInfo() 164 msqlGetServerInfo() 165 msqlListDBs() 165 msqlListFields() 166 msqlListTables() 167 msqlNumFields() 168 msqlNumRows() 169 msqlQuery() 170 msqlQueryResult() 171 msqlSelectDB() 172 msqlStoreResult() 173 mysql_close() 175 mysql_connect() 175 mysql_data_seek() 176 mysql_errno() 177 mysql_error() 177 mysql_fetch_field() 178 mysql_fetch_global() 181 mysql_fetch_object() 184 mysql_fetch_row() 187 mysql_field_seek() 188 mysql_field_tell() 189 mysql_free_result() 190 mysql_get_client_info() 191 mysql_get_host_info() 191 mysql_get_proto_info() 192 mysql_get_server_info() 192 mysql_info() 193 mysql_insert_id() 193 mysql_list_dbs() 194 mysql_list_fields() 195 mysql_list_tables() 197 mysql_num_fields() 199 mysql_num_rows() 200 mysql_query() 201 mysql_query_result() 202 mysql_select_db() 203 mysql_stat() 204 mysql_store_result() 205 [ o ] oct() 61 [ p ] parser() 108 passwdseek() 94 pclose() 128 popen() 129 print() 88 printf() 89 putchar() 90	putenv() 95 [ q ] queryencode() 109 [ r ] rand() 56 randomize() 95 real() 56 rename() 130 right() 76 rmdir() 133 rtrim() 76 runtime() 96 [ s ] setcookie() 110 setlocal() 111 setqueryencode() 112 setuser() 96 setwel() 113 sin() 57 sleep() 97 sockclose() 146 sockopen() 146 sockread() 147 sockwrite() 148 split() 77 sprintf() 78 sqrt() 57 str() 60 strchange() 78 strchange_preset() 80 strcount() 81 strep() 81 strfind() 82 strfindreplace() 82 strform() 83 strkind() 84 sumday() 65 system() 97 [ t ] tan() 58 time() 66 timeout() 98 tolower() 85 toupper() 85 [ u ] unlink() 130 [ v ] val() 60

짧지 않은 기간 동안 자기가 하고 싶은 일을 하겠다는 일념하나로 새벽녘의   붉게 타오르기 시작하는 태양을 애인 보듯이 웰(Wel)의 개발을 위하여 나날을   보내줬던 몇몇 기억 속에 남을 사람들에게 그들이 노력했던 시간들이 아까운 시간을 소모했다는 기억으로 남기보다는 좋은 추억으로 남을 수 있다면 더 이상 바랄 것이 없을 것 같다.

저 작 권

본 문서의 저작권은 Wesoft에 있으며 복사본에 저작권이 유지되는 한 문서의  일부 또는 전체를 복제하고 재 배포할 수 있다.  만일 상업적인 목적으로 이 문서가 사용된다면 반드시 개발자(gline@wesoft.co.kr)와 협의하여야 한다.