text:
Oberon/ETH Oberon/PPPMain.Mod

(* ETH Oberon, Copyright 1990-2003 Computer Systems Institute, ETH Zurich, CH-8092 Zurich. Refer to the license.txt file provided with this distribution. *) MODULE PPPMain;	(** non-portable *)	(* Contributed by Martin Aeschlimann, Claude Knaus & Edgar Schwarz *) (* $VCS  4, Edgar@EdgarSchwarz.de, 04.06.00 19:19:56 $     $Log$ $   4, Edgar@EdgarSchwarz.de, 04.06.00 19:19:56 PAP password set with Netsystem and StartInst   $   3, Edgar@EdgarSchwarz.de, 9 May :0, 1:24:6 \silent in Oberon.Text, PAP tries $   2, Edgar.Schwarz@z.zgs.de, 18 Aug 99, 21:35:8 adapted to new PPPDebug which now logs to kernel log $   1, Edgar.Schwarz@z.zgs.de, 28 Feb 99, 22:26:14 version for PPP 1.0.0 *) (* 	ToDo: 		SendPacket ueberpruefen, falls nicht alle characters gesendet  		Spaeter: Routing von PacketTools entkoppeln *) IMPORT HDLC:=PPPHDLC, LCP:=PPPLCP, IPCP:=PPPIPCP, FSM:=PPPFSM, PAP := PPPPAP, SYSTEM, Debug := PPPDebug, T:=PPPTools, O:=Objects, PT:=(*es*)NetBase, NetIP, V24, Out, NetSystem, (*PacketTools, *) (*es*) Oberon, Texts; (* P := Peripherals, XOberon, XTexts, Base; *) CONST PPPIP = 0021H; (*es*)IPPROT(*IP*) = 0800H; ARP = 0806H; (* Protocol Constants *) DefMRU = HDLC.MTU; MinMRU = 128; MaxMRU = HDLC.MTU; (* Options Index for LCP Want-,  AllowOptions *) Silent* = LCP.Silent; Passive* = LCP.Passive; NegMRU* = LCP.NegMRU; NegAsyncMap* = LCP.NegAsyncMap; NegMagicNumber* = LCP.NegMagicNumber; NegUPap* = LCP.NegUPap; TYPE Options* = LCP.Options; (*es*) PhysAdr = ARRAY 6 OF SYSTEM.BYTE; CommDevice* = POINTER TO RECORD (PT.Device) IpAdr*, GwAdr*, NetMask*: NetIP.Adr; AdrLen*: INTEGER; Start*, Stop*, Reset*: PROCEDURE; configurated*, ptp*: BOOLEAN; c*: LONGINT; (*COM Port *) END; PPPid* = POINTER TO PPPidDesc; PPPidDesc* = RECORD (HDLC.PPPUnitDesc) running:BOOLEAN; LCPfsm: LCP.LCPfsm;		(* LCP Protocol *) IPCPfsm: IPCP.IPCPfsm;	(* IPCP Protocol *) PAPStat: PAP.PAPStat;	(* PAP Protocol *) me: (*es*)(*PT.*)CommDevice; END; VAR ppp:PPPid;	ch: (*es*)LONGINT(*P.SerialChannel*); PROCEDURE ^Start*(id:PPPid); PROCEDURE ^Stop*(id:PPPid); PROCEDURE ^SendPacket*(id:PPPid; prno: INTEGER; item: PT.Item); PROCEDURE * Connect (me: Oberon.Task); VAR prno: INTEGER; item: PT.Item; BEGIN IF V24.Available(ppp.me.c) > 0 THEN prno := 0; NEW(item); HDLC.ReceivePacket(ppp, prno, item); IF ppp.me.state = PT.open THEN Oberon.Remove(ppp.task); ppp.task := NIL; END; END; END Connect; (* --- *) (* Dummy Procedures - for Packet Tools (needs parameterless procedures!) *) PROCEDURE StartInst*; (* [ ] *) (* PAP password must be set as NetSystem.SetUser pap: [: ]@ ~ *) VAR S: Texts.Scanner; ao: Options; provider, papname, pappasswd:ARRAY 32 OF CHAR; BEGIN (* check for provider and username in case of PAP usage *) Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S); IF ~S.eot THEN COPY(S.s, provider); IF HDLC.debug THEN Debug.String("Provider: "); Debug.String(provider); Debug.Ln; END; Texts.Scan(S); COPY(S.s, papname); IF HDLC.debug THEN Debug.String("papname: "); Debug.String(papname); Debug.Ln; END; NetSystem.GetPassword("pap", provider, papname, pappasswd); IF HDLC.debug THEN Debug.String("pappasswd: "); Debug.String(pappasswd); Debug.Ln; END; IF pappasswd # "" THEN INCL(ppp.LCPfsm.ao.O, NegUPap); END; ELSE papname := ""; pappasswd := ""; END; PAP.Init(ppp.PAPStat, ppp, papname, pappasswd); (* send first request to peer *) Start(ppp); (* install task to negotiate PPP and finally open device *) NEW(ppp.task); ppp.task.safe := FALSE; ppp.task.time := 0; ppp.task.handle := Connect; Oberon.Install(ppp.task); END StartInst; PROCEDURE StopInst*; BEGIN Stop(ppp); END StopInst; (*es*) PROCEDURE * AvailableInst (dev: PT.Device): BOOLEAN; BEGIN RETURN V24.Available(dev(CommDevice).c) > 0; END AvailableInst; PROCEDURE * ReceiveInst (dev: PT.Device; VAR prno: INTEGER;  							VAR src: ARRAY OF SYSTEM.BYTE; VAR item: PT.Item); BEGIN HDLC.ReceivePacket(ppp, prno, item); END ReceiveInst; PROCEDURE SendInst* (dev: PT.Device; prno: INTEGER; 	VAR dest: ARRAY OF  SYSTEM.BYTE; item: PT.Item); BEGIN SendPacket(ppp, prno, item) END SendInst; PROCEDURE ResetInst*; BEGIN END ResetInst; (* --- *) (* Real PPP-Procedure-Interface *) (* Start - Start the PPP-Instance: active means that PPP starts sending Configure-Requests *) PROCEDURE Start*(id:PPPid); BEGIN IF ~id.running THEN id.running:=TRUE; LCP.LowerUp(id.LCPfsm); LCP.Open(id.LCPfsm); END END Start; (* Stop - Stop the PPP-Instance *) PROCEDURE Stop*(id:PPPid); BEGIN IF id.running THEN id.running:=FALSE; IPCP.Close(id.IPCPfsm); LCP.Close(id.LCPfsm); (*es, close the device *) id.me.state := PT.closed; (* hack to signal HDLC.CheckTimer to swallow log output *) id.cname := ""; END END Stop; (* Remove - Remove the PPP-Instance completely *) PROCEDURE Remove*(VAR id:PPPid); BEGIN Stop(id); (*es??? no unistall for devices in NetBase found 		id.task.UnInstall;	(* Remove Task *) 		PT.UnInstallDevice(id.me); es*) id:=NIL; END Remove; (* SendPacket - Interface for IP-Client to send Item *) PROCEDURE SendPacket*(id:PPPid; prno: INTEGER; item: PT.Item); VAR a: ARRAY HDLC.ArrayLength OF CHAR; pos: INTEGER; BEGIN IF id.running THEN IF (*es*)prno(*item.type*) = ARP THEN item.data(*.data*)[7] := 2X; SYSTEM.MOVE(SYSTEM.ADR(item.data(*.data*)[24]), SYSTEM.ADR(item.data(*.data*)[14]), NetIP.AdrLen); SYSTEM.MOVE(SYSTEM.ADR(id.me.IpAdr), SYSTEM.ADR(item.data(*.data*)[24]), NetIP.AdrLen); (*es???*) Debug.String("PT.arprec:. whatdowedo?");Debug.Ln; HALT(99); (* PT.arprec(item) *) ELSIF (*es*)prno(*item.type*) = (*es*)IPPROT(*IP*) THEN (*es*) IF id.me.state = PT.open THEN pos := HDLC.HDLCHeaderLen + HDLC.StartPos; SYSTEM.MOVE(SYSTEM.ADR(item.data[item.ofs]), 	  		  	SYSTEM.ADR(a[pos]), item.len); HDLC.SendPacket(id, PPPIP, a, pos, item.len) ELSE Debug.String("IP Packet to send discarded. Device not open."); Debug.Ln; END; (* pos := HDLC.HDLCHeaderLen + HDLC.StartPos; 				   SYSTEM.MOVE(SYSTEM.ADR(item.data.data[0]), SYSTEM.ADR(a[pos]), item.len); 					HDLC.SendPacket(id, PPPIP, a, pos, item.len) 				*) ELSE Debug.String("unknown packet. whatdowedo?"); Debug.Hex((*es*)prno(*item.type*)); Debug.Ln 			END END; (*es*)PT.RecycleItem(item); (* PT.PutItem(PT.empty, item) (* dm: 21.10.96 *) *) END SendPacket; (* Install- Install a PPP-Instance for Channel c, with specified IP-Adr:  		Null-IPAdr means no wishes 	    LCPwo: LCPWant-Options, LCPAllow-Options: See Options List *) PROCEDURE Install*(c: (*es*)LONGINT(*P.SerialChannel*); 		cname: ARRAY OF CHAR;  		VAR loginuser, loginpasswd, sstr: ARRAY OF CHAR;  		OurIP, HisIP, NetMask: NetIP.Adr; LCPwo, LCPao: Options; nretries: INTEGER; 		timeout: LONGINT; VAR id: PPPid); VAR i:INTEGER; BEGIN NEW(id); id.running:=FALSE; HDLC.Init(id, c, cname, sstr, loginuser, loginpasswd); (*es*)(* Init CommDevice *) NEW(id.me); FOR i:=0 TO NetIP.AdrLen-1 DO id.me.IpAdr[i]:=0X; id.me.GwAdr[i]:=0X; id.me.NetMask[i]:=NetMask[i] END; id.me.Start:=StartInst; id.me.Stop:=StopInst; id.me.Reset:=ResetInst; id.me.Send:=SendInst; (*es*)id.me.Receive := ReceiveInst; id.me.Available := AvailableInst; id.c := c; id.me.c := id.c; 		id.me.typ := PT.nobroadcast; id.me.sndCnt := 0; id.me.recCnt := 0; (**) id.me.AdrLen:=0; id.me.configurated:=FALSE; id.me.ptp:=TRUE; FSM.ActTimeout:=timeout*1000; FSM.ActMaxConfReqs:=nretries; LCP.Init(id.LCPfsm, LCPwo, LCPao, id); IPCP.Init(id.IPCPfsm, id, OurIP, HisIP); (* id.task.Install(HDLC.ReceivePacket); 		id.task.Notify;	(* Install Task *)*) (*es*)PT.InstallDevice(id.me); id.me.state := PT.pending; Out.String(cname); Out.String(" device installed on COM"); Out.Int(c+1, 1); Out.Ln 		(*PT.InsertDevice(id.me);*) END Install; (* --- *) (* Upcalls from LCP, IPCP, HDLC *) (*es, try to avoid that IPCP goes up as long as PAP isn't finished *) PROCEDURE LCPUp1 (U:HDLC.PPPUnit); BEGIN Debug.String("LCP is finally ready!!"); Debug.Ln; IPCP.LowerUp(U(PPPid).IPCPfsm); IPCP.Open(U(PPPid).IPCPfsm); END LCPUp1; (* LCPUp - Called by LCP when LCP is ready *) PROCEDURE * LCPUp (U:HDLC.PPPUnit); BEGIN IF LCP.NegUPap IN U(PPPid).LCPfsm.ho.O THEN (* auth is requested by peer *) Debug.String("Main.LCPUp: auth requested by peer"); Debug.Ln; PAP.LowerUp(U(PPPid).PAPStat) ELSE Debug.String("Main.LCPUp: no auth requested by peer"); Debug.Ln; LCPUp1 (U); END; END LCPUp; (** old 	(* LCPUp - Called by LCP when LCP is ready *) 	PROCEDURE * LCPUp (U:HDLC.PPPUnit); 	BEGIN 		Debug.String("LCP is finally ready!!"); Debug.Ln; 		IF LCP.NegUPap IN U(PPPid).LCPfsm.ho.O THEN (* auth is requested by peer *) 			PAP.LowerUp(U(PPPid).PAPStat) 		END; 		IPCP.LowerUp(U(PPPid).IPCPfsm); 		IPCP.Open(U(PPPid).IPCPfsm); 	END LCPUp; **) (* LCPDown - Called by LCP when LCP is closed *) PROCEDURE * LCPDown (U:HDLC.PPPUnit); BEGIN IPCP.LowerDown(U(PPPid).IPCPfsm); IF LCP.NegUPap IN U(PPPid).LCPfsm.ho.O THEN	(* auth is requested by peer *) PAP.LowerDown(U(PPPid).PAPStat) END END LCPDown; (* LCPProtRej - Called by LCP when a Protocol Reject has arrived *) PROCEDURE * LCPProtRej (U:HDLC.PPPUnit; prot:INTEGER); BEGIN WITH U:PPPid DO 			IF prot=LCP.LCP THEN	FSM.ProtReject(U.LCPfsm);	(* LCP cannot be rejected *) ELSIF prot=IPCP.IPCP THEN Debug.String("IPCP Protocol rejected!! Serious Problem!"); Debug.Ln; ELSE	Debug.String("Protocol rejected:"); Debug.Int(prot, 8); Debug.Ln; END END END LCPProtRej; (* IPCPUp - Called by IPCP when IPCP is ready *) PROCEDURE * IPCPUp (U:HDLC.PPPUnit); BEGIN WITH U:PPPid DO 			U.me.IpAdr:=U.IPCPfsm.go.OurAddress; U.me.GwAdr:=U.IPCPfsm.ho.HisAddress; (*es*)NetIP.routes[0].adr := U.IPCPfsm.go.OurAddress; NetSystem.hostIP := SYSTEM.VAL(LONGINT,U.IPCPfsm.go.OurAddress); NetSystem.ToNum(NetSystem.hostIP, NetSystem.hostName);	(* temporary *) NetIP.routes[0].gway := U.IPCPfsm.ho.HisAddress; IF U.me.state = PT.open THEN Debug.String("Warning: device already open"); Debug.Ln; END; U.me.state := PT.open; (* open device *) (**)U.me.configurated:=TRUE; Debug.String("OurAddress = "); Debug.Hex(SYSTEM.VAL(LONGINT, U.me.IpAdr)); Debug.Ln; Debug.String("HisAddress = "); Debug.Hex(SYSTEM.VAL(LONGINT, U.me.GwAdr)); Debug.Ln; IF LCP.NegUPap IN U.LCPfsm.ho.O THEN PAP.LowerUp(U.PAPStat) END END; Debug.String("IPCP is finally ready!!"); Debug.Ln; Debug.Ln; (*es*) Out.String("IPCP is finally ready. Device opened."); Out.Ln; END IPCPUp; (* IPCPDown - Called by IPCP when IPCP is closed *) PROCEDURE * IPCPDown (U:HDLC.PPPUnit); BEGIN (*pe*) Out.String("PPP connection closed."); Out.Ln; WITH U: PPPid DO 			U.me.configurated:=FALSE; PAP.LowerDown(U.PAPStat) END END IPCPDown; (* Receive - Called by HDLC to demultiplex the protocol *) PROCEDURE * Receive (U:HDLC.PPPUnit; prot:INTEGER; 			VAR p: ARRAY OF CHAR; pos, len:INTEGER;  			VAR prno: INTEGER; VAR item: PT.Item); VAR i: INTEGER; BEGIN WITH U:PPPid DO 			IF prot=LCP.LCP THEN	LCP.Input(U.LCPfsm, p, pos, len); ELSE IF U.LCPfsm.State=FSM.Opened THEN (* No other packets unless LCP is open *) IF prot=PAP.PAPProt THEN PAP.Input(U.PAPStat, p, pos, len); (*es, check whether IPCP can go up *) IF U.PAPStat.state = PAP.Open THEN LCPUp1(U); END; (**) 					ELSE IF LCP.NegUPap IN U(PPPid).LCPfsm.ho.O THEN IF U.PAPStat.state=PAP.Open THEN (* No other packets unless Auth is completed*) IF prot=IPCP.IPCP THEN	IPCP.Input(U.IPCPfsm, p, pos, len) ELSE IF U.IPCPfsm.State=FSM.Opened THEN (* No IP packets unless IPCP is open *) IF prot=PPPIP THEN		(* only IP-Packets *) (*es*)(* Item provided by NetBase.PollDevices *) (* PT.NewItem(item); item.cd:=U.me;*) item.len:=len; (*es*)prno := IPPROT;(*item.type:= IP*); SYSTEM.MOVE(SYSTEM.ADR(p[pos]), 												SYSTEM.ADR(item.data(*.data*)[0]), len); (*es???*)Debug.String("PT.iprec 0"); (*PT.iprec(item)*) ELSE Debug.String("Unknown Protocol: "); Debug.Int(prot,8); Debug.Ln; LCP.SendProtRej(U.LCPfsm, p, pos-4, len+4); (* dm 11.10.96; pos-2, len+2 *) END END END END ELSE IF prot=IPCP.IPCP THEN IPCP.Input(U.IPCPfsm, p, pos, len) ELSE IF U.IPCPfsm.State=FSM.Opened THEN (* No IP packets unless IPCP is open *) IF prot=PPPIP THEN		(* only IP-Packets *) (*es*)(* Item provided by NetBase.PollDevices *) (* PT.NewItem(item); item.cd:=U.me;*) item.len:=len; (*es*)prno := IPPROT; (*item.type := IP*); SYSTEM.MOVE(SYSTEM.ADR(p[pos]), 											SYSTEM.ADR(item.data(*.data*)[0]), len); (*es*)Debug.String("PT.iprec 1"); Debug.Int(item.ofs, 5); Debug.Ln; (*PT.iprec(item)*) ELSE Debug.String("Unknown Protocol: "); Debug.Int(prot,8); Debug.Ln; LCP.SendProtRej(U.LCPfsm, p, pos-4, len+4); (* dm 11.10.96; pos-2, len+2 *) END END END END END END END END END Receive; (* --- *) (* PPP-User-Interface *) PROCEDURE SetIP(n0,n1,n2,n3:INTEGER; VAR ip:NetIP.Adr);	(* n1.n2.n3.n4 *) BEGIN ip[0]:=CHR(n0); ip[1]:=CHR(n1); ip[2]:=CHR(n2); ip[3]:=CHR(n3); END SetIP; PROCEDURE Hex2Set(A: ARRAY OF CHAR):SET; VAR d, i, j, k, ch, x:INTEGER; s: SET; BEGIN s:={}; i:=0; WHILE A[i]=" " DO INC(i); END; x:=31; ch:=ORD(A[i]); j:=0; WHILE (j<8) DO 			IF (ch>=ORD("0")) & (ch<=ORD("9")) THEN k:=ch-ORD("0"); ELSIF (ch>=ORD("A")) & (ch<=ORD("F")) THEN k:=ch+10-ORD("A"); ELSE RETURN {}; END; d:=8; WHILE d>0 DO IF d<=k THEN k:=k-d; INCL(s, x) END;   DEC(x); d:=d DIV 2;  END; INC(i); INC(j); ch:=ORD(A[i]); END; IF (ch=0) OR (ch=20H) THEN RETURN s; ELSE RETURN {} END END Hex2Set; (* InstPPP - Start a PPPConnection with Channel162 as Command *) (* Options:  /IP  OurIP HisIP												 8 Integers, no ".",  0 0 0 0 means no wish 						/NetMask MyNetMask									 4 Integer, no ".", default: 255 255 255 255 	 					/Silent															 If Silent, PPP does not try to connect himself 	 					/Rtr  nofRetries												Number of Retries when no or bad answer 	  				   /TO  nofTimeOuts											TimeOut Time between Retries in seconds 	  				   /MRUWant  Value (1500 usual) 				 	 Size of packets we want to sent  	   				  /MRUAllow													 Do we allow him to send smaller packets than 1500 bytes? 	   				  /AsyWant  XHexValue (p.e X00000000)		  Bitarray of ASCII-Char. from 0 to 31 we want to send with ESC-Code 	   				  /AsyAllow  XHexValue (p.e X0000FF00)          Bitarray of ASCII-Char. from 0 to 31 he must send with ESC-Cod 	   				  /MagWant													  MagicNumber wanted (for Loop-Detection) 	   				  /MagAllow													 MagicNumber allowed /LoginName "String"										loginname (used by login-procedure on Solaris) /LoginPasswd "String"									password (used by login-procedure on Solaris) /PAPName "string"										userid for PAP /PAPPasswd "string"									 password for PAP /SString "string"										   string to send to ppp-server first (Windows NT RAS Server needs it) *) 	PROCEDURE InstPPP*; 	VAR ourIP, hisIP, myNetMask: NetIP.Adr; n0,n1,n2,n3, rtr: INTEGER; 		to: LONGINT; 		wo, ao: Options; InDone:BOOLEAN; S: Texts.Scanner; 		(*es*)devName, (**) s, sstr, loginname, loginpasswd: ARRAY 32 OF CHAR; 		ok: BOOLEAN; i:INTEGER; 		(*es*)(*obj: Base.Object;*) 		PROCEDURE Cmp(t:ARRAY OF CHAR):BOOLEAN; 			VAR i,j:INTEGER; 		BEGIN i:=1; j:=0; 			WHILE (s[i]#0X) & (t[j]=s[i]) DO INC(i); INC(j); END; 			RETURN (t[j]=0X) 		END Cmp; 		PROCEDURE InInt(VAR n:INTEGER); 		BEGIN 			WHILE (S.class = Texts.Char) & (S.c = 0DX) DO Texts.Scan(S) END;  			IF S.class=Texts.Int THEN n:=SHORT(S.i); Texts.Scan(S); 			ELSE InDone:=FALSE 			END; 		END InInt; 		PROCEDURE InName(VAR u:ARRAY OF CHAR); 		BEGIN  			WHILE (S.class = Texts.Char) & (S.c = 0DX) DO Texts.Scan(S) END; 			IF S.class=Texts.String THEN COPY(S.s, u); Texts.Scan(S) 			ELSE InDone:=FALSE 			END; 		END InName; BEGIN ao.O:={}; wo.O:={}; ourIP:=IPCP.ZeroIP; hisIP:=IPCP.ZeroIP; rtr:=FSM.DefMaxConfReqs; to:=FSM.DefTimeout; loginname[0] := 0X; loginpasswd[0] := 0X; sstr[0] := 0X; FOR i := 0 TO NetIP.AdrLen - 1 DO myNetMask[i] := 0FFX END; (*es*) Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); LOOP Texts.Scan(S); IF S.eot THEN EXIT; END; IF (S.class = Texts.Name) & (S.s[0] = "C") THEN devName := "PPP"; IF S.s = "COM1" THEN ch := V24.COM1 ELSIF S.s = "COM2" THEN ch := V24.COM2 ELSIF S.s = "COM3" THEN ch := V24.COM3 ELSIF S.s = "COM4" THEN ch := V24.COM4 ELSE HALT(99) END; ELSIF (S.class = Texts.Char) & (S.c = "\") THEN (* an option *) Texts.Scan(S); IF S.eot THEN EXIT; END; IF S.class = Texts.Name THEN IF S.s = "silent" THEN INCL(wo.O, Silent); ELSE Debug.String("unknown option"); Debug.Ln 					END; Debug.String("\"); Debug.String(S.s); Debug.Ln 				END; ELSE HALT(99); END; END; (*es*) (*MRUWant*) INCL(wo.O, NegMRU); wo.MRU:=1500; IF HDLC.debug THEN Debug.String("MRUWant "); Debug.Int(wo.MRU, 5); Debug.Ln 		END; (*MRUAllow*)INCL(ao.O, NegMRU); ao.MRU:=MaxMRU; IF HDLC.debug THEN Debug.String("MRUAllow"); Debug.Ln 		END; (*AsyWant*) INCL(wo.O, NegAsyncMap); wo.AsyncMap:={}; IF HDLC.debug THEN Debug.String("AsyWant "); Debug.Hex(SYSTEM.VAL(LONGINT, wo.AsyncMap)); Debug.Ln 		END; (*AsyAllow*) INCL(ao.O, NegAsyncMap); ao.AsyncMap:={0..31}; IF HDLC.debug THEN Debug.String("AsyAllow "); Debug.Hex(SYSTEM.VAL(LONGINT, ao.AsyncMap)); Debug.Ln 		END; (*TO*) to:=5; IF HDLC.debug THEN Debug.String("TO "); Debug.Int(to, 5); Debug.Ln 		END; (*IP * SetIP(0,0,0,0, ourIP); 		IF HDLC.debug THEN  			Debug.String("ourIP "); Debug.Ln  		END; *) (*IP* SetIP(0,0,0,0, hisIP); 		IF HDLC.debug THEN  			Debug.String("hisIP "); Debug.Ln  		END; *) (*Netmask*) SetIP(255,255,255,0,myNetMask); IF HDLC.debug THEN Debug.String("myNetmask set to 255.255.255.0"); Debug.Ln 		END; (* alle Parameter oben mal fest gesetzt ??? 		Texts.OpenScanner(S ,Oberon.Par.text, Oberon.Par.pos); 		(*Texts.OpenScanner(S ,XOberon.ParText, XOberon.ParPos);*)  		ok:=FALSE; Texts.Scan(S); 		InName(s); 		InDone := TRUE; 		WHILE InDone DO 			IF s[0]="/" THEN 				IF Cmp("MRUWant") THEN  					InInt(i); INCL(wo.O, NegMRU); wo.MRU:=i; 					IF HDLC.debug THEN Debug.String("MRUWant "); Debug.Int(i, 5) END 				ELSIF Cmp("MRUAllow") THEN  					INCL(ao.O, NegMRU); ao.MRU:=MaxMRU; 					IF HDLC.debug THEN Debug.String("MRUAllow") END 				ELSIF Cmp("AsyWant") THEN 					InName(s); INCL(wo.O, NegAsyncMap);  					wo.AsyncMap:=Hex2Set(s); 					IF HDLC.debug THEN Debug.String("AsyWant "); Debug.Hex(SYSTEM.VAL(LONGINT, wo.AsyncMap)) END 				ELSIF Cmp("AsyAllow") THEN 					InName(s); INCL(ao.O, NegAsyncMap);  					ao.AsyncMap:=(*es*){}(*Hex2Set(s)*); 					IF HDLC.debug THEN Debug.String("AsyAllow "); Debug.Hex(SYSTEM.VAL(LONGINT, ao.AsyncMap)) END ELSIF Cmp("MagWant") THEN INCL(wo.O, NegMagicNumber); IF HDLC.debug THEN Debug.String("MagWant") END ELSIF Cmp("MagAllow") THEN INCL(ao.O, NegMagicNumber); IF HDLC.debug THEN Debug.String("MagAllow") END ELSIF Cmp("Silent") THEN INCL(wo.O, Silent); IF HDLC.debug THEN Debug.String("Silent") END ELSIF Cmp("Rtr") THEN InInt(i); rtr:=i; IF HDLC.debug THEN Debug.String("Rtr "); Debug.Int(i, 5) END ELSIF Cmp("TO") THEN InInt(i); to:=i; IF HDLC.debug THEN Debug.String("TO "); Debug.Int(i, 5) END ELSIF Cmp("IP") THEN InInt(n0); InInt(n1); InInt(n2); InInt(n3); SetIP(n0, n1, n2, n3, ourIP); IF HDLC.debug THEN Debug.String("ourIP "); Debug.Int(n0, 5); Debug.Int(n1, 5); Debug.Int(n2, 5); Debug.Int(n3, 5); Debug.Ln END; InInt(n0); InInt(n1); InInt(n2); InInt(n3); SetIP(n0, n1, n2, n3, hisIP); IF HDLC.debug THEN Debug.String("hisIP "); Debug.Int(n0, 5); Debug.Int(n1, 5); Debug.Int(n2, 5); Debug.Int(n3, 5) END ELSIF Cmp("Netmask") THEN InInt(n0); InInt(n1); InInt(n2); InInt(n3); SetIP(n0, n1, n2, n3, myNetMask); IF HDLC.debug THEN Debug.String("myNetmask "); Debug.Int(n0, 5); Debug.Int(n1, 5); Debug.Int(n2, 5); Debug.Int(n3, 5) END ELSIF Cmp("LoginName") THEN InName(s); COPY(s, loginname); IF HDLC.debug THEN Debug.String("LoginName: "); Debug.String(loginname) END ELSIF Cmp("LoginPasswd") THEN InName(s); COPY(s, loginpasswd); IF HDLC.debug THEN Debug.String("LoginPassword: "); Debug.String(loginpasswd) END ELSIF Cmp("SString") THEN InName(s); COPY(s, sstr); IF HDLC.debug THEN Debug.String("SString "); Debug.String(sstr) END ELSE IF HDLC.debug THEN Debug.String("Illegal Option") END END; IF HDLC.debug THEN Debug.Ln END ELSE IF HDLC.debug THEN Debug.String(" No Option... "); Debug.String(s); Debug.Ln END END; InName(s); END; es*) (*es*)(* Base.GetObj("V24Channel162", obj); IF (obj#NIL) & (obj IS P.SerialChannel) THEN ch:=obj(P.SerialChannel); *) (**) 			Install(ch, devName, loginname, loginpasswd, (*es*)sstr(*str*), ourIP, hisIP, myNetMask, wo, ao, rtr, to, ppp) (*es*)(*END*) 	END InstPPP; 	(* RemovePPP - Remove PPP Connection completely *) 	PROCEDURE RemovePPP*; BEGIN Remove(ppp) 	END RemovePPP; 	(* Stats - Print Out Information in XLog *) 	PROCEDURE Stats*; 		VAR W:Texts.Writer; s: FSM.String; f:LCP.LCPfsm; g:IPCP.IPCPfsm;  			h: PAP.PAPStat; i:INTEGER; ip: NetIP.Adr; 	BEGIN 		IF ppp # NIL THEN  			f:=ppp.LCPfsm; g:=ppp.IPCPfsm; h := ppp.PAPStat; 			Texts.OpenWriter(W); Texts.WriteString(W, "PPP-beta on ");  			Texts.WriteString(W, ppp.cname);Texts.WriteLn(W); 			Texts.WriteString(W, "LCP is in state: "); FSM.GiveState(f.State, s);  			Texts.WriteString(W, s); Texts.WriteLn(W); 			IF f.State=FSM.Opened THEN 				Texts.WriteString(W, "His MRU wish: ");  				Texts.WriteInt(W, f.ho.MRU, 5); Texts.WriteLn(W); 				Texts.WriteString(W, "MTU configured to: ");  				Texts.WriteInt(W, ppp.MTU, 5); Texts.WriteLn(W); Texts.WriteString(W, "Our MRU wish: "); Texts.WriteInt(W, f.wo.MRU, 5); Texts.WriteLn(W); Texts.WriteString(W, "MRU configured to: "); Texts.WriteInt(W, ppp.MRU, 5); Texts.WriteLn(W); Texts.WriteString(W, "SendAsyncMap configured to: "); T.WriteSet(ppp.SendAsyncMap, s); Texts.WriteString(W, s); Texts.WriteLn(W); IF (NegMagicNumber IN f.ho.O) THEN Texts.WriteString(W, "He wants MagicNumber"); Texts.WriteLn(W); ELSE Texts.WriteString(W, "He doesn't want MagicNumber"); Texts.WriteLn(W); END; IF (NegMagicNumber IN f.go.O) THEN Texts.WriteString(W, "MagicNumber active"); Texts.WriteLn(W); ELSE Texts.WriteString(W, "MagicNumber disabled"); Texts.WriteLn(W); END; END; Texts.WriteString(W, "IPCP is in state: "); FSM.GiveState(g.State, s); Texts.WriteString(W, s); Texts.WriteLn(W); IF g.State=FSM.Opened THEN Texts.WriteString(W, "our Ip-Adr: "); ip:=g.go.OurAddress; FOR i:=0 TO 2 DO 					Texts.WriteInt(W, ORD(SYSTEM.VAL(CHAR, ip[i])),3); Texts.Write(W, "."); END; Texts.WriteInt(W, ORD(SYSTEM.VAL(CHAR, ip[3])),3); Texts.WriteLn(W); Texts.WriteString(W, "his Ip-Adr: "); ip:=g.ho.HisAddress; FOR i:=0 TO 2 DO 					Texts.WriteInt(W, ORD(SYSTEM.VAL(CHAR, ip[i])),3); Texts.Write(W, "."); END; Texts.WriteInt(W, ORD(SYSTEM.VAL(CHAR, ip[3])),3); Texts.WriteLn(W); (*			IF (NegVJ IN g.go.O) THEN 						Texts.WriteString(W, "He wanted VJ:    MaxSlot: ");  						Texts.WriteInt(W, g.ho.MaxSlot, 4); 					Texts.WriteString(W, "     CFlag: ");  					Texts.WriteInt(W, g.ho.CFlag, 4); Texts.WriteLn(W);  					END; 	*)		END; Texts.WriteString(W, "PAP is in state: "); PAP.GiveState(h, s); Texts.WriteString(W, s); Texts.WriteLn(W); (*es*)Texts.Append(Oberon.Log, W.buf) (*Texts.Append(XOberon.XLog, W.buf)*) END END Stats; BEGIN ppp := NIL; LCP.PPPHandleLCPUp:=LCPUp; LCP.PPPHandleLCPDown:=LCPDown; LCP.PPPHandleProtRej:=LCPProtRej; IPCP.PPPHandleIPCPUp:=IPCPUp; IPCP.PPPHandleIPCPDown:=IPCPDown; HDLC.PPPHandleReceive:=Receive; END PPPMain. System.Free PPPMain PPPLCP PPPIPCP PPPFSM PPPHDLC PPPTools PacketTools ~ XPPCCompiler.Compile PPPTools.Mod \Ns PPPHDLC.Mod \Ns PPPPAP.Mod \Ns PPPFSM.Mod \Ns PPPIPCP.Mod\Ns PPPLCP.Mod\Ns PPPMain.Mod \Ns ~ XSystem.Call Cache40.Disable~ Install fuer Windows NT XSystem.Call PPPMain.InstPPP "/TO" 5 "/IP" 0 0 0 0 0 0 0 0 "/Netmask" 255 255 255 224 "/MRUWant" 1500 "/MRUAllow" "/AsyWant" "00000000" "/AsyAllow" "00000000" "/PAPName" "ppp" "/PAPPasswd" "mopsppp" "/SString" "CLIENT" ~ Install fuer SUN XSystem.Call PPPMain.InstPPP "/TO" 5 "/IP" 0 0 0 0 0 0 0 0 "/Netmask" 255 255 255 248 "/MRUWant" 1500 "/MRUAllow" "/AsyWant" "00000000" "/AsyAllow" "00000000" "/Silent" "/LoginName" "ppp" "/LoginPasswd" "mopsppp" ~ (*es*) PPPMain.InstPPP "/TO" 5 	    "/IP" 0 0 0 0  0 0 0 0 "/Netmask" 255 255 255 248  "/MRUWant" 1500 "/MRUAllow"   						"/AsyWant" "00000000" "/AsyAllow" "00000000"         "/Silent" ~ XSystem.Call	PPPMain.Stats ~ XSystem.Call SetCD.Off "129.132.37.143" "129.132.37.129" ~ XSystem.Call TestCD.List ~ do some work XSystem.Call SetCD.On"129.132.37.143" "129.132.37.129" ~ XSystem.Call	PPPMain.RemovePPP ~ XSystem.Call RSystem.Free PPPMain ~ XSystem.Call RSystem.Free PPPLCP ~ XSystem.Call RSystem.Free PPPIPCP ~ XSystem.Call RSystem.Free PPPFSM ~ XSystem.Call RSystem.Free PPPPAP ~ XSystem.Call RSystem.Free PPPHDLC ~ XSystem.Call RSystem.Free PPPTools ~ XSystem.Call XMemTool.Dump 7E0000H 4000H T ~ XSystem.Call XMemTool.Dump 3E0000H 4000H T ~ My.Config

