subroutine casc(cdop,kcrim,cdmot,kmot)
! --------------------------------------------------------------------------
! **** *CASC*  - Cassure d'une chaine en ses differents mots.
! --------------------------------------------------------------------------
! Auteur:  J.M.Piriou
! -------
! Modifications.
! --------------
! Original : 93-06
! --------------------------------------------------------------------------
! En entree: cdop chaine a casser.
! kcrim critere de mot:
! 1 si mot=suite continue de "non (blancs ou tabulations)".
! 2 si mot=suite continue de "a-z,A-Z,0-9,.,_".
! 3 si mot=suite continue de "0-9,E,e,+,-,.".
! 4 si mot=suite continue de "a-z,A-Z,0-9".
! 5 si mot=suite continue de "a-z,A-Z,0-9,_,-".
! 6 si mot=suite continue de "non (- ou . ou blancs ou tabulations)".
! 7 si mot=suite continue de "non .".
! 8 si mot=suite continue de "0-9".
! 9 si mot=suite continue de "non /".
! 10 si mot=suite continue de "non ,".
! < 0 si mot=suite continue de "non CHAR(-kcrim)".
!
! En sortie: kmot nombre de mots trouves sur cdop.
! cdmot tableau contenant ces mots.
! --------------------------------------------------------------------------
implicit none
INTEGER(KIND=4) :: IASC
INTEGER(KIND=4) :: IC
INTEGER(KIND=4) :: IMOT
INTEGER(KIND=4) :: IPRESMOT
INTEGER(KIND=4) :: JC
INTEGER(KIND=4) :: KCRIM
INTEGER(KIND=4) :: KMOT

