forsyth20121205-174063a80cc13 years agoHistory
213 lines · 6.1 KB · Objective-C
RawDownload
Palm: module { 	#	# basic Palm data types	# 	PATH:	con "/dis/lib/palm.dis"; 	DBInfo: adt {		name:	string;		attr:		int;		dtype:	string;	# database type (byte[4])		version:	int;	# defined by application		creator:	string;	# creating application (byte[4])		ctime:	int;		mtime:	int;		btime:	int;	# last backup		modno:	int;	# modification number: set to zero		uidseed:	int;	# unique record ID seed (unused, set to zero) 		# the following is used by the database access protocol		index:	int; 		new:		fn(name: string, attr: int, dtype: string, version: int, creator: string): ref DBInfo;	}; 	# file attributes: 	Fresource:	con 1<<0;		# file is .prc not .pdb	Fronly:		con 1<<1;		# read only	Fappinfodirty:	con 1<<2;	Fbackup:		con 1<<3;		# no conduit exists	Foverwrite:	con 1<<4;		# overwrite older copy if present	Freset:		con 1<<5;		# reset after installation	Fprivate:		con 1<<6;		# don't allow copy of this to be beamed	Fstream:		con 1<<7;		# file is an array of bytes, not a database 	# extended (misc) attributes for Desklink->ReadDBList	Fnosync:		con (1<<7)<<16;	Frambased:	con (1<<6)<<16; 	Noindex:		con 16rFFFF;	# unknown index 	Record: adt {		id:	int;	# unique record ID (24 bits)		attr:	int;	# record attributes		cat:	int;	# category		data:	array of byte; 		new:	fn(id: int, attr: int, cat: int, size: int): ref Record;	}; 	# Record.attr values: 	Rdelete:	con 16r80; # delete next sync	Rdirty:	con 16r40; # record modified	Rinuse:	con 16r20; # record in use	Rsecret:	con 16r10; # record is secret	Rarchive:	con 16r08; # archive next sync	Rmcat:	con 16r0F; # mask for category field in Palmdb->Entry.attrs 	Resource: adt {		name:	int;	# byte[4]: resource name or type		id:	int;	# resource ID (16 bits)		data:	array of byte; 		new:	fn(name: int, id: int, size: int): ref Resource;	}; 	# common form of category data in appinfo	Categories: adt {		renamed:	int;	# which categories have been renamed		labels:	array of string;	# 16 category names		uids:		array of int;	# corresponding unique IDs		lastuid:	int;		# last unique ID assigned		appdata:	array of byte;	# remaining data is application-specific 		new:		fn(labels: array of string): ref Categories;		unpack:	fn(a: array of byte): ref Categories;		pack:	fn(c: self ref Categories): array of byte;		mkidmap:	fn(c: self ref Categories): array of int;	}; 	Doc: adt {		m:	Palmdb;		file:	ref Palmdb->PDB;		version:	int;		length:	int;	# uncompressed		nrec:		int;	# text records only		recsize:	int;	# uncompressed		position:	int;		sizes:	array of int;	# sizes of uncompressed records 		open:	fn(m: Palmdb, file: ref Palmdb->PDB): (ref Doc, string);		read:		fn(nil: self ref Doc, i: int): (string, string);		iscompressed:	fn(nil: self ref Doc): int;		unpacktext:	fn(d: self ref Doc, a: array of byte): (string, string);		textlength:	fn(d: self ref Doc, a: array of byte): int;	}; 	init:	fn(): string; 	# name mapping	filename:	fn(s: string): string;	dbname:	fn(s: string): string; 	# convert between resource/application ID and string	id2s:	fn(id: int): string;	s2id:	fn(s: string): int; 	# time conversion	pilot2epoch:	fn(t: int): int;	epoch2pilot:	fn(t: int): int; 	# Latin-1 to string conversion	gets:	fn(a: array of byte): string;	puts:	fn(a: array of byte, s: string); 	# big-endian conversion	get2:	fn(a: array of byte): int;	get3:	fn(a: array of byte): int;	get4:	fn(a: array of byte): int;	put2:	fn(a: array of byte, v: int);	put3:	fn(a: array of byte, v: int);	put4:	fn(a: array of byte, v: int); 	# argument wrapping for Desklink and CMP 2.x	ArgIDbase: con 16r20;		# first argument ID	argsize:	fn(args: array of (int, array of byte)): int;	packargs:	fn(out: array of byte, args: array of (int, array of byte)): array of byte;	unpackargs:	fn(argc: int, reply: array of byte): (array of (int, array of byte), string); }; Palmdb: module { 	PATH:	con "/dis/lib/palmdb.dis"; 	DB: adt {		x:	int;			# instance index, used internally 		mode:	int;		attr:		int;		# essential database attributes 		open:	fn(nil: string, mode: int): (ref DB, string);		create:	fn(nil: string, mode: int, perm: int, nil: ref Palm->DBInfo): (ref DB, string);		close:	fn(nil: self ref DB): string; 		stat:		fn(nil: self ref DB): ref Palm->DBInfo;		wstat:	fn(nil: self ref DB, nil: ref Palm->DBInfo, flags: int); 		rdappinfo:	fn(nil: self ref DB): (array of byte, string);		wrappinfo:	fn(nil: self ref DB, nil: array of byte): string; 		rdsortinfo:	fn(nil: self ref DB): (array of int, string);		wrsortinfo:	fn(nil: self ref DB, nil: array of int): string; 		readidlist:	fn(nil: self ref DB, sort: int): array of int;		nentries:	fn(nil: self ref DB): int;		resetsyncflags:	fn(nil: self ref DB): string; 		records:	fn(nil: self ref DB): ref PDB;		resources:	fn(nil: self ref DB): ref PRC;	}; 	# database files (.pdb, .doc, and most others)	PDB: adt {		db:	ref DB; 		read:		fn(nil: self ref PDB, index: int): ref Palm->Record;		readid:	fn(nil: self ref PDB, id: int): (ref Palm->Record, int); 		resetnext:	fn(nil: self ref PDB): int;		readnextmod:	fn(nil: self ref PDB): (ref Palm->Record, int);#			DLP 1.1 functions:#		readnextincat(nil: self ref DB, cat: int): (ref Palm->Record, string);#		readnextmodincat(nil: self ref DB, cat: int): (ref Palm->Record, string); 		write:	fn(nil: self ref PDB, r: ref Palm->Record): string; 		truncate:	fn(nil: self ref PDB): string;		delete:	fn(nil: self ref PDB, id: int): string;		deletecat:	fn(nil: self ref PDB, cat: int): string;		purge:	fn(nil: self ref PDB): string; 		movecat:	fn(nil: self ref PDB, old: int, new: int): string; 	}; 	# resource files (.prc)	PRC: adt {		db:	ref DB; 		# read by index, or by type & id		read:		fn(nil: self ref PRC, index: int): ref Palm->Resource;		readtype:	fn(nil: self ref PRC, name: int, id: int): (ref Palm->Resource, int); 		# write by type and id only (desklink)		write:	fn(nil: self ref PRC, r: ref Palm->Resource): string; 		truncate:	fn(nil: self ref PRC): string;		delete:	fn(nil: self ref PRC, name: int, id: int): string;	}; 	# open modes (not the same as Sys->)	OREAD:		con 16r80;	OWRITE:		con 16r40;	ORDWR:		con OREAD|OWRITE;	OEXCL:		con 16r20;	OSECRET:		con 16r10; 	init:	fn(m: Palm): string;};