title: Oberon/ETH Oberon/PPPMain.Mod


text:
User talk:Invasive Spices

Welcome!
Welcome to Wikibooks, Invasive Spices!

 First steps tutorial Wikibooks is for collaborative development of free textbooks.

You do not need technical skills to contribute. You can easily change most books. Please introduce yourself, and let us know what interests you.

If you already contribute at other Wikimedia projects, our Wikimedia Orientation should quickly get you started. (Would you like to provide feedback on this message?)

  Getting help   Made a mistake?   Goodies, tips and tricks
 * Read the Using Wikibooks book for a friendly introduction to the project, or our help pages for more information.
 * You can get friendly help from the community in the user assistance room or our IRC channel.
 * Upload freely licensed files to Wikimedia Commons. You may request permission to upload fair use files locally. Please include author and source information and a non-free use rationale for non-free files.
 * You can restore a previously saved version.
 * Pages should follow the  naming convention.
 * Need to rename a page? Use the move tab (is available once your account is 4 days old - until then, ask for help).
 * To request a page be deleted, add to the top of the page.
 * Was a page you made deleted? Please read the deletion policy, and check the deletion log to find out why. Also check the RFD archives if applicable. You can request undeletion at WB:RFU, or ask the administrator who deleted the page.
 * Please fill in the edit summary and preview your edits before saving.
 * Sign your name on discussion pages by typing ~~~~
 * User scripts can make many tasks easier. Look at the Gadgets tab of my preferences; check off the boxes for the scripts you want, and hit save!

