From ec098795a32535a90f882d047eaabe040672b6f6 Mon Sep 17 00:00:00 2001 From: CSRG Date: Tue, 31 Mar 1987 16:56:36 -0800 Subject: [PATCH] BSD 4_3_Net_1 development Work on file xns/examples/filing_common/get_type.c Synthesized-from: CSRG/cd2/net.1 --- xns/examples/filing_common/get_type.c | 230 ++++++++++++++++++++++++++ 1 file changed, 230 insertions(+) create mode 100644 xns/examples/filing_common/get_type.c diff --git a/xns/examples/filing_common/get_type.c b/xns/examples/filing_common/get_type.c new file mode 100644 index 0000000000..a9ac6b0ca8 --- /dev/null +++ b/xns/examples/filing_common/get_type.c @@ -0,0 +1,230 @@ +#ifndef lint +static char *rcsid = "$Header: get_type.c,v 1.2 87/04/01 10:09:16 ed Exp $"; +#endif lint + +/* + * Copyright (c) 1986, 1987 Xerox Corporation. + */ + +/* $Log: get_type.c,v $ + * Revision 1.2 87/04/01 10:09:16 ed + * Lots of new Viewpoint related types and how to recognize them. + * + * Revision 1.1 87/01/14 11:26:06 ed + * Initial revision + * + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#define CHARS_TO_READ 2048 + +/* + * routine: + * get_type + * input: + * pointer to pathname of file + * read first CHARS_TO_READ + * if it contains "RasterEncoding/", assume RES (return TYPE_VPCanvas) + * if it contains "Interpress/Xerox/", assume IP (return TYPE_Interpress) + * if a char is 0 or high order bit set, assume binary (return tUNSPECIFIED) + * else assume text (tText) + * (Note order of RES/IP checking is important since RES files contain + * IP string also) + * + * returns: + * LongCardinal containing filing defined file type + */ + +LongCardinal get_type(pathname) +char *pathname; +{ + FILE *file_desc; + char buffer[CHARS_TO_READ]; + int count; + char *ptr, *rindex(); + LongCardinal type, GetTypeAttribute(); + Boolean is_type(); + struct stat fs; + + if ( stat(pathname, &fs) == -1 ) + return(TYPE_I); /* if error, assume tUnspecified */ + + /* + * if not a regular file look for directory... + * if a directory and in root, then assume file drawer + */ + + if ( (fs.st_mode & S_IFMT) != S_IFREG ) { + if ( (fs.st_mode & S_IFDIR) != 0 ) { + if ( rindex(pathname, '/') == pathname ) + return(TYPE_VPDrawer); + else + return(TYPE_Directory); + } else + return(TYPE_I); + } + + if ( (file_desc= fopen(pathname, "r")) == NULL ) + return(TYPE_I); /* if error, assume tUnspecified */ + + if ( (count= fread(buffer,sizeof(char),CHARS_TO_READ,file_desc)) == 0 ) + type= TYPE_I; /* if error, assume tUnspecified */ + else { + if ( is_type(buffer, RESHDR) == TRUE ) { + type= TYPE_VPCanvas; + } else if ( is_type(buffer, INTERPRESSHDR) == TRUE ) { + type= TYPE_Interpress; + } else if ( is_type(buffer, VPHDR) == TRUE ) { + type= GetTypeAttribute(file_desc); + } else { + type= TYPE_A; /* assume tAsciiText */ + for ( ptr= buffer; ptr < buffer + count - 1; ) { /* for each character */ + if ( (*ptr == 0) || (*ptr++ & 0200) ) { /* if 0 or high order bit */ + type= TYPE_I; /* assume tUnspecified */ + break; + } + } + } + } + + fclose(file_desc); /* close file */ + return(type); +} + + +Boolean is_type(string1, string2) +char *string1, *string2; + +{ + char string[128]; /* 128 should be enough for all cases */ + char *ptr; + int i, len; + + bcopy(string1, string, 128); + + lowercasen(string,128); + + len= strlen(string2); + + /* if we don't get a match in the first 50 characters, chances are + * it's not Interpress or RES + */ + for ( ptr= string, i= 0; i < 50; ptr++, i++ ) { + if ( bcmp(string2, ptr, len) == 0 ) + return(TRUE); + } + + return(FALSE); +} + +char *typetostring(type) +LongCardinal type; + +{ + static char string[80]; + + switch ( type ) { + case TYPE_A : + return("text"); + case TYPE_I : + return("binary"); + case TYPE_Directory : + return("directory"); + case TYPE_VP : + return("VP doc"); + case TYPE_Interpress : + return("Interpress"); + case TYPE_VPCanvas : + return("VP Canvas"); + case TYPE_VPDictionary : + return("VP Dictionary"); + case TYPE_VPMailNote : + return("VP MailNote"); + case TYPE_VPReference : + return("VP Reference"); + case TYPE_S : + return("serialized"); + case TYPE_VPDrawer : + return("VP file drawer"); + case TYPE_VPApplication : + return("VP application"); + case TYPE_VPApplication2 : + return("VP application"); + case TYPE_VPSpreadsheet : + return("VP spreadsheet"); + case TYPE_VPBook : + return("VP Book"); + case TYPE_VPRecordsfile : + return("VP RecordFile"); + case TYPE_VPCalendar : + return("VP Calendar"); + case TYPE_VPIcons : + return("VP Icons"); + case TYPE_Font : + return("Printer Font"); + case TYPE_860 : + return("860 doc"); + default : + sprintf(string,"%d", type); + return(string); + } +} + +LongCardinal stringtotype(string) +char *string; + +{ + if ( *string == '\0' ) + return(TYPE_VPMailNote); + + lowercase(string); + + if ( strcmp(string, "text") == 0 ) + return (TYPE_A); + if ( strcmp(string, "binary") == 0 ) + return (TYPE_I); + if ( strcmp(string, "directory") == 0 ) + return (TYPE_Directory); + if ( strcmp(string, "vp doc") == 0 ) + return (TYPE_VP); + if ( strcmp(string, "interpress") == 0 ) + return (TYPE_Interpress); + if ( strcmp(string, "vp canvas") == 0 ) + return (TYPE_VPCanvas); + if ( strcmp(string, "vp dictionary") == 0 ) + return (TYPE_VPDictionary); + if ( strcmp(string, "vp mailnote") == 0 ) + return (TYPE_VPMailNote); + if ( strcmp(string, "vp reference") == 0 ) + return (TYPE_VPReference); + if ( strcmp(string, "serialized") == 0 ) + return (TYPE_S); + if ( strcmp(string, "vp filedrawer") == 0 ) + return (TYPE_VPDrawer); + if ( strcmp(string, "vp application") == 0 ) + return (TYPE_VPApplication); + if ( strcmp(string, "vp spreadsheet") == 0 ) + return (TYPE_VPSpreadsheet); + if ( strcmp(string, "vp book") == 0 ) + return (TYPE_VPBook); + if ( strcmp(string, "vp recordfile") == 0 ) + return (TYPE_VPRecordsfile); + if ( strcmp(string, "vp calendar") == 0 ) + return (TYPE_VPCalendar); + if ( strcmp(string, "vp icons") == 0 ) + return (TYPE_VPIcons); + if ( strcmp(string, "printerfont") == 0 ) + return (TYPE_Font); + if ( strcmp(string, "860 doc") == 0 ) + return (TYPE_860); + return(atoi(string)); +} + -- 2.20.1