character*(*) cdop
character*(*) cdmot(180)
character*01 cl1
logical lllet
kmot=0
ipresmot=0
ic=len(cdop)
do jc=1,ic
	cl1=cdop(jc:jc)
	iasc=ichar(cl1)
	!
	! lllet: vrai si le caractère est
	! une lettre ASCII accentuée.
	!
	lllet=.false.
	if(iasc.ge.192.and.iasc.le.198) then
		lllet=.true.
	elseif(iasc.eq.199) then
		lllet=.true.
	elseif(iasc.ge.200.and.iasc.le.203) then
		lllet=.true.
	elseif(iasc.ge.204.and.iasc.le.207) then
		lllet=.true.
	elseif(iasc.ge.210.and.iasc.le.214) then
		lllet=.true.
	elseif(iasc.ge.217.and.iasc.le.220) then
		lllet=.true.
	elseif(iasc.ge.221.and.iasc.le.221) then
		lllet=.true.
	elseif(iasc.ge.224.and.iasc.le.229) then
		lllet=.true.
	elseif(iasc.ge.231.and.iasc.le.231) then
		lllet=.true.
	elseif(iasc.ge.232.and.iasc.le.235) then
		lllet=.true.
	elseif(iasc.ge.236.and.iasc.le.239) then
		lllet=.true.
	elseif(iasc.ge.242.and.iasc.le.246) then
		lllet=.true.
	elseif(iasc.ge.249.and.iasc.le.252) then
		lllet=.true.
	endif
	if(kcrim.eq.1) then
		if(cl1.ne.' '.and.cl1.ne.'	') then
			imot=1
		else
			imot=0
		endif
	elseif(kcrim.eq.2) then
		if((cl1.ge.'a'.and.cl1.le.'z') &
& 		.or.(cl1.ge.'A'.and.cl1.le.'Z') &
& 		.or.(cl1.ge.'0'.and.cl1.le.'9') &
& 		.or.cl1.eq.'_' &
& 		.or.cl1.eq.'.'.or.lllet) then
			imot=1
		else
			imot=0
		endif
	elseif(kcrim.eq.3) then
		if(cl1.eq.'E'.or.cl1.eq.'e') then
			if(jc.eq.1.or.jc.eq.ic) then
				!
				! On est en présence d'un "E" en début
				! ou en fin de ligne. Ce mot n'est pas un
				! nombre valide.
				!
				imot=0
			else
				!
				! On est en présence d'un "E"
				! à l'intérieur de la ligne.
				! Ce "E" sera celui d'une exponentiation
				! ssi le caractère qui le précède est
				! un chiffre et que le suivant est un chiffre
				! ou un signe.
				!
				if(((cdop(jc-1:jc-1).ge.'0' &
& 				.and.cdop(jc-1:jc-1).le.'9').or.cdop(jc-1:jc-1).eq.'.') &
& 				.and.((cdop(jc+1:jc+1).eq.'+' &
& 				.or.cdop(jc+1:jc+1).eq.'-'.or.(cdop(jc+1:jc+1).ge.'0' &
& 				.and.cdop(jc+1:jc+1).le.'9')))) then
					imot=1
				else
					imot=0
				endif
			endif
		elseif(cl1.eq.'+'.or.cl1.eq.'-') then
			if(jc.eq.1) then
				!
				! On est en présence d'un signe en début
				! de ligne.
				!
				imot=0
				if(ic.eq.1) then
					!
					! La ligne a un seul caractère, ce signe!...
					!
					imot=0
				else
					!
					! Le caractère suivant doit être
					! un chiffre ou séparateur décimal.
					!
					if((cdop(2:2).ge.'0'.and.cdop(2:2).le.'9') &
& 					.or.cdop(2:2).eq.'.') then
						imot=1
					else
						imot=0
					endif
				endif
			elseif(jc.eq.ic) then
				!
				! On est en présence d'un signe en fin
				! de ligne.
				!
				imot=0
			else
				!
				! On est en présence d'un signe à l'intérieur de la ligne.
				! Le caractère suivant doit être
				! un chiffre ou séparateur décimal,
				! et le précédent doit être un "e" ou "E" ou un non chiffre non point
				! (ce afin de séparer les cas d'entrée incorrectes du type 3.63E00-3.7E07,
				! qui conduirait au deux mots 3.63E00 et 3.7E07;
				! la sortie de mots sera en ce dernier cas fausse, mais l'entrée
				! de l'utilisateur l'était également!...).
				!
				if(((cdop(jc+1:jc+1).ge.'0'.and.cdop(jc+1:jc+1).le.'9') &
& 				.or.cdop(jc+1:jc+1).eq.'.') &
& 				.and.(cdop(jc-1:jc-1).ne.'.'.and. &
& 				(cdop(jc-1:jc-1).lt.'0'.or.cdop(jc-1:jc-1).gt.'9'))) then
					imot=1
				else
					imot=0
				endif
			endif
		elseif(cl1.ge.'0'.and.cl1.le.'9') then
			imot=1
		elseif(cl1.eq.'.') then
			if(jc.eq.1) then
				!
				! On est en présence d'un point en début
				! de ligne.
				! Le caractère suivant doit être
                ! un chiffre.
				!
				if(cdop(2:2).ge.'0'.and.cdop(2:2).le.'9') then
					imot=1
				else
					imot=0
				endif
			elseif(jc.eq.ic) then
				!
				! On est en présence d'un point en fin
				! de ligne.
				! Le caractère précédent doit être
				! un chiffre.
				!
				if(cdop(jc-1:jc-1).ge.'0'.and.cdop(jc-1:jc-1).le.'9') then
                    imot=1
                else
                    imot=0
                endif
			else
				!
				! On est en présence d'un point à l'intérieur de la ligne.
				! Le caractère suivant ou précédent doit être
				! un chiffre.
				!
				if((cdop(jc+1:jc+1).ge.'0'.and.cdop(jc+1:jc+1).le.'9') &
& 				.or.(cdop(jc-1:jc-1).ge.'0'.and.cdop(jc-1:jc-1).le.'9')) then
                    imot=1
                else
                    imot=0
                endif
			endif
		else
			imot=0
		endif
	elseif(kcrim.eq.4) then
		if((cl1.ge.'a'.and.cl1.le.'z') &
& 		.or.(cl1.ge.'A'.and.cl1.le.'Z') &
& 		.or.(cl1.ge.'0'.and.cl1.le.'9') &
& 		.or.lllet) then
			imot=1
		else
			imot=0
		endif
	elseif(kcrim.eq.5) then
		if((cl1.ge.'a'.and.cl1.le.'z') &
& 		.or.(cl1.ge.'A'.and.cl1.le.'Z') &
& 		.or.(cl1.ge.'0'.and.cl1.le.'9') &
& 		.or.cl1.eq.'_' &
& 		.or.cl1.eq.'-' &
& 		.or.lllet) then
			imot=1
		else
			imot=0
		endif
	elseif(kcrim.eq.6) then
		if(cl1.ne.' '.and.cl1.ne.'	'.and.cl1.ne.'-'.and.cl1.ne.'.') then
			imot=1
		else
			imot=0
		endif
	elseif(kcrim.eq.7) then
		if(cl1.ne.'.') then
			imot=1
		else
			imot=0
		endif
	elseif(kcrim.eq.8) then
		if(cl1.ge.'0'.and.cl1.le.'9') then
			imot=1
		else
			imot=0
		endif
	elseif(kcrim.eq.9) then
		if(cl1.ne.'/') then
			imot=1
		else
			imot=0
		endif
	elseif(kcrim.eq.10) then
		if(cl1.ne.',') then
			imot=1
		else
			imot=0
		endif
	elseif(kcrim.lt.0) then
		if(cl1.ne.char(-kcrim)) then
			imot=1
		else
			imot=0
		endif
	else
		print*,'CASC/ERREUR: option kcrim=',kcrim,' non reconnue!...'
		stop 'call abort'
	endif
	if(imot.eq.0.and.ipresmot.eq.0) then
		!
		! Le caractère courant est hors d'un mot, le précédent aussi.
		!
	elseif(imot.eq.0) then
		!
		! Le caractère courant est hors d'un mot, le précédent était dedans.
		!
		kmot=kmot+1
		cdmot(kmot)=cdop(ipresmot:jc-1)
		ipresmot=0
	elseif(ipresmot.eq.0) then
		!
		! Le caractère courant est dans un mot, le précédent était en dehors.
		!
		ipresmot=jc
	endif
	if(jc.eq.ic.and.imot.ne.0) then
		!
		! Le dernier caractère de la ligne est dans un mot.
		!
		kmot=kmot+1
		cdmot(kmot)=cdop(ipresmot:jc)
	endif
enddo
end