-- Jules (Mrjulesd) 22:06, 10 March 2021 (UTC)

license: Creative Commons - Attribution Share-Alike - https://creativecommons.org/licenses/by-sa/4.0/

title: User talk:Invasive Spices


text:
User talk:J.palacios.jean

Welcome!
Welcome to Wikibooks, J.palacios.jean!

 First steps tutorial Wikibooks is for collaborative development of free textbooks.

You do not need technical skills to contribute. You can easily change most books. Please introduce yourself, and let us know what interests you.

If you already contribute at other Wikimedia projects, our Wikimedia Orientation should quickly get you started. (Would you like to provide feedback on this message?)

  Getting help   Made a mistake?   Goodies, tips and tricks
 * Read the Using Wikibooks book for a friendly introduction to the project, or our help pages for more information.
 * You can get friendly help from the community in the user assistance room or our IRC channel.
 * Upload freely licensed files to Wikimedia Commons. You may request permission to upload fair use files locally. Please include author and source information and a non-free use rationale for non-free files.
 * You can restore a previously saved version.
 * Pages should follow the  naming convention.
 * Need to rename a page? Use the move tab (is available once your account is 4 days old - until then, ask for help).
 * To request a page be deleted, add to the top of the page.
 * Was a page you made deleted? Please read the deletion policy, and check the deletion log to find out why. Also check the RFD archives if applicable. You can request undeletion at WB:RFU, or ask the administrator who deleted the page.
 * Please fill in the edit summary and preview your edits before saving.
 * Sign your name on discussion pages by typing ~~~~
 * User scripts can make many tasks easier. Look at the Gadgets tab of my preferences; check off the boxes for the scripts you want, and hit save!

