mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	* Add a larger set of sample files for Pan This is a fairly good cross section of Pan based on code from: * https://github.com/quattor/template-library-examples * https://github.com/quattor/template-library-core * Add Pan language grammar
		
			
				
	
	
		
			152 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| @contributor{
 | |
|   name = First Contributor
 | |
|   email = first@example.org
 | |
| }
 | |
| @contributor{
 | |
|   name = Second Contributor
 | |
|   email = second@example.org
 | |
| }
 | |
| @documentation{
 | |
| Data type and function definitions for basic types
 | |
| }
 | |
| 
 | |
| declaration template pan/types;
 | |
| 
 | |
| include 'pan/legacy';
 | |
| 
 | |
| @documentation{
 | |
| This type implements a date/time format consistent with
 | |
| ASN.1 typically used by LDAP.  The actual specification is the
 | |
| "GeneralizedTime" format as specified on page 38 of the X.208
 | |
| ITU-T recommendation and references within.
 | |
| 
 | |
| Ex: 20040825120123Z
 | |
|     20040825120123+0100
 | |
|     20040825120123,5
 | |
|     20040825120123.5
 | |
|     20040825120123.5-0123
 | |
| }
 | |
| function is_asndate = {
 | |
|     # Check cardinality and type of argument.
 | |
|     if (ARGC != 1 || !is_string(ARGV[0]))
 | |
|         error("usage: is_asndate(string)");
 | |
| 
 | |
|     # Match the datetime pattern, extracting interesting fields.
 | |
|     result = matches(ARGV[0],
 | |
|         '^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(?:[,\.](\d+))?([Zz]|(?:[-+]\d{2}\d{2}))?$');
 | |
| 
 | |
|     if (length(result) >= 7) {
 | |
|         # Do further tests on various components of the date.
 | |
|         # NOTE: the to_long(to_double(x)) construct below is to avoid having
 | |
|         # the to_long function treat strings with leading zeros as octal
 | |
|         # numbers.  E.g. to_long("09") will throw an exception because '9' is
 | |
|         # not a valid octal digit.
 | |
|         year = to_long(result[1]);
 | |
|         month = to_long(to_double(result[2]));
 | |
|         day = to_long(to_double(result[3]));
 | |
|         hour = to_long(to_double(result[4]));
 | |
|         minute = to_long(to_double(result[5]));
 | |
|         second = to_long(to_double(result[6]));
 | |
| 
 | |
|         frac = 0;
 | |
|         if (length(result) > 7) {
 | |
|             frac = to_long(to_double(result[7]));
 | |
|         };
 | |
| 
 | |
|         zone = '+0000';
 | |
|         if (length(result) > 8) {
 | |
|             zone = result[8];
 | |
|         };
 | |
| 
 | |
|         # Check the range of months.
 | |
|         if (month < 1 || month > 12) {
 | |
|             error("is_asndate: invalid month");
 | |
|             return(false);
 | |
|         };
 | |
| 
 | |
|         # Check the range of days.
 | |
|         if (day < 1 || day > 31) {
 | |
|             error("is_asndate: invalid day");
 | |
|             return(false);
 | |
|         };
 | |
| 
 | |
|         # Be more specific on the days in each month.
 | |
|         if (month == 4 || month == 6 || month == 9 || month == 11) {
 | |
|             if (day > 30) {
 | |
|                 error("is_asndate: invalid day");
 | |
|             };
 | |
|         };
 | |
| 
 | |
|         # February is always a bother.  Too lazy to check that the leap
 | |
|         # years have been specified correctly.
 | |
|         if (month == 2 && day > 29) {
 | |
|             error("is_asndate: invalid day");
 | |
|         };
 | |
| 
 | |
|         # Check the time.
 | |
|         if (hour > 23) {
 | |
|             error("is_asndate: invalid hour");
 | |
|             return(false);
 | |
|         };
 | |
|         if (minute > 59) {
 | |
|             error("is_asndate: invalid minute");
 | |
|             return(false);
 | |
|         };
 | |
| 
 | |
|         # Allow for leap seconds here (since it is easy).
 | |
|         if (second > 60) {
 | |
|             error("is_asndate: invalid minute");
 | |
|             return(false);
 | |
|         };
 | |
| 
 | |
|         # Check the time zone format.
 | |
|         if (zone != "Z" && zone != "z") {
 | |
|             tz = matches(zone, '^[-+](\d{2})(\d{2})$');
 | |
| 
 | |
|             hoffset = to_long(to_double(tz[1]));
 | |
|             moffset = to_long(to_double(tz[2]));
 | |
| 
 | |
|             if (hoffset >= 12) {
 | |
|                 error("is_asndate: invalid hour offset in time zone");
 | |
|                 return(false);
 | |
|             };
 | |
|             if (moffset > 59) {
 | |
|                 error("is_asndate: invalid minute offset in time zone");
 | |
|                 return(false);
 | |
|             };
 | |
|         };
 | |
| 
 | |
|     } else {
 | |
|         error("is_asndate: invalid format for time");
 | |
|         return(false);
 | |
|     };
 | |
| 
 | |
|     # If it gets to this point, then the date must be OK.
 | |
|     true;
 | |
| };
 | |
| 
 | |
| 
 | |
| type type_asndate = string with {
 | |
|     is_asndate(SELF);
 | |
| };
 | |
| 
 | |
| @documentation{
 | |
|     desc = Type that enforces the existence of a named interface.
 | |
| }
 | |
| type valid_interface = string with {
 | |
|     if (exists(format('/system/network/interfaces/%s', SELF))) {
 | |
|         return(true);
 | |
|     };
 | |
|     foreach(ifc; attr; value('/system/network/interfaces')) {
 | |
|         if (attr['device'] == SELF){
 | |
|             return(true);
 | |
|         };
 | |
|     };
 | |
|     false;
 | |
| };
 | |
| 
 | |
| @documentation{
 | |
|     desc = CPU architectures understood by Quattor
 | |
| }
 | |
| type cpu_architecture = string with match (SELF, '^(i386|ia64|x86_64|sparc|aarch64|ppc64(le)?)$');
 |