about summary refs log tree commit diff stats
path: root/src/xmpp/presence.c
Commit message (Expand)AuthorAgeFilesLines
* Respect silent nick change in mucsMarcoPolo-PasTonMolo2022-05-261-0/+2
* presence: guard against invalid inputMichael Vetter2022-01-271-3/+12
* first step to remove libmesodeSteffen Jaeckel2021-10-271-6/+0
* Apply coding styleMichael Vetter2020-07-071-205/+201
* Revert "Apply coding style"Michael Vetter2020-07-071-206/+210
* Apply coding styleMichael Vetter2020-07-071-210/+206
* Review logging in presence.cMichael Vetter2020-04-141-5/+4
* Add context to autocomplete_with_func and use it for omemo trust commandPaul Fariello2020-01-311-1/+1
* Add vim modelineMichael Vetter2019-11-131-0/+1
* Remove prefix from stanza idMichael Vetter2019-10-171-5/+5
* Update copyright to include 2019Michael Vetter2019-01-221-1/+1
* Move ID generation to xmpp folderMichael Vetter2018-08-301-5/+5
* Update copyrightJames Booth2018-01-211-1/+1
* Allow previous autocompletion with shift tabJames Booth2017-04-011-7/+7
* Update CopyrightJames Booth2017-01-281-1/+1
* Remove status from cl_ev_presence_sendJames Booth2017-01-151-3/+2
* Use hash table for bookmarksJames Booth2016-08-211-0/+3
* Tidy presence.cJames Booth2016-08-201-249/+311
* Use libstrophe xmpp_presence_new convenience functionJames Booth2016-08-201-3/+2
* Use libstrophe convenience functions for stanza attributesJames Booth2016-08-201-11/+11
* Rename caps_contains -> caps_cache_containsJames Booth2016-08-131-2/+2
* Rename rooms vars in _send_room_presenceJames Booth2016-07-251-8/+6
* Tidy headersJames Booth2016-07-241-5/+6
* Update GPL link in headersJames Booth2016-07-241-1/+1
* Move available resources to connection structJames Booth2016-05-071-2/+2
* Move connection fulljid functionJames Booth2016-05-061-1/+1
* Rename jabber_ functionsJames Booth2016-05-061-9/+9
* Add session.cJames Booth2016-05-051-4/+5
* Renamed connection.c -> session.cJames Booth2016-05-051-1/+1
* Tidy xmpp headersJames Booth2016-05-041-1/+2
* Rename stanza handler init functionsJames Booth2016-05-021-1/+1
* Free stanza text and DiscoInfo featuresJames Booth2016-05-021-0/+2
* Free stanza text on plugin send hooksJames Booth2016-05-011-0/+1
* Define stanza's attributes as const char*Dmitry Podgorny2016-04-271-27/+29
* Fix typo: diso -> discoDominik Heidler2016-04-011-1/+1
* Removed #AX_PREFIX_CONFIG_HJames Booth2016-03-311-3/+3
* Use one stanza handler per type (message, iq, presence)James Booth2016-03-281-126/+93
* Added basic stanza receive eooksJames Booth2016-03-271-2/+33
* Use xmpp_send_raw_string instead of xmpp_send_rawJames Booth2016-03-261-4/+4
* Added stanza send hooks for pluginsJames Booth2016-03-261-7/+41
* Merge branch 'master' into plugins-cJames Booth2016-02-141-1/+1
|\
| * Updated copyrightJames Booth2016-02-141-1/+1
* | Added C plugin code from plugins branchJames Booth2016-02-141-3/+3
|/
* Removed ui_handle_room_join_errorJames Booth2015-11-021-1/+1
* Removed ui_input_nonblocking()James Booth2015-11-011-3/+3
* Applied coding style to src/xmpp/James Booth2015-10-261-38/+30
* Moved idle time check for last activityJames Booth2015-10-141-1/+3
* Added auto xa option, tidied autoaway codeJames Booth2015-09-271-1/+3
* Check for libmesode, fall back to libstropheJames Booth2015-09-211-0/+9
* Fixed various jid and account mem leaksJames Booth2015-06-241-0/+1
es { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #333333 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
;;;;Nondeterministic evaluator
;;;;Different from the one in chapter 4 of SICP, in that it's based on the
;;;; vanilla metacircular evaluator, rather than on the analyzing one.

;;;;This file can be loaded into Scheme as a whole.
;;;;Then you can initialize and start the evaluator by evaluating
;;;; the expression (mce).

;;;from section 4.1.4 -- must precede def of metacircular apply
(define apply-in-underlying-scheme apply)

;;;SECTION 4.1.1

(define (ambeval exp env succeed fail)
  (cond ((self-evaluating? exp) (succeed exp fail))
	((variable? exp)
	 (succeed (lookup-variable-value exp env)
		  fail))
	((quoted? exp) (succeed (text-of-quotation exp) fail))
	((assignment? exp) (eval-assignment exp env succeed fail))
	((definition? exp) (eval-definition exp env succeed fail))
	((if? exp) (eval-if exp env succeed fail))
	((lambda? exp)
	 (succeed (make-procedure (lambda-parameters exp)
				  (lambda-body exp)
				  env)
		  fail))
	((begin? exp) 
	 (eval-sequence (begin-actions exp) env succeed fail))
	((cond? exp) (ambeval (cond->if exp) env succeed fail))
        ((let? exp) (ambeval (let->combination exp) env succeed fail)) ;**
        ((amb? exp) (eval-amb exp env succeed fail))                   ;**
	((application? exp)
	 (eval-application exp env succeed fail))
	(else
	 (error "Unknown expression type -- EVAL" exp))))

(define (eval-application exp env succeed fail)
  (ambeval (operator exp)
	   env
	   (lambda (proc fail2)
	     (get-args (operands exp)
		       env
		       (lambda (args fail3)
			 (execute-application proc args succeed fail3))
		       fail2))
	   fail))

(define (get-args exps env succeed fail)
  (if (null? exps)
      (succeed '() fail)
      (ambeval (car exps)
	       env
	       (lambda (arg fail2)
		 (get-args (cdr exps)
			   env
			   (lambda (args fail3)
			     (succeed (cons arg args)
				      fail3))
			   fail2))
	       fail)))

(define (execute-application procedure arguments succeed fail)
  (cond ((primitive-procedure? procedure)
         (succeed (apply-primitive-procedure procedure arguments) fail))
        ((compound-procedure? procedure)
         (eval-sequence
           (procedure-body procedure)
           (extend-environment
             (procedure-parameters procedure)
             arguments
             (procedure-environment procedure))
	  succeed
	  fail))
        (else
         (error
          "Unknown procedure type -- APPLY" procedure))))


(define (eval-if exp env succeed fail)
  (ambeval (if-predicate exp)
	   env
	   (lambda (pred-value fail2)
	     (if (true? pred-value)
		 (ambeval (if-consequent exp)
			  env
			  succeed
			  fail2)
		 (ambeval (if-alternative exp)
			  env
			  succeed
			  fail2)))
	   fail))

(define (eval-sequence exps env succeed fail)
  (define (loop first-exp rest-exps succeed fail)
    (if (null? rest-exps)
        (ambeval first-exp env succeed fail)
	(ambeval first-exp
		 env
		 (lambda (first-value fail2)
		   (loop (car rest-exps) (cdr rest-exps) succeed fail2))
		 fail)))
  (if (null? exps)
      (error "Empty sequence")
      (loop (car exps) (cdr exps) succeed fail)))

(define (eval-definition exp env succeed fail)
  (ambeval (definition-value exp)
	   env
	   (lambda (val fail2)
	     (define-variable! (definition-variable exp) val env)
	     (succeed 'ok fail2))
	   fail))

(define (eval-assignment exp env succeed fail)
  (ambeval (assignment-value exp)
	   env
	   (lambda (val fail2)
	     (let* ((var (assignment-variable exp))
		    (old-value
		     (lookup-variable-value var env)))
	       (set-variable-value! var val env)
	       (succeed 'ok
			(lambda ()
			  (set-variable-value! var old-value env)
			  (fail2)))))
	   fail))


(define (eval-amb exp env succeed fail)
  (define (try-next choices)
    (if (null? choices)
	(fail)
	(ambeval (car choices)
		 env
		 succeed
		 (lambda ()
		   (try-next (cdr choices))))))
  (try-next (amb-choices exp)))


;;;SECTION 4.1.2

(define (self-evaluating? exp)
  (cond ((number? exp) true)
        ((string? exp) true)
        ((boolean? exp) true)
	(else false)))

(define (quoted? exp)
  (tagged-list? exp 'quote))

(define (text-of-quotation exp) (cadr exp))

(define (tagged-list? exp tag)
  (if (pair? exp)
      (eq? (car exp) tag)
      false))

(define (variable? exp) (symbol? exp))

(define (assignment? exp)
  (tagged-list? exp 'set!))

(define (assignment-variable exp) (cadr exp))

(define (assignment-value exp) (caddr exp))


(define (definition? exp)
  (tagged-list? exp 'define))

(define (definition-variable exp)
  (if (symbol? (cadr exp))
      (cadr exp)
      (caadr exp)))

(define (definition-value exp)
  (if (symbol? (cadr exp))
      (caddr exp)
      (make-lambda (cdadr exp)
                   (cddr exp))))

(define (lambda? exp) (tagged-list? exp 'lambda))

(define (lambda-parameters exp) (cadr exp))
(define (lambda-body exp) (cddr exp))

(define (make-lambda parameters body)
  (cons 'lambda (cons parameters body)))


(define (if? exp) (tagged-list? exp 'if))

(define (if-predicate exp) (cadr exp))

(define (if-consequent exp) (caddr exp))

(define (if-alternative exp)
  (if (not (null? (cdddr exp)))
      (cadddr exp)
      'false))

(define (make-if predicate consequent alternative)
  (list 'if predicate consequent alternative))


(define (begin? exp) (tagged-list? exp 'begin))

(define (begin-actions exp) (cdr exp))

(define (last-exp? seq) (null? (cdr seq)))
(define (first-exp seq) (car seq))
(define (rest-exps seq) (cdr seq))

(define (sequence->exp seq)
  (cond ((null? seq) seq)
        ((last-exp? seq) (first-exp seq))
        (else (make-begin seq))))

(define (make-begin seq) (cons 'begin seq))


(define (application? exp) (pair? exp))
(define (operator exp) (car exp))
(define (operands exp) (cdr exp))

(define (no-operands? ops) (null? ops))
(define (first-operand ops) (car ops))
(define (rest-operands ops) (cdr ops))


(define (cond? exp) (tagged-list? exp 'cond))

(define (cond-clauses exp) (cdr exp))

(define (cond-else-clause? clause)
  (eq? (cond-predicate clause) 'else))

(define (cond-predicate clause) (car clause))

(define (cond-actions clause) (cdr clause))

(define (cond->if exp)
  (expand-clauses (cond-clauses exp)))

(define (expand-clauses clauses)
  (if (null? clauses)
      'false                          ; no else clause
      (let ((first (car clauses))
            (rest (cdr clauses)))
        (if (cond-else-clause? first)
            (if (null? rest)
                (sequence->exp (cond-actions first))
                (error "ELSE clause isn't last -- COND->IF"
                       clauses))
            (make-if (cond-predicate first)
                     (sequence->exp (cond-actions first))
                     (expand-clauses rest))))))

(define (amb? exp) (tagged-list? exp 'amb))
(define (amb-choices exp) (cdr exp))

;;;SECTION 4.1.3

(define (true? x)
  (not (eq? x false)))

(define (false? x)
  (eq? x false))


(define (make-procedure parameters body env)
  (list 'procedure parameters body env))

(define (compound-procedure? p)
  (tagged-list? p 'procedure))


(define (procedure-parameters p) (cadr p))
(define (procedure-body p) (caddr p))
(define (procedure-environment p) (cadddr p))


(define (enclosing-environment env) (cdr env))

(define (first-frame env) (car env))

(define the-empty-environment '())

(define (make-frame variables values)
  (cons variables values))

(define (frame-variables frame) (car frame))
(define (frame-values frame) (cdr frame))

(define (add-binding-to-frame! var val frame)
  (set-car! frame (cons var (car frame)))
  (set-cdr! frame (cons val (cdr frame))))

(define (extend-environment vars vals base-env)
  (if (= (length vars) (length vals))
      (cons (make-frame vars vals) base-env)
      (if (< (length vars) (length vals))
          (error "Too many arguments supplied" vars vals)
          (error "Too few arguments supplied" vars vals))))

(define (lookup-variable-value var env)
  (define (env-loop env)
    (define (scan vars vals)
      (cond ((null? vars)
             (env-loop (enclosing-environment env)))
            ((eq? var (car vars))
             (car vals))
            (else (scan (cdr vars) (cdr vals)))))
    (if (eq? env the-empty-environment)
        (error "Unbound variable" var)
        (let ((frame (first-frame env)))
          (scan (frame-variables frame)
                (frame-values frame)))))
  (env-loop env))

(define (set-variable-value! var val env)
  (define (env-loop env)
    (define (scan vars vals)
      (cond ((null? vars)
             (env-loop (enclosing-environment env)))
            ((eq? var (car vars))
             (set-car! vals val))
            (else (scan (cdr vars) (cdr vals)))))
    (if (eq? env the-empty-environment)
        (error "Unbound variable -- SET!" var)
        (let ((frame (first-frame env)))
          (scan (frame-variables frame)
                (frame-values frame)))))
  (env-loop env))

(define (define-variable! var val env)
  (let ((frame (first-frame env)))
    (define (scan vars vals)
      (cond ((null? vars)
             (add-binding-to-frame! var val frame))
            ((eq? var (car vars))
             (set-car! vals val))
            (else (scan (cdr vars) (cdr vals)))))
    (scan (frame-variables frame)
          (frame-values frame))))

;;;SECTION 4.1.4

(define (setup-environment)
  (let ((initial-env
         (extend-environment (primitive-procedure-names)
                             (primitive-procedure-objects)
                             the-empty-environment)))
    (define-variable! 'true true initial-env)
    (define-variable! 'false false initial-env)
    initial-env))

;[do later] (define the-global-environment (setup-environment))

(define (primitive-procedure? proc)
  (tagged-list? proc 'primitive))

(define (primitive-implementation proc) (cadr proc))

(define primitive-procedures
  (list (list 'car car)
        (list 'cdr cdr)
        (list 'cons cons)
        (list 'null? null?)
	(list '+ +)
	(list '- -)
	(list '* *)
	(list '/ /)
	(list '= =)
	(list 'list list)
	(list 'append append)
	(list 'equal? equal?)
;;      more primitives
        ))

(define (primitive-procedure-names)
  (map car
       primitive-procedures))

(define (primitive-procedure-objects)
  (map (lambda (proc) (list 'primitive (cadr proc)))
       primitive-procedures))

;[moved to start of file] (define apply-in-underlying-scheme apply)

(define (apply-primitive-procedure proc args)
  (apply-in-underlying-scheme
   (primitive-implementation proc) args))



(define input-prompt ";;; Amb-Eval input:")
(define output-prompt ";;; Amb-Eval value:")

(define (driver-loop)
  (define (internal-loop try-again)
    (prompt-for-input input-prompt)
    (let ((input (read)))
      (if (eq? input 'try-again)
          (try-again)
          (begin
            (newline)
            (display ";;; Starting a new problem ")
            (ambeval input
                     the-global-environment
                     ;; ambeval success
                     (lambda (val next-alternative)
                       (announce-output output-prompt)
                       (user-print val)
                       (internal-loop next-alternative))
                     ;; ambeval failure
                     (lambda ()
                       (announce-output
                        ";;; There are no more values of")
                       (user-print input)
                       (driver-loop)))))))
  (internal-loop
   (lambda ()
     (newline)
     (display ";;; There is no current problem")
     (driver-loop))))


(define (prompt-for-input string)
  (newline) (newline) (display string) (newline))

(define (announce-output string)
  (newline) (display string) (newline))

(define (user-print object)
  (if (compound-procedure? object)
      (display (list 'compound-procedure
                     (procedure-parameters object)
                     (procedure-body object)
                     '<procedure-env>))
      (display object)))

;;; Support for Let (as noted in footnote 56, p.428)

(define (let? exp) (tagged-list? exp 'let))
(define (let-bindings exp) (cadr exp))
(define (let-body exp) (cddr exp))

(define (let-var binding) (car binding))
(define (let-val binding) (cadr binding))

(define (make-combination operator operands) (cons operator operands))

(define (let->combination exp)
  ;;make-combination defined in earlier exercise
  (let ((bindings (let-bindings exp)))
    (make-combination (make-lambda (map let-var bindings)
                                   (let-body exp))
                      (map let-val bindings))))
                     
;; A longer list of primitives -- suitable for running everything in 4.3
;; Overrides the list in ch4-mceval.scm
;; Has Not to support Require; various stuff for code in text (including
;;  support for Prime?); integer? and sqrt for exercise code;
;;  eq? for ex. solution

(define primitive-procedures
  (list (list 'car car)
        (list 'cdr cdr)
        (list 'cons cons)
        (list 'null? null?)
        (list 'list list)
	(list 'append append)
        (list 'memq memq)
        (list 'member member)
        (list 'not not)
        (list '+ +)
        (list '- -)
        (list '* *)
        (list '= =)
        (list '> >)
        (list '>= >=)
        (list 'abs abs)
        (list 'remainder remainder)
        (list 'integer? integer?)
        (list 'sqrt sqrt)
        (list 'eq? eq?)
	(list 'equal? equal?)
	(list 'pair? pair?)
;;      more primitives
        ))

;;;Following are commented out so as not to be evaluated when
;;; the file is loaded.
;;(define the-global-environment (setup-environment))
;;(driver-loop)

;; Added at Berkeley:
(define the-global-environment '())

(define (mce)
  (set! the-global-environment (setup-environment))
  (ambeval '(define (require p) (if (not p) (amb)))
	   the-global-environment
	   (lambda (a b) #t)
	   (lambda () #t))
  (driver-loop))