-- Jules (Mrjulesd) 22:12, 10 March 2021 (UTC)

 * Thanks for the information J.palacios.jean (discuss • contribs) 10:22, 16 March 2021 (UTC)

title: User talk:J.palacios.jean


text:
User talk:LeonorPVA

Welcome!
Welcome to Wikibooks, LeonorPVA!

 First steps tutorial Wikibooks is for collaborative development of free textbooks.

You do not need technical skills to contribute. You can easily change most books. Please introduce yourself, and let us know what interests you.

If you already contribute at other Wikimedia projects, our Wikimedia Orientation should quickly get you started. (Would you like to provide feedback on this message?)

  Getting help   Made a mistake?   Goodies, tips and tricks
 * Read the Using Wikibooks book for a friendly introduction to the project, or our help pages for more information.
 * You can get friendly help from the community in the user assistance room or our IRC channel.
 * Upload freely licensed files to Wikimedia Commons. You may request permission to upload fair use files locally. Please include author and source information and a non-free use rationale for non-free files.
 * You can restore a previously saved version.
 * Pages should follow the  naming convention.
 * Need to rename a page? Use the move tab (is available once your account is 4 days old - until then, ask for help).
 * To request a page be deleted, add to the top of the page.
 * Was a page you made deleted? Please read the deletion policy, and check the deletion log to find out why. Also check the RFD archives if applicable. You can request undeletion at WB:RFU, or ask the administrator who deleted the page.
 * Please fill in the edit summary and preview your edits before saving.
 * Sign your name on discussion pages by typing ~~~~
 * User scripts can make many tasks easier. Look at the Gadgets tab of my preferences; check off the boxes for the scripts you want, and hit save!

