#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 <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <netns/ns.h> #include <netns/sp.h> #include <xnscourier/filetypes.h> #include <xnscourier/courier.h> #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)); }