-- Jules (Mrjulesd) 22:20, 10 March 2021 (UTC)

title: User talk:LeonorPVA


text:
Chess Opening Theory/1. e4/1...e5/2. Nf3/2...Nf6/3. Nxe5/3...Nc6

=Stafford Gambit=

3... Nc6
Black invites White to trade knights. White, being up one pawn in material, is compelled to accept the trade.
 * /4. Nxc6/ is the main line.


text:
Chess Opening Theory/1. e4/1...e5/2. Nf3/2...Nf6/3. Nxe5/3...Nc6/4. Nxc6

=Stafford Gambit=

4. Nxc6
White, being up one pawn in material, trades knights. Black plans to take the sacrifice in material in exchange for rapid development.
 * /4...dxc6/ is the main line.
 * 4...bxc6 is also playable.

=Theory table= .

'''1. e4 e5 2. Nf3 Nf6 3. Nxe5 Nc6 4. Nxc6'''


text:
User talk:Lcfarise

Welcome!
Welcome to Wikibooks, Lcfarise!

 First steps tutorial Wikibooks is for collaborative development of free textbooks.

You do not need technical skills to contribute. You can easily change most books. Please introduce yourself, and let us know what interests you.

If you already contribute at other Wikimedia projects, our Wikimedia Orientation should quickly get you started. (Would you like to provide feedback on this message?)

  Getting help   Made a mistake?   Goodies, tips and tricks
 * Read the Using Wikibooks book for a friendly introduction to the project, or our help pages for more information.
 * You can get friendly help from the community in the user assistance room or our IRC channel.
 * Upload freely licensed files to Wikimedia Commons. You may request permission to upload fair use files locally. Please include author and source information and a non-free use rationale for non-free files.
 * You can restore a previously saved version.
 * Pages should follow the  naming convention.
 * Need to rename a page? Use the move tab (is available once your account is 4 days old - until then, ask for help).
 * To request a page be deleted, add to the top of the page.
 * Was a page you made deleted? Please read the deletion policy, and check the deletion log to find out why. Also check the RFD archives if applicable. You can request undeletion at WB:RFU, or ask the administrator who deleted the page.
 * Please fill in the edit summary and preview your edits before saving.
 * Sign your name on discussion pages by typing ~~~~
 * User scripts can make many tasks easier. Look at the Gadgets tab of my preferences; check off the boxes for the scripts you want, and hit save!

-- Jules (Mrjulesd) 08:34, 11 March 2021 (UTC)

Cheers for the heads-up, Mrjulesd. Just having breakfast, it'll be a while before I can investigate the ins&outs of this particular parallel in the wiki verse, but investigate I will. Was a tad surprised to get seperate msgs from here & meta when I edited what I was reading, purely en passant. Had assumed it was all just under the same banner. Never 'assume', eh? Good morning, and- cheers again! Lcfarise (discuss • contribs) 08:49, 11 March 2021 (UTC)
 * Good morning and cheers! There are several separate Wikimedia projects, with many sub-projects for different languages; English Wikipedia is probably the best known wiki. They are mostly separate from each other. Also see Wikimedia for more on this. -- Jules (Mrjulesd) 09:14, 11 March 2021 (UTC)

Will do! For now, physical-world responsibilities beckon- stay cheery! Lcfarise (discuss • contribs) 09:34, 11 March 2021 (UTC)

title: User talk:Lcfarise


text:
User talk:50.230.2.150

𝟙𝟤𝟯𝟺𝐪𝑤𝒆𝓇𝟷𝟮𝟥𝟜𝓺𝔴𝕖𝖗𝟰 (𝗍𝗮𝘭𝙠) 14:22, 11 March 2021 (UTC)

title: User talk:50.230.2.150


text:
Chess Opening Theory/1. e4/1...e5/2. Nf3/2...Nf6/3. Nxe5/3...Nc6/4. Nxc6/4...dxc6

=Stafford Gambit=

4...dxc6
Black recaptured the knight with the d-pawn. This opens the d-file for Black's queen and the diagonal for Black's light square bishop. The g4-square is now covered by Black's light square bishop.

 * 5. Nc3 protects the e4-pawn.
 * 5. f3 protects the pawn and covers the important g4 square.
 * /5. e5/?! moves the pawn away from danger and gains tempo on Black's knight.


text:
User talk:137.164.229.77

Note
Leaderboard (discuss • contribs) 17:26, 11 March 2021 (UTC)

title: User talk:137.164.229.77


text:
Mirad Thesaurus/Weather

Atmosphere

 * maal=atmosphere
 * maala=atmospheric
 * maalyen=weather
 * maalyena=weather-related
 * maalyentun=meteorology
 * maalyentuna=meteorological
 * maalyentut=meteorologist, weatherperson
 * Ha maalyen se hoyena?='How's the weather?''
 * maalyen dotuun=weather report
 * maalyen jaden=weather prediction
 * maalyen jwaden=weather warning

Wind

 * map=wind
 * mapa=ventral
 * mapika=windy
 * mapikan=windiness
 * mapuka=wind-free
 * ammap=sirocco
 * jetmap=trade wind
 * kumap=sidewind
 * mayp=breeze
 * maypaya=breezy
 * bosa mapi=calm winds
 * mapaz=gale, strong wind
 * maper=to blow
 * mapea=blowing
 * mapen=blowing
 * mapeger=to flutter
 * mapegea=fluttering
 * mapegen=fluttering
 * mapeuser=howl
 * mapeusea=howling
 * mapeusen=howling
 * mapuer=ventilate, blow
 * mapuen=ventilation, blowing
 * mapuar=ventilator, blower, fan
 * mapuir=electric fan
 * mapuur=giant blower, wind tunnel
 * mapitub=weather vane
 * mapig=gust
 * mapiger=to gust
 * mapigea=gusting
 * mapigika=gusty
 * mapigaz=squall
 * mapatub=propeller
 * mapatub mampur=prop plane
 * mapog=puff
 * mapogar=bellows
 * mapogen=puffing
 * mapovar=windshield

Storm

 * mapil=Storm
 * mapilaya=stormy
 * mapiler=to storm
 * mapilyea=stormy
 * mapilag=tempest
 * mapilaga=tempestuous
 * igra mapil=microburst, sudden storm
 * mapiluzrun=hurricane, cyclone
 * mekmapil=dust storm
 * miekmapil=sand storm
 * obemernada mapil=tropical storm
 * xeusmapil=thunderstorm
 * yonmapil=ice storm
 * malyommapil=snowstorm
 * magmapil=firestorm
 * mamyommapil=hail storm
 * iznadmapil=derecho
 * mimmapil=seastorm
 * mimkum mapil=coastal storm
 * mapuzun=whirlwind
 * mapuzlun=tornado, twister
 * mapuzrun=cyclone
 * mimuzrun=hurricane
 * mamil=rain
 * mamiler=to rain
 * Mamileye.=It is raining.
 * mamilaya=rainy
 * mamilaya jeb=rainy season
 * mamilika=rain-filled
 * mamiloya=rain-free
 * mamiluka=rain-free
 * mamilaz=hard rain
 * mamilazer=to rain hard
 * mamiloz=sprinkle
 * mamilozer=to sprinkle
 * mamilug=drizzle
 * mamiluger=to drizzle
 * mamilpyos=downpower, shower, rainfall
 * mamilovar=umbrella
 * mamilfuf=rain spout
 * mamil zyunes=raindrop
 * mamil abof=rain tarp
 * mamil dazun=rain dance
 * mamil nagar=rain gauge
 * mamil fabyan=rain forest
 * mamiltaf=raincoat
 * mamiltif=rain jacket
 * mamiltof=rain gear
 * mamiluz=rainbow
 * mamiluzlun=rain storm
 * gyimamil=downpour
 * gyimamiler=rain hard
 * gyumamil=drizzle
 * gyumamiler=to drizzle
 * gyumamilyea=drizzly
 * jebmamil=monsoon
 * mamyom=hail
 * mamyomer=to hail
 * mamyommeg=hailstone
 * mamyoym=sleet
 * mamyoymer=to sleet
 * Mamyoymeye.=It is sleeting.
 * mamak=lightning
 * mammanig=lightning
 * mamak igpyex=lightning bolt
 * mamxeus=thunder
 * mamxeus mapil=thunderstorm
 * mamxeus pyex=thunder clap

Snow

 * malyom=snow
 * malyomer=to snow
 * Malyomeye.=It is snowing.
 * malyomaya=snowy
 * malyombwa=snow-covered
 * malyomgos=snowflake
 * malyommapil=snowstorm
 * malyomfaof=snowboard
 * malyomfaofer=to snowboard
 * malyomfaofut=snowboarder
 * malyomfaofen=snowboarding
 * malyomkipar=ski
 * malyomkiparer=to (snow)ski
 * malyomkiparen=skiing
 * malyomkiparen kim=ski slope
 * malyomkiparam=ski lodge
 * malyomkiparen tyenuut=ski instructor
 * malyomkiparut=skier
 * malyomkiparen kim=ski slope
 * malyomkipur=snowmobile
 * malyompyos=snowfall
 * malyomzyun=snowball
 * malyomtob=snowman
 * malyom zyug=snow tire
 * yomkipar=ice skate
 * yomkiparer=to iceskate
 * yomkiparen=iceskating
 * yomkiparam=iceskating rink
 * yomkiparut=iceskater

Cold

 * om=cold
 * oma=cold
 * Se oma....It is cold
 * At tose oma....I am (=feel) cold.
 * oman=coldness
 * omay=coldly
 * omser=to get cold
 * Omseye.=It is getting cold.
 * At omseye....I am getting cold.
 * omxer=to refrigerate
 * omxar=refrigerator
 * oyma=cool
 * oyman=coolness
 * oymser=to cool off, become cool
 * oymxer=to cool off, to cool
 * oymxil=refreshment (drink)
 * oymxar=cooler

Ice

 * yom=ice
 * yoma=glacial
 * yomser=to freeze (intrans.)
 * yomxer=to freeze (trans.)
 * yomxen=freezing
 * yomxen nod=freezing point
 * yomxwa=frozen
 * yomxwa tyal=frozen dinner, t.v. dinner
 * yomxar=freezer
 * loyomxer=to defrost
 * yomyeb=ice bucket
 * yomyel=frosting, glaze
 * yomyelber=to frost, glaze
 * yomyelbwa=frosted, glazed
 * yomyem=ice box, freezer
 * yombil=ice milk
 * yomjoub=ice age
 * yomkipar=ice skate
 * yomkiparer=to iceskate
 * yomkiparen=iceskating
 * yomkiparut=iceskater
 * yomkiparam=iceskating rink
 * yomkipir=sled
 * yomkipirer=to sled
 * yomkipiren=sledding
 * yomkipirut=sledder
 * yomkirir yepet=sled dog
 * yomkipur=sleigh
 * yomkipurer=to sleigh
 * yomkipuren=sleighing
 * 'yomkipur seusar=sleigh bell
 * yommeb=iceberg
 * yommel=glacier
 * yommef=ice cube
 * yommez=ice crystal
 * yommefyeb=ice cube tray
 * yomneg=ice floe, ice sheet
 * yomtun=glaciology
 * yomtuna=glaciological
 * yomtut=glaciologist
 * bay yom=with ice, on the rocks
 * boy yom=neat, without ice
 * yoym=frost
 * yoymser=to frost over (intrans.)
 * yoymika=frosty
 * yoymber=to frost
 * yoymxyofwa=frost-free
 * mamyoym=sleet
 * mamyoymer=to sleet
 * yoymovil=antifreeze

Heat

 * am=heat
 * ama=hot
 * aman=hotness
 * amana=thermal
 * amay=hotly
 * amser=to get hot, grow hot, heat up
 * amsea=heating up
 * amxer=to heat up
 * amxen=heating up
 * amxwa=heated up
 * yegamxer=to reheat
 * yegamxwa=reheated
 * amar=warmer
 * amxar=heater
 * amxur=radiator
 * amon=calory
 * glaamona=caloric
 * gloamona=low-cal
 * amnag=temperature
 * amnagar=thermometer
 * amvyabxar=thermostat
 * amilbar=convector
 * amilben=convection
 * amilbuker=to scald
 * amilbuken=scalding
 * amilbukwa=scalded
 * amtibiila=hot-blooded
 * amxeyentix=thermodynamics
 * ambok=fever, inflammation
 * amboka=febrile, inflammatory
 * ambokser=to run a fever, get inflammed
 * ambokxer=to inflame
 * ambokyena=''feverish'
 * ama zyibolar=hot plate
 * ayma=warm
 * ayman=warmth
 * aymay=warmly
 * aymser=towarm up, get warm
 * aymxer=to warm
 * tipayma=warm-hearted, kind
 * tipayman=warm-heartedness, kindness
 * aymtibiila=warm-blooded

Wet

 * ima=wet
 * iman=wetness
 * imser=to get wet
 * imxer=to wet
 * imxen=wetting
 * imxwa=wetted
 * abimxer=baste
 * abimxen=basting
 * abimxwa=basted
 * ikimxer=to drench, soak, steep
 * ikimxen=drenching, soaking steeping
 * ikimxwa=drenched, soaked, steeped
 * iyma=humid
 * iyman=humidity

 * yim=flood
 * yimser=to flood
 * yimxer=to flood
 * yimxen=flooding
 * yimxwa=flooded
 * yimmas=floodwall

Dry

 * uma=dry, arid
 * uman=dryness, aridity
 * umser=to dry out
 * umxer=to dry, dessicate
 * umxen=drying
 * umxwa=dried
 * umxar=dryer
 * umxul=dessicant
 * tofumxar=clothes dryer

 * yum=drought
 * yumser=become parched
 * yumxer=dessicate, parch
 * yumxwa=parched, dried up

Types of Weather

 * maaraya=sunny
 * mafaya=cloudy
 * mamilaya=rainy
 * mapilaya=stormy
 * mafoya=clear
 * aima=muggy, hot and humid
 * auma=torrid, hot and dry
 * iyma=humid
 * uoma=cool and crisp
 * miafaya=foggy
 * mifaya=misty
 * jeabyena=sping-like
 * jeubyena=wintry
 * jeebyena=summery

title: Mirad Thesaurus/Weather


text: Category:Book:Making an Island

title: Category:Book:Making an Island


text:
German/Grammar/Noun phrases

Noun phrases
So far we've only used pronouns in a sentence. But now the we've gotten the preliminary work out of the way, we can start using actual nouns as well.

Terminology
As we mentioned in the section on grammatical terminology, we'll use the word "phrase" to mean a string of one or more words which forms a single functional unit within a sentence. There are, of course, different types of phrases depending on the specific function. In this section we'll introduce noun phrases, which tell you about the specific people or things that a sentence is talking about. So far the only noun phrases we've covered in detail consist of a single pronoun, the simplest type of noun phrase. Another possibility is a proper noun, meaning someone's (or something's) name. For example Note that the verb is conjugated according to the number and person of the subject, which for proper norns will usually be third person singular.
 * Leila schläft. – "Leila is sleeping."

An actual noun can be part of a noun phrase, but in German, as in English, most nouns can't be used without words to introduce them. The words that can be used for such introductions are called determiners in general. In this section we'll be talking about a special type of determiner called an article. While most determiners convey additional information about the nouns they introduce, the only purpose of an article is to do the introduction.

German, like English, capitalizes proper nouns. Unlike English, all other nouns (but not pronouns) are always capitalized in German. This is a basic spelling rule in German, easy to understand and follow, and ignoring it will give the impression that you're simply not trying to write correctly.

Articles in German
In English, articles come in two flavors, definite "the" and indefinite "a(n)". The definite article is used before nouns which have been mentioned earlier or nouns that the listener will obviously already be aware of. The indefinite article is used before nouns which the speaker is introducing for the first time. This is about the same way it works in German, but German, being more highly inflected than English, requires different articles depending on the gender, number and case as well. In the nominative case, the definite articles are: and the indefinite articles are:
 * der – "the" (with masculine nouns)
 * die – "the" (with feminine nouns)
 * das – "the" (with neuter nouns)
 * die - "the" (with plural nouns, of any gender)
 * ein – "a(n)" (with masculine nouns)
 * eine – "a(n)" (with feminine nouns)
 * ein – "a(n)" (with neuter nouns)
 * (nothing) - (nothing) (with plural nouns)

One thing you may notice is that there is no indefinite article for plurals in English or German. It's tempting to call "some", or it's German equivalent einige, an article for plural nouns, but the consensus is that these words be classified differently and that the indefinite article for plurals is the so-called null or zero article, which is really just saying that there is no article at all in this case.

Examples
Again, the verb must be conjugated according to the number and person of the subject. Recall that the verb we're using, schlafen, has a stem change in the third person singular:
 * Der Hund schläft. – "The dog is sleeping."
 * Die Katze schläft. – "The cat is sleeping."
 * Das Kind schläft. – "The child is sleeping."
 * Die Kinder schlafen. – "The children are sleeping."
 * Ein Hund schläft. – "A dog is sleeping."
 * Eine Katze schläft. – "A cat is sleeping."
 * Ein Kind schläft. – "A child is sleeping."
 * Kinder schlafen. – "Children are sleeping."

Articles as a memory aid
Since every gender gets a different definite article in German, a helpful way to memorize the gender of noun is to learn the article that goes with it at the same time that you learn the noun. For example, the word for "table", Tisch does not fit any of the usual rules for finding gender, and so the gender has to be memorized. So instead of learning Tisch as the German for "table", memorize der Tisch to remember the noun and its gender at the same time.

When are determiners needed?
As in English, there are certain situations where German does not require a determiner in front of a noun. German and English do tend to agree on this issue, for example plural nouns do not require articles in German or English. Substance nouns in English, for example "bread", "metal", "wood", "water", do not require determiners, and the corresponding German nouns, Brot, Metall, Holz, Wasser, do not require determiners either. But there are are exceptions and they are difficult to classify. For now we'll talk about a major one, namely that many abstract nouns often have a definite article in German when they aren't used in English. For example
 * die Liebe – "love" (the emotion)
 * das Leben – "life"
 * der Tod – "death"
 * der Weltraum – "(outer) space"

Since at this point we're only doing an overview of articles and determiners, we won't cover this issue in great detail here. The question of exactly when to use an article is difficult in both English and German. There are some rules, but these often have exceptions, and the exceptions have their own exceptions. Regional differences and personal preference can come into play as well. An example of such a regional difference is the southern habit of using an article with a person's name. Many of the rules are not applicable in enough situations for a beginner to try to memorize them all at once. Instead, we'll mention this kind of thing when we cover the situations in which they arise. For now, just realize that you may occasionally notice an "extra' article appearing in German sentence where they would not be used in English, or a "missing" article in German where an article is expected in English. These unexplained appearances and disappearances can usually be explained, but the explanation will often involve a very specific situation that we don't need to worry about for the time being.

title: German/Grammar/Noun phrases


text:
Category:User oj

Users in this category indicate they have knowledge of language Ojibwa.

title: Category:User oj


text:
User:Molandfreak

I'm mainly active on English Wikipedia, but I'm branching out into editing other Wikimedia projects. Hopefully I will be able to make meaningful contributions here!

title: User:Molandfreak


text:
User:PrincessPandaWiki/sandbox

=The Path of the Blue Blur= THE PATH OF THE BLUE BLUR Strategy Guides for the series

Table of Contents

 * Authors & Licensing

Main series

 * Sonic the Hedgehog (1991)
 * Sonic the Hedgehog 2 (1992)
 * Sonic CD (1993)
 * Sonic the Hedgehog 3 (1994)
 * Sonic & Knuckles (1994)
 * Sonic Adventure (1998)
 * Sonic Adventure 2 (2001)
 * Sonic Heroes (2003)
 * Sonic the Hedgehog (2006)
 * Sonic Unleashed (2008)
 * Sonic Colors (2010)
 * Sonic Colors (DS) (2010)
 * Sonic Generations (2011)
 * Sonic Generations (3DS) (2011)
 * Sonic Lost World (2013)
 * Sonic Lost World (3DS) (2013)
 * Sonic Mania (2017)
 * Sonic Forces (2017)

Spin-offs
=Understanding the Stories of Sonic the Hedgehog= Understanding the Stories of

Sega's influential Sonic the Hedgehog video game series tells the science fantasy stories of the title character, who has the power to run faster than the speed of sound, and his and his friends' adventures which mainly involve defeating Doctor Eggman, a mad scientist who wants to take over the world and build his empire along the way. They started as simple, but became more sophisticated starting with Sonic Adventure. This digital textbook seeks to provide summaries and analyses of these stories from a literary viewpoint to help both fans and non-fans understand them.

Table of contents

 * Introduction
 * Major Characters
 * Sonic Riders (2006)
 * Sonic Chronicles: The Dark Brotherhood (2008, non-canon)
 * Sonic Generations (2011)
 * Sonic Generations (2011, 3DS)

Introduction
While comprehensive summaries are provided, they are not meant to substitute experiencing the entirety of stories as in the games. Readers are encouraged to obtain the games or watch longplays of them for that.

This textbook only covers the video games that are or were initially part of the main canon, and thus will not cover any adaptation, including the TV shows, comic books, films, and video game adaptations of them.

Songs (Sonic Adventure)

 * "Open Your Heart" is the theme song of the game.
 * "It Doesn't Matter" is the theme song of Sonic the Hedgehog.
 * "Believe In Myself" is the theme song of Miles "Tails" Prower.
 * "Unknown from M.E." is the theme song of Knuckles the Echidna.
 * "My Sweet Passion" is the theme song of Amy Rose.
 * "Lazy Days (Livin' in Paradise)" is the theme song of Big the Cat.

Learn more (Team Sonic Racing)
Readers who want to learn more about Sonic Frontiers, including the pure game aspects and supplemental stories which are not required to understand the story, may be interested in the following links:
 * "Team Sonic Racing" on Wikipedia
 * "Team Sonic Racing" on Sonic News Network
 * Team Sonic Racing: Overdrive on YouTube, an official animated web series released to promote the game

=WikipediaWolf's Guide to Wikipedia= A planned Wikijunior book in which WikipediaWolf teaches about Wikipedia, the Internet's most famous encyclopedia and the one anyone can edit, to children. It'll be illustrated with original art by PrincessPandaWiki.

title: User:PrincessPandaWiki/sandbox


text:
Polish/Introduction

Polish (polszczyzna /pɔlˈʂt͡ʂɨzna/, język polski /ˈjɛ̃zɨk ˈpɔlskʲi/ or simply polski /ˈpɔlskʲi/) is a West Slavic language of the Lechitic group, which derived from the Indo-European family of languages. The most closely related are other Western Slavic languages: Czech, Slovak, Silesian, Kashubian and Sorbian. More distant are the Southern and Eastern Slavic languages like Bulgarian, Macedonian, Serbo-Croatian, Slovenian and Russian, Ukrainian, Belorusian, respectively. Command of one of these languages makes learning Polish easier. However, someone who doesn't speak any Slavic language, but speaks some other Indo-European language, may still find many similarities between Polish grammar and the grammar of their language, as well as many similar words.

There are over 50 million Polish speakers around the world, including approximately 45 million native speakers and 5 million L2 speakers. Though most of them can be found in Poland, there is also an apparent Polish diaspora, most notably in the USA, French and Germany. The total number of speakers makes Polish the second most widely spoken Slavic language in the world, next to Russian.

This Wikibook is designed for anyone who wants to learn the basics of the Polish language. It is suitable for beginners and those who've been learning the language for a few years.

History
Polish began to emerge as a distinct language around the 10th century. Since Mieszko I, the historical first ruler of Poland, accepted baptism in 966, Polish language became possible to write after adopting the Latin alphabet. The 16th century is the beginning of the Middle Polish, which was establish by a prominent Polish poet, Jan Kochanowski. Since 18th century there's the Modern Polish that is spoken today. It is worth to mention that between 1500 and 1700 Polish was a lingua franca in Central and parts of Eastern Europe, because of the politicial, cultural, scientific and military influence of the former Polish-Lithuanian Commonwealth.

Why is it worth to learn Polish?
Obviously learning a language in general is beneficial. Polish is pretty hard, but surely not the hardest out of the Slavic languages, so it may be a great gateway to learn more of them. As it is unlikely that you'll have a need to master Polish for perfection, just an interest in Polish culture and/or history may be enough to get into it. History of Poland captivates many people, while Polish culture isn't well-known outside Poland. Thus, it's often impossible to immerse in it without knowing the language.

Additionaly, your choice of Polish language may be a way to stand out. Because not many people learn this language, every learner is greatly appreciated by Poles. Polish is both familiar and exotic, because though it's a Slavic language, it was also profoundly influenced by Latin as well as Romance and Germanic languages. Curiously enough, you'll notice the impact of such languages as Yiddish, Turkish and Czech.

Advice on studying Polish
First, it is very important to focus on pronunciation. Overall, this is one of the hardest part of the Polish language, however, as you – nomen omen – polish it, reading will become very easy. In most cases the letters are pronounced in a determined way, so since you learn the alphabet, you'll be able to read almost all the words in Polish correctly. Secondly, it's important to have a reason. It doesn't neccessirely have to be a willing to transfer to Poland, but it just have to be something relevant to you. Learning a new language requires a long-term commitement and a certain amount of effort. If you cannot practice Polish everyday, try to make it regular. To make it regular, you need a reason.

Don't forget that you are learning a new skill. It's essential to understand the basics before moving on more complex structures. Also, this book cannot teach you two important skills of every language – speaking and listening. You need to use other resources to develop these abilities. Here you can find more possible references that may be helpful.

Powodzenia! (Good luck!)

title: Polish/